swmod is a simple tool to manage custom compiled software (in your home directory or a central location). It handles software as "modules" - modules can be loaded, and new software packages can be installed into a module.
Basically, swmod sets environment variables like PATH and LD_LIBRARY_PATH
and can automatically supply options like --prefix to configure scripts.
swmod is currently only works with bash, though it may in the future also
support other sh-compatible shells. There are no plans to support tcsh or
similar, so far.
Installing swmod
Copy the shell script swmod.sh from bin into (e.g.)
and add the following to your .bashrc (resp. .profile):
export PATH="$HOME/.local/bin:$PATH"
. swmod.sh init
You may, of course, use any other directory in your $PATH instead of
$HOME/.local/bin.
Using swmod
Software Module Structure
Any directory structure of the form
MODULE_NAME/`swmod hostspec`/MODULE_VERSION
that looks like a binary software installation (there's a bin or lib
directory or an swmod.deps file, etc.) can be used as an swmod software
module.
The output of the swmod hostspec command (part of swmod) is a system
specific string, e.g. "linux-ubuntu-12.04-x86_64", to support heterogeneous
computing environments. You can override it with the environment variable
$SWMOD_HOSTSPEC.
swmod looks for modules in all directories listed in the (colon-separated)
path $SWMOD_MODPATH. $SWMOD_MODPATH defaults to $HOME/.local/sw/.
So a typical user-installed module might look like this:
$HOME/.local/sw/my-software/linux-ubuntu-12.04-x86_64/4.2
Of course, a module may comprise several individual software packages with the same installation prefix.
Loading Software Modules
Just run
or
# swmod load mysoftware@1.2.3
if you want to load a specific one. Otherwise swmod will try to guess which version is the current one. For numerical versions, it is legal to specify only a part of the version number:
# swmod load mysoftware@1.2
Again, swmod will try to do the right thing.
Important: In shell scripts (like .bashrc) you have to use
instead of
since the swmod alias that is set up by source swmod.sh init does not work
in shell scripts.
Creating Software Modules
swmod compatible software module can be created simply by manually installing (or copying) software packages into a prefix directory with a path of a certain structure (see above). However, swmod also provides several tools to assist with the installation of software packages into a module.
Fist, specify the installation target module and it's version, e.g.:
# swmod target mysoftware@1.2.3
This is the module (here, module "mysoftware", version "1.2.3"), into which you want to install your software. You can specify a new module, or add more software packages to an existing module.
By default, the module will be created under the path $HOME/.local/sw/. You
can override the default installation base path with the environment variable
$SWMOD_INST_BASE.
To make things more comfortable, you can use swmod target -l, e.g.
# swmod target -l mysoftware@1.2.3
as a shortcut for the frequently used combination
# swmod target mysoftware@1.2.3
# swmod load mysoftware@1.2.3
The software package(s) you want to install into your module ("mysoftware", in
this example) may depend on other software to build and to run. You can
permanently add dependencies on other modules to the target module using
swmod add-deps:
# swmod add-deps some_dep@1.0.1 some_other_dep@1.2.0
This way, the correct versions of your dependencies will be automatically loaded when you load your module:
# swmod load mysoftware@1.2.3
Use the -l option to immediately load the added dependencies, e.g.
# swmod add-deps -l some_dep@1.0.1 some_other_dep@1.2.0
This comes in handy when adding dependencies to an already loaded module.
You may also add the special dependency !clflags. If added to a module, the
include and library directories in the module will be added with -I and -L
options to the environment variables SWMOD_CPPFLAGS and SWMOD_LDFLAGS.
swmod configure and similar try to pass these through to the build system of
packages to be configured or installed. Usually, this is not necessary as
modern software uses mechanisms like ...-config or pkg-config ... to get
the necessary compiler and linker options for their dependencies. Where such
a mechanism is not provided, adding the special dependency !clflags can
help.
Now build and install the desired software package(s) into the module. swmod has direct support for the following build systems:
- GNU Autotools (and compatible "configure" scripts)
- CMake
- Phyton setup.py
Installing GNU Autotools Projects
If the software package you want to install uses GNU Autoconf (and possibly
Automake) or provides a compatible "configure" script, run swmod ./configure
instead of ./configure. configure must support the usual options like
--prefix for this to work. Then run make and make install as usual:
# swmod ./configure
# make && make install && echo OK
Afterwards, you should find a directory structure like this (depending on your system and the software package(s) you installed):
$HOME/.local/sw/mysoftware/linux-ubuntu-14.04-x86_64/1.2.3/bin$HOME/.local/sw/mysoftware/linux-ubuntu-14.04-x86_64/1.2.3/lib- ...
You can also use
# swmod path/to/project/dir/configure
for Autoconf/Automake out-of-tree builds (if supported by the project).
Installing CMake Projects
For CMake projects, use swmod cmake instead of cmake, then run make and
make install as usual:
# cd my/build/dir
# swmod cmake path/to/project/dir
# make && make install && echo OK
Installing Python Projects with setup.py
To build and install Python projects based on "setup.py", use
swmod will run python setup.py with the correct --prefix option (and
also create the "site-packages" directory first, if necessary).
Installing Python Packages from PyPI
To download and install Python packages via pip, use
This is equivalent to
PYTHONUSERBASE="${SWMOD_INST_PREFIX}" pip install --user ...
Installing Projects Using Other Build Systems
If the software package you are installing uses SCons or another build system,
you have to pass the installation target directory to the build system
manually. swmod target exports an environment variable SWMOD_INST_PREFIX
that may come in handy.
Module-Specific Init Scripts
If your software module requires special initialization, environment
variables, etc., a create shell script named swmodrc.sh inside
$SWMOD_INST_PREFIX. swmod load will source this script - after loading the
dependencies of the module, but before modifying environment variables
(PATH, ...) for the module itself. Environment variables already modified by
swmodrc.sh are skipped by swmod afterwards, instead of changing them in the
usual fashion.
The variable SWMOD_INST_PREFIX is available from within swmodrc.sh. Also,
the command swmod_load is available from within swmodrc.sh, to manually
load other modules.
For example, if the software in question already provides a script like
bin/env.sh, to set all paths and so on, just create a file swmodrc.sh
containing
. "$SWMOD_PREFIX/bin/env.sh"
inside the $SWMOD_INST_PREFIX directory.