The Modules Package Version 3.2 4 July 1999 (updated Mar 8 2002) (updated Dec 15 2005) INSTALL guide R.K. Owen, Ph.D. KooZ Software rk@owen.sj.ca.us 1. Introduction _______________ Environment modules provides a great way to easily customize your shell environment, especially on the fly. However, initial set-up of your system with environment modules can be somewhat difficult. This guide will hopefully help you through some of these problems since I've done this for a number of systems. I've created several scripts and module files to help things along. Be sure to read the README, because it gives very detailed information regarding the configure options. Look at INSTALL.RH7x for an updated example on setting up modules on a RedHat 7x system. It also contains a minimal way to set up modules for all the users by modifying only the system rc files (as listed below in section 2.3). 1.1 Theory of Modules _____________________ The Modules environment is a program that can read & list modulefiles returning commands, suitable for the shell to interpret, and most importantly to ``eval''. In Unix a child process can not modify its parent environment. How does Modules do this then? Modules parses the given module file and produces the appropriate shell commands to set/unset/append/un-append onto an environment variable. These commands are eval'd by the shell. Every shell provides some mechanism where commands can be executed and the resulting output can, in turn, be executed as shell commands. In the C-shell & Bourne shell and derivatives this is ``eval''. This is the only way for a child process to modify the parent's (login shell) environment. Hence the module command itself is a shell alias or function that performs these operations. To the user, it looks just like any other command. 2. First Time Installation __________________________ It's somewhat difficult to set-up the modules environment for the first time on a platform. After having done this a few times it can be reduced to a few essential steps. However, it's advised that only an adequately prepared system administer should attempt this. (See INSTALL.RH7x for a simpler approach.) 2.1 What's Needed Initially ___________________________ The first thing to do is just run './configure' without any arguments and see how far it gets. The main stumbling block is usually the TCL installation. Watch carefully which version of TCL is autoconfigured, as well as the other default paths. If they are what you expected, congratulations! Chances are, you'll want to rerun './configure' again with the proper path to the destination installation as well as the path to the modulefiles themselves, but first just see if the other ingredients are ok. If rerunning "./configure" doesn't fix a problem, try deleting the "config.cache" first. 2.1.1 TCL (Tool Command Language) You need Tcl8.x installed on your system. Sources and precompiled binary distributions can be downloaded from http://www.scriptics.com. Build Tcl using a directory structure anticipating a modules environment, for example, in the TCL src directory, ./configure --prefix=/usr/local/pkg/tcltk/8.x.y" If the executable 'tclsh' is on your path, all information regarding how it was installed should be automatically configured for you using the modules configure script. If the configure script doesn't do the right thing, you will need to set --with-tcl pointing it at the directory with the tclConfig.sh script, which contains several environment variables detailing where the header and library files can be found. However, if there is no tclConfig.sh, or it does not define TCL_VERSION, TCL_LIB_SPEC, or TCL_INCLUDE_SPEC, then use --with-tcl-version, --with-tcl-lib, or --with-tcl-inc respectively to give the Tcl version (X.Y format), the libtcl directory, or the C header include directory where tclDecls.h, etc. can be found. 2.1.2 A location for the "modulefile" Files Decide where you will place your local module files and the root for the module package. It should be a file system separate from your system root, else it may get wiped out with every OS upgrade. The default is /usr/local/Modules/modulefiles/. You will use the --with-module-path=option to the configure script to set this directory. The default is $prefix/Modules/modulefiles, where $prefix is set by the the --prefix configure option. (The default is /usr/local.) After the initial hardwork of getting the module command working, all of your future effort will be in maintaining the modulefiles themselves. Put the module version files in /usr/local/Modules/versions/. This directory is only visible if the "modules" modulefile is loaded, and is only intended for switching between differing module command versions. 2.1.3 A location for the "module" executables and init scripts. The root for a particular version of modules should have an indicative name, such as /usr/local/Modules/3.1.6/. Once the installation is done, put a symbolic link in the /usr/local/Modules directory named default pointing to the version (e.g. "cd /usr/local/Modules; ln -s 3.1.6 default"). The default path to the installation directory is /usr/local. It is NOT recommended to keep this default! 2.2 Building and Installing Modules ___________________________________ First - I recommend placing the sources into /usr/local/Modules/src/ either from the tar file or CVS. If you plan on installing everything in the standard places, and you have TCL and X installed in the standard places, then just run ./configure make make install and you are done if it all runs successfully. If you want to specify where the module files are located, AND/OR you want to install the binaries/man pages elsewhere (you probably do, since that is what modules is good for!), then the two relevant options you must specify for configure are --with-module-path and --prefix, for example ./configure --with-module-path=/your/path/to/module/files \ --prefix=/alternate/usr/local/or/equivalent/1.0/eg The default for --prefix is /usr/local ($prefix). The default for --with-module-path is "$prefix/Modules/modulefiles". If you have trouble with the configuration, then consider Run "./configure --help" to view some of the other options. After the sources are configured then: make As a sanity check, try running the 'modulecmd' binary with just a shell name as the only option: ./modulecmd sh You should get the usage instructions. If you get an error message of the form: init.c(425):ERROR:159: Cannot initialize TCL Then your TCL installation is probably corrupted. This usually means the internally compiled path to the "init.tcl" script does not match with reality. You can try getting around this by setting the TCLLIBPATH environment variable to point to the right directory (/usr/local/tcl* or /usr/share/tcl* in some cases), but you are probably better off reinstalling TCL correctly. If you are successful with the sanity check, then go ahead and install the binaries. make install However, if you want further assurances then run the full test suite (see 2.2.1 below) Each successive step depends on successfully completing the previous steps. However, don't expect everything to work once it's installed, because the system rc files and the user rc `dot' files need to be modified to use modules. Make sure you have a "default" symbolic link in /usr/local/Modules to point to some version, since the system rc files will refer to it. 2.2.1 Running the test suite If you are a developer or overly paranoid, you can run the test suite, of over 500 tests, to make sure that a minimal set of functionality is working. You must have 'dejagnu' installed before you run configure. To run the tests, do make check If you find some errors and you wish to get more information, run the test again as follows make check RUNTESTFLAGS=--verbose Using TCL version 8.3, all the tests should pass. TCL Version 8.0 causes a 7 failures, however these are not serious and are due to the interaction of the test harness with the module command, and will not be a problem (the problem is the way that stdout/stderr are handled). 2.3 Setting Up the Shell RC Files _________________________________ Here's a quick tutorial on Shell rc (run-command) files. When a user logs in and if they have /bin/csh(/bin/sh) as their shell, the first rc fire to be parsed by the shell is /etc/csh.login & /etc/csh.cshrc (/etc/profile) (the order is implementation dependent), and then the user's $HOME/.cshrc ($HOME/.kshenv) and finally $HOME/.login ($HOME/.profile). All the other login shells are based on /bin/csh and /bin/sh with additional features and rc files. Certain environment variables and aliases (functions) need to be set for Modules to work correctly. This is handled by the Module init files in /usr/local/Modules/default/init, which contains separate init files for each of the various supported shells, where default is a symbolic link to a module command version. 2.3.1 Global Shell RC Files ___________________________ Since Modules sets & appends to several environment variables it's a good idea to set them up with the default system values, else the compilers, loaders, man pages, etc. may not find the default system paths if not listed in the appropriate environment variables. Look in ./etc/global for example rc files (csh.login, profile) that defines most of the variables you'll likely need. (These files are not yet tailored to each different platform. The current ones are targeted at GNU/Linux systems.) None of the environment variables are needed directly for a correct Modules environment. The Modules specific commands are located in ./etc/global and are named ``csh.modules'' and ``profile.modules''. These files should be copied to /etc [or where ever you specified with the --with-etc-path= option to the configure script]. These files will be source'd from the users' .login and .profile . Edit these files if you want certain modules to be automatically loaded by every user. Currently, it loads only ``null'' which does absolutely nothing. 2.3.2 Skeleton Shell RC (``Dot'') Files _______________________________________ You have these, I presume? If you don't now is the time to set them up. The skeleton files provide a ``default'' environment when new users are added to your system. The files are usually placed in /etc/skel [or where ever you specified with the --with-skel-path= option to the configure script], and contains a minimal set of ``dot'' files and directories that every new user should start with. The skeleton files are copied to the new user's $HOME directory with the ``-m'' option to the ``useradd'' command. A set of example ``dot'' files are located in ./etc/skel . Copy everything but the .*.in and CVS files and directories to the skeleton directory. Edit and tailor for your own system. If you have a pre-existing set of skeleton files, then make sure the following minimum set exists: .cshrc, .login, .kshenv, .profile . They can be automatically updated with: env HOME=/etc/skel /usr/local/Modules/default/bin/add.modules and hit return. Inspect the new ``dot'' files and if OK, then remove all the .*.old (original) files. An alternative way of setting-up the users' dot files can be found in ./ext. This model can be used with the --with-dot-ext configure option. 2.3.3 User Shell RC (``Dot'') Files ___________________________________ The final step for a functioning Modules environment is to modify the user ``dot'' files to source the right files. One way to do this is to put a message in the /etc/motd telling each user to run the command: /usr/local/Modules/default/bin/add.modules which is a sophisticated script that parses their existing ``dot'' files pre-pending the appropriate commands to initialize the Modules environment. The user can re-run this script and it will find and remember what modules they have initially loaded, strip out the previous module initialization and restore it with an upgraded one. If the user lacks a necessary ``dot'' file, the script will copy one over from the skeleton directory. The user will have to logout and login for it to come into effect. Another way is for the system administrator to "su - username" to each user and run it interactively. The process can be semi-automated with a single line command that obviates the need for direct interaction: su - username -c "yes | /usr/local/Modules/default/bin/add.modules" Power users can create a script to directly parse the /etc/passwd file to perform this command. For the rest of us, just copy the passwd file and edit it appropriately to execute this command for each valid user. 2.4 Module Files ________________ Once the above steps have been performed, then it's important to have module files in each of the modulefile directories. The install will place the following module files (for example): ------------------- /usr/local/Modules/3.0.9-rko/modulefiles ------------------- dot module-info modules null use.own If you don't have your own module files in /usr/local/Modules/modulefiles then copy ``null'' to that directory. On some systems an empty modulefile directory will cause a core dump, on other systems no problem. Use /usr/local/Modules/default/modulefiles/modules as a template for creating your own module files. For more information do module load modules and then you have ready access to the module(1) modulefile(4) man pages, as well as the versions directory. Study the man pages carefully. The version directory may look something like this: ------------------------- /usr/local/Modules/versions --------------------------3.0.5-rko 3.0.6-rko 3.0.7-rko 3.0.8-rko 3.0.9-rko The model you should use for modulefiles is ``name/version''. For example my /usr/local/Modules/modulefiles directory has a directory named ``netscape'' which contains the following module files: 301, 405c, 451c, etc. When it's displayed with ``module avail'' it looks something like this: netscape/301 netscape/405c netscape/451c(default) netscape/45c netscape/46 The default is established with .version file in the netscape directory and it looks something like this: #%Module1.0########################################################### ## ## version file for Netscape ## set ModulesVersion "451c" If the user does ``module load netscape'', then the default netscape/451c will be used. The default can be instantly changed by editing the .version file to point to a different module file in that directory. If no .version file exists then Modules will just assume the last module in the alphabetical ordered directory listing as the default. 3. Package Location Suggestions _______________________________ To make Modules a useful tool in your environment, it's a good idea to use some discipline and may require some work in placing binaries and man pages in suitable locations. It's a way to stop using /usr/local/bin as a catch-all dump for every miscellaneous binary, especially the ones that don't get used too often. There are some scripts to help this along. For this discussion I will use the mythical ``foobar'' package. I've down-loaded the sources in a form of a gzip'd tar file - foobar-1.2.3.tar.gz . Most sources can be placed anywhere, and in most cases will configure and build without any problems. For this example I will do everything from /tmp. I unload the sources with ``tar -xzf foobar-1.2.3.tar.gz'' which creates a directory in the current working directory (/tmp) named ./foobar-1.2.3 . Cd to this directory and run the configure script ./configure --prefix=/usr/local/pkg/foobar/1.2.3 and it should configure the sources to place all necessary files to that location. Continue the build, typically with: make make check make install The binaries, libraries, man pages, and info pages are now placed in /usr/local/pkg/foobar/1.2.3 . If you need to create the ``root'' yourself, then load the ``modules'' module with ``module load modules''. Use the ``mkroot -m'' script to create a collection of ./bin, ./etc, ./lib, ./man/ directories. Install the items as needed, then use ``mkroot -c'' to clean out the empty directories. Finally, after installing the binaries, etc. then create a module file using another module file as a template and place it somewhere in the modulefile hierarchy. Also be sure to keep your original sources somewhere. If you had no problems just copy the original gzip'd tar file to, say, /usr/src. If your module file is new and somewhat involved, then it's a good idea to do "module load use.own" to create your own private modules directory off your $HOME directory. It's a good place to test module files, or to keep your own private collection of module files. The following is an example of the module configuration for rk@owen.sj.ca.us "module avail" ------------------------- /usr/local/Modules/versions -------------------------- 3.0.5-rko 3.0.6-rko 3.0.7-rko 3.0.8-rko 3.0.9-rko ------------------- /usr/local/Modules/3.0.8-rko/modulefiles ------------------- dot module-info modules null use.own ------------------------ /usr/local/Modules/modulefiles ------------------------ F/970328 gif2png/2.0.1(default) perl5/005static RKO gnuplot/3.7 pgp/pgp-5.0 X/bohr http postgres/6.5.1 X/console java/1.1.6v5(default) postgres/7.0(default) X/dark java/1.2.2RC4 python/1.5.2c X/dirac jpeg/6b samba/1.9.18p2 X/light l2h sfw X/owen lesstif slatec/4.1 X/xfig libpng/1.0.5 sniff acrobat/3.0.2 linklint/2.1 staroffice/5.1 acrobat/4.0 netcdf tcltk/8.0.5(default) apache/1.3.12(default) netscape/6.0.0pr1 tcltk/8.2.3 apache/1.3.9 new tex/te applix/4.4.2(default) nntp texinfo/3.12 applix/shelf/2.0 ntp/3-5.92 vastf90/3.4N5 aux ntp/3-5.93e vmware/2.0 cxref/1.4b openssl/0.9.5 workman cxref/1.5b oracle/8i xgks dejagnu/1.3 pbm/1mar94p1 xpdf/0.90 gcc/2.95.2 perl5/004 gettext/0.10.35 perl5/005(default) -------------------------- /u/owen/rk/privatemodules --------------------------- dump htm4.old m4html yyy/xxx/test/2.0 htm4 librko umask htm4.new librko.xxx yyy/xxx/test/1.0 The module list I use for compiling modules (plus some additional things) from "module list" Currently Loaded Modulefiles: 1) applix/4.4.2 3) gcc/2.95.2 5) tcltk/8.2.3 2) null 4) dejagnu/1.3 6) use.own 4. Upgrading Module Commands ____________________________ The theory is that Modules should use a similar package/version locality as the package environments it helps define. Switching between versions of the module command should be as easy as switching between different packages via the module command. Suppose there is a change from 3.0.5-rko to version 3.0.6-rko. The goal is to semi-automate the changes to the user ``dot'' files, such that the the user can be oblivious to the change. The first step is to install the new module command & files to /usr/local/Modules/3.0.6-rko/. Test it out by loading with "module load modules 3.0.6-rko". You may get an error like: 3.0.6-rko(25):ERROR:152: Module 'modules' is currently not loaded This is OK and will likely go away with future versions. Make sure you have the new version with "module --version". If it seems stable enough for yourself, then advertise it to your adventureous users. Once you are satisfied that it appears to work adequately well, then go into /usr/local/Modules remove the old "default" symbolic link to the new versions. For example: cd /usr/local/Modules rm default; ln -s 3.0.6-rko default This new version is now the default, and will be referenced by all the users that log in and those that haven't loaded a specific module command version.