C2SM Guidelines for Spack
+Spack enables users to install software in a very user-friendly way, +for example by allowing different versions or specifications +of the same package to be installed simultaneously, or installing +without having to “manually” download the source code. This comes at +the expense of potentially losing control over the exact +version/specification being installed. For this reason, C2SM has +the following guidelines for building, running and installing your +libraries and executables.
+Building
+There are two possible ways of building software with Spack:
+spack install
and spack dev-build
.
+Both are good, but have some special features that need to be taken into account.
Option 1: spack install
+Every spack install
command needs a version suffix,
+i.e. spack install <package>@<version-suffix>
+This version-suffix can have different meanings:
-
+
branch in the git repository
+one out of several git repositories defined in the package
+a specifc version (git-tag) with a corresponding git-hash hardcoded in the package
+
Only for the last item in the list above you will always fetch and
+compile the same code. The two other items can lead to different
+codes in case the HEAD
of this specific branch/repository has received some
+additional commits in the meantime.
Especially for production it is very important to know which version of a code is actually used.
+For example, there is a variety of different version suffixes for the cosmo
package:
git = 'git@github.com:COSMO-ORG/cosmo.git'
+apngit = 'git@github.com:MeteoSwiss-APN/cosmo.git'
+c2smgit = 'git@github.com:C2SM-RCM/cosmo.git'
+
+version('org-master', branch='master', get_full_repo=True)
+version('apn-mch', git=apngit, branch='mch', get_full_repo=True)
+version('c2sm-master', git=c2smgit, branch='master', get_full_repo=True)
+version('c2sm-features', git=c2smgit, branch='c2sm-features', get_full_repo=True)
+version(5.09, git=c2sm, tag=5.09, get_full_repo=True)
+
Here, there are three different git repositories available for the cosmo
package:
-
+
COSMO-ORG/cosmo.git: version-suffix
org-master
+MeteoSwiss-APN/cosmo.git: version-suffix
apn-mch
+C2SM-RCM/cosmo.git: version-suffix
c2sm-master
+C2SM-RCM/cosmo.git: version-suffix
c2sm-features
+
It is clear that only using spack install <package>@5.09
will
+always result in the same code, all other version only point to a
+HEAD
of a git branch.
The list of versions, including tagged versions, is provided by spack
+info <package_name>
.
Attention
+Always use a valid git tag as a version-suffix when building
+software with spack install
for production!
Option 2: spack dev-build
+In order to install software with spack dev-build
, one needs a
+local source code. Spack will then compile the code as it is locally
+present. Contrary to spack install
, the version suffix
+(@master
, @v2.7.9
, etc.) does not have any effect on the code version compiled,
+since Spack will always use the local source.
Nonetheless, it is important to use the correct version suffix, i.e. c2sm-master
+for all your COSMO versions that build on top of the c2sm-master
branch.
+The same applies to c2sm-features
etc.
+The reason for this is that there are some patches Spack applies based on the version suffix.
+Using the wrong version suffix may break your code.
Attention
+You may run into a conflict if you try to install the same spec using dev-build
.
+Spack will tell you that this particular spec is already installed.
Tip
+To circumvent the above conflict, you can keep your executable alive in your source folder,
+but omit the installation phase using spack dev-build --until build <your_spec>
.
Running
+When used properly, Spack is able to manage many different +configurations of a package along with the corresponding +run environment.
+Load run environment of a package
+Spack provides the command spack load
to load an installation into your environment.
+This could either be a Python installation or required variables that
+a specific binary needs to run correctly. There are two different ways of using it
+(both of them are fine), which are presented here.
+For more information consider reading the
+official Spack docs.
$ spack load <package>@<version>%<compiler> +<variants>
+
The executable now has the correct environment to run in your current shell.
+The other possibility is use spack load
to print the required
+shell commands and store them in a file that can be sourced at a later
+stage:
$ spack load --sh <package>@<version>%<compiler> +<variants> > run_package.env
+
An example output of spack load --sh
for COSMO could look as follows:
export LIBRARY_PATH=/opt/cray/pe/mpt/7.7.15/gni/mpich-pgi/20.1/lib:/project/s903/juckerj/spack-install/daint/eccodes/2.19.0/pgi/ccigv3uvkdl5h3d2jtb6blxvvv4qsdpc/lib64:/apps/daint/UES/xalt/xalt2/software/xalt/2.8.10/lib64:/apps/daint/UES/xalt/xalt2/software/xalt/2.8.10/lib;
+export LD_LIBRARY_PATH=/opt/cray/pe/mpt/7.7.15/gni/mpich-pgi/20.1/lib:/project/s903/juckerj/spack-install/daint/eccodes/2.19.0/pgi/ccigv3uvkdl5h3d2jtb6blxvvv4qsdpc/lib64:/opt/cray/pe/gcc-libs:/apps/daint/UES/xalt/xalt2/software/xalt/2.8.10/lib64:/apps/daint/UES/xalt/xalt2/software/xalt/2.8.10/lib:/opt/cray/pe/papi/6.0.0.4/lib64:/opt/cray/job/2.2.4-7.0.2.1_2.86__g36b56f4.ari/lib64;
+export GRIB_SAMPLES_PATH=/project/s903/juckerj/spack-install/daint/cosmo-eccodes-definitions/2.19.0.5/pgi/egf6fp466u2cl3ckkmhpemzf4hz7loqr/cosmoDefinitions/samples;
+export GRIB_DEFINITION_PATH=/project/s903/juckerj/spack-install/daint/cosmo-eccodes-definitions/2.19.0.5/pgi/egf6fp466u2cl3ckkmhpemzf4hz7loqr/cosmoDefinitions/definitions/:/project/s903/juckerj/spack-install/daint/eccodes/2.19.0/pgi/ccigv3uvkdl5h3d2jtb6blxvvv4qsdpc/share/eccodes/definitions;
+
Tip
+Always load the run environment provided by Spack prior to any +executions of an executable installed by Spack!
+Spack in scripts
+The Spack commands are rather tailored for interacive use. For example,
+it is very possible for commands such as spack find
or spack
+location
to complain about multiple potential installed SPECS
satisfying
+the command line input. For this reason, it is advisable to
+avoid spack commands in scripts. However, for spack find
and
+spack location
, this should not be aproblem. For spack load
, we rather
+recommend to use it from the login nodes before submitting jobs, inheriting
+the environment of the running job from the environment at submission time.