[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Packaging VistA - GT.M directories



Although GT.M is very flexible when it comes to configuration - it is all managed with environment variables - configuring directories one way vs. another can make it easier or harder to manage configurations.  Two points worth noting are:

  1. The GT.M compiler produces .o object code modules from .m source code modules.  Each object code module is specific to a GT.M version (or release - we use the terms interchangeably).  So, the same source code modules can produce different object modules.  Furthermore, GT.M produces different object modules for use in M mode (each character is one byte) and UTF-8 mode (each character is one or more bytes encoded in UTF-8).  Also, while database files can have formats that are compatible across GT.M versions, a database file is can be open only by processes of one GT.M version at one time.
  2. Users expect to have multiple GT.M versions installed and in use on a computer.  For example, one use case is rolling upgrades of GT.M releases.

While GT.M's environment variables accommodate just about any directory structure, for sanity, I recommend a GT.M working directory for each application environment.  Within that working directory is a subdirectory for routines (independent of GT.M release), and a subdirectory for each GT.M release to be used.  For example (the gtm script that comes with GT.M creates this structure by default):

$ tree -dL 1 myApp/
myApp/
├── r
├── V5.4-002B_x86_64
├── V5.5-000_x86
└── V5.5-000_x86_64

4 directories
$

As my laptop is 64-bits, I have separate subdirectories for 32- and 64-bit flavors of the same GT.M release, V5.5-000, so that I can run one or the other.  Routines source modules go in the r subdirectory.

The structure of each release specific directory is:

$ tree -d myApp/V5.5-000_x86
myApp/V5.5-000_x86
├── g
├── o
│   └── utf8
└── r

4 directories
$

The g subdirectory is where database related files go ("g" is "globals" in M parlance).  Object modules compiled in M mode go in the o subdirectory, and object modules compiled in UTF8 mode go in the o/utf8 subdirectory.  There is also an r subdirectory in the release specific subdirectory for routines that depend on a GT.M version.  (Since we try very hard to avoid regressions, the use case is where a routine is enhanced to take advantage of new functionality in a release.

In 32- and 64-bit releases of GT.M, object modules can be simple .o files in the o and o/utf8 subdirectories.  As 64-bit releases of GT.M support placing object modules in shared libraries created with ld (makes memory usage more efficient when there are thousands of processes executing the same routine), you can also create .so files and place them within the o and o/utf8 subdirectories on 64-bit platforms.

Sometimes, when packaging VistA, I have also used p subdirectories to parallel r subdirectories, at the myApp level as well as at the release specific level.  The idea is that routines generated when patching would go in the p subdirectories.

Regards
-- Bhaskar

-- 
GT.M - Rock solid. Lightning fast. Secure. No compromises.
_____________
The information contained in this message is proprietary and/or confidential. If you are not the intended recipient, please: (i) delete the message and all copies; (ii) do not disclose, distribute or use the message in any manner; and (iii) notify the sender immediately. In addition, please be aware that any message addressed to our domain is subject to archiving and review by persons other than the intended recipient. Thank you.

Reply to: