Compiling Your Code§
Download your code§
Use wget or curl to download the source code for the software you want to install to your account. There might be binaries available, but they often won't work on our clusters because they were compiled for other machines with other library versions available. Use tar or unzip or similar depending on archive type to uncompress your source code.
wget https://www.example.com/program.tar.gz
tar -xvf program.tar.gz
You won't be able to use a package manager like yum, you'll need to follow the manual installation instructions for a user-space install (not using sudo).
Set up your modules§
Before you start compiling, you need to make sure you have the right compilers, libraries and other tools available for your software. If you haven't changed anything, you will have the default modules loaded.
Check what the instructions for your software tell you about compiling
it. If the website doesn't say much, the source code will hopefully have
a README
or INSTALL
file.
You may want to use a different compiler - the default is the Intel compiler.
module avail compilers
will show you all the compiler modules
available. Most Open Source software tends to assume you're using GCC
and OpenMPI (if it uses MPI) and is most tested with that combination,
so if it doesn't specify you may want to begin there (do check what the
newest modules available are):
module unload compilers mpi mkl
module load compilers/gnu/4.9.2
module load mpi/openmpi/1.10.1/gnu-4.9.2
Useful resources:
- Modules pt 1 (moodle) (UCL users)
- Modules pt 2 (moodle) (UCL users)
- Modules pt 1 (mediacentral) (non-UCL users)
- Modules pt 2 (mediacentral) (non-UCL users)
Available compilers§
The following compilers are available and supported on our clusters:
- Intel C, C++ and Fortran
- GNU C, C++ and Fortran
We currently have a limited number of licenses for the Intel compilers so only a certain number of users can use them simultaneously. This means that your compilation may fail with an error complaining about not being able to obtain a valid license. If this happens, simply wait for a few minutes and try again.
In addition to the supported tools, there are a number of tools installed on our clusters which are not supported (for example the PGI compilers) which were installed to build certain supported packages. Users who use the unsupported packages do so at their own risk.
Build systems§
Most software will use some kind of build system to manage how files are compiled and linked and in what order. Here are a few common ones.
Automake configure§
Automake will generate the Makefile for you and hopefully pick up sensible options through configuration. You can give it an install prefix to tell it where to install (or you can build it in place and not use make install at all).
./configure --prefix=/home/username/place/you/want/to/install
make
# if it has a test suite, good idea to use it
make test
make install
If it has more configuration flags, you can use ./configure --help
to
view them.
Usually configure will create a config.log: you can look in there to find if any tests have failed or things you think should have been picked up haven't.
CMake§
CMake is another build system. It will have a
CMakeFile or the instructions will ask you to use cmake or ccmake rather
than make. It also generates Makefiles for you. ccmake
is a
terminal-based interactive interface where you can see what variables
are set to and change them, then repeatedly configure until everything
is correct, generate the Makefile and quit. cmake
is the commandline
version. The process tends to go like
this:
ccmake CMakeLists.txt
# press c to configure - will pick up some options
# press t to toggle advanced options
# keep making changes and configuring until no more errors or changes
# press g to generate and exit
make
# if it has a test suite, good idea to use it
make test
make install
If you need to rerun ccmake and reconfigure, remember to delete the
CMakeCache.txt
file, or you'll be wondering why your changes haven't taken.
Turning on verbose Makefiles in ccmake is also useful if your code
didn't compile first time - you'll be able to see what flags the
compiler or linker is actually being given when it fails.
Make§
Your code may just come with a Makefile and have no configure, in which case the generic way to compile it is as follows:
make targetname
There's usually a default target, which make
on its own will use. If
you need to change any configuration options, you'll need to edit those
sections of the Makefile (at the top, where the variables/flags are
defined).
Here are some typical variables you may want to change in a Makefile.
These are what compilers/mpi wrappers to use - these are also defined by
the compiler modules, so you can see what they should be. Intel would be
icc
, icpc
, ifort
, for example. If it's a program that can be compiled
using MPI and only has a variable for CC
, then set that to mpicc
.
CC=gcc
CXX=g++
FC=gfortran
MPICC=mpicc
MPICXX=mpicxx
MPIF90=mpif90
CFLAGS and LDFLAGS are flags for the compiler and linker respectively,
and there might be LIBS or INCLUDE as well. When linking a library with
the name libfoo, use -lfoo
.
CFLAGS="-I/path/to/include"
LDFLAGS="-L/path/to/foo/lib -L/path/to/bar/lib"
LDLIBS="-lfoo -lbar"
Remember to make clean
first if you are recompiling with new options!
BLAS and LAPACK§
BLAS and LAPACK are provided as part of MKL, OpenBLAS or ATLAS. There are several different OpenBLAS and ATLAS modules on Legion for different compilers. MKL is available in the Intel compiler module.
Your code may try to link -lblas -llapack
: this isn't the right way to
use BLAS and LAPACK with MKL or ATLAS (our OpenBLAS now has symlinks
that allow you to do this).
Set your PATH and other environment variables§
After you have installed your software, you'll need to add it to your
PATH
environment variable so you can run it without having to give the
full path to its location.
Put this in your ~/.bashrc
file so it will set this with every new session you
create. Replace username with your username and point to the directory
your binary was built in (frequently program/bin
). This adds it to the
front of your PATH, so if you install a newer version of something, it
will be found before the system one.
export PATH=/home/username/location/of/software/binary:$PATH
If you built a library that you'll go on to compile other software with, you probably want to also add the lib directory to your LD_LIBRARY_PATH and LIBRARY_PATH, and the include directory to CPATH (add export statements as above). This may mean your configure step will pick your library up correctly without any further effort on your part.
To make these changes to your .bashrc take effect in your current session:
source ~/.bashrc
Python§
There are python2/recommended
and python3/recommended
bundles. These
use a virtualenv and have pip set up for you. They both have numpy and
scipy available.
Set compiler module§
The Python versions on Myriad were built with GCC. You can run them with the default Intel compilers loaded because everything depends on the gcc-libs/4.9.2 module. When you are building your own Python packages you should have the GCC compiler module loaded however, to avoid the situation where you build a package with the Intel compiler and then try to run it with GCC, in which case it will be unable to find Intel-specific instructions.
module unload compilers
module load compilers/gnu/4.9.2
If you get an error like this when trying to run something, recheck what compiler you used.
undefined symbol: __intel_sse2_strrchr
Install your own packages in the same virtualenv§
This will use our central virtualenv, which contains a number of packages already installed.
pip install --user <python2pkg>
pip3 install --user <python3pkg>
These will install into .python2local
or .python3local
directories in your home directory, respectively.
To see what is already installed, the Python-shared list shows what is installed for both Python2 and 3, while the Python2 list and Python3 list show what is only installed for one or the other. (There may also be prereqs that aren't listed explicitly - pip will tell you if something is already installed as long as you have the recommended module bundle loaded).
Use your own virtualenvs§
If you need different packages that are not compatible with the central installs, you can create a new virtualenv and only yours will be available.
virtualenv <DIR>
source <DIR>/bin/activate
Your bash prompt will show you that a different virtualenv is active.
Installing via setup.py§
If you need to install using setup.py, you can use the --user
flag and
as long as one of the python bundles is loaded, it will install into the
same .python2local
or .python3local
as pip and you won't need to add
any new paths to your environment.
python setup.py install --user
You can alternatively use --prefix
in which case you will have to set
the install prefix to somewhere in your space, and also set PYTHONPATH
and PATH to include your install location. Some installs won't create
the prefix directory for you, in which case create it first. This is
useful if you want to keep this package entirely separate and only in
your paths on demand.
export PYTHONPATH=/home/username/your/path/lib/python2.7/site-packages:$PYTHONPATH
# if necessary, create install path
mkdir -p home/username/your/path/lib/python2.7/site-packages
python setup.py install --prefix=/home/username/your/path
# add these to your .bashrc or jobscript
export PYTHONPATH=/home/username/your/path/lib/python2.7/site-packages:$PYTHONPATH
export PATH=/home/username/your/path/bin:$PATH
Check that the PATH is where your Python executables were installed, and the PYTHONPATH is correct. It will tend to tell you at install time if you need to change or create the PYTHONPATH directory.
Python script executable paths§
If you have an executable python script giving the location of python like this, and it fails because that python doesn't exist in that location or isn't the one that has the additional packages installed:
#!/usr/bin/python2.7
You should change it so it uses the first python found in your environment.
#!/usr/bin/env python
Perl§
Perl modules will freqently have a Makefile.PL (especially if you download the tar files from CPAN.org yourself). You can install manually as:
perl Makefile.PL PREFIX=/home/username/your/perl/location
make
make install
CPAN§
You can use CPAN to download and install modules locally for you. The
first time you run the cpan
command, it will create a .cpan
directory for you and ask you to give it configuration settings or allow
it to set them automatically.
You need to tell it where you want your install prefix to be.
If it is automatically configured, you need to edit these lines in your
.cpan/CPAN/MyConfig.pm
, for example if you want it to be in a lib
directory in your home (change username to your own username):
'make_install_arg' => q[PREFIX=/home/username/lib],
# other lines in here
'makepl_arg' => q[PREFIX=/home/username/lib],
'mbuild_install_arg' => q[PREFIX=/home/username/lib],
'mbuildpl_arg' => q[--install_base /home/username/lib],
It will download and build modules inside .cpan and install them where you specified.
Set PERL5LIB paths§
If you install your own Perl or Perl modules, you will need to append them to your PERL5LIB:
export PERL5LIB=/home/username/your/perl/location:$PERL5LIB
If you installed with CPAN, you may need to add several paths to this based on the layout it creates inside your nominated Perl directory.
Errors when using non-default Perl versions§
warnings.pm§
If you are using a version of Perl that is not the default system Perl and get strange errors when trying to run a Perl script, particularly ones about warnings.pm:
Search pattern not terminated at /shared/ucl/apps/perl/5.20.0/lib/5.20.0/warnings.pm line 1099
then you need to edit the script so that instead of beginning with
#!/usr/bin/perl
, it begins with #!/usr/bin/env perl
. Otherwise it
will try to use the old system Perl libraries with your newer Perl
executable, which won't work.
libperl.so not found§
You probably built perl without telling it to build the shared library
too. Add -Duseshrplib
to your build flags.
R§
There are instructions on installing and using local R packages in Using your own R packages.
Compiling with MPI§
OpenMPI and Intel MPI are available. Certain programs do not work well with one or the other, so if you are having problems try the other one. Intel MPI is based on MPICH, so if the program you are compiling mentions that, try Intel MPI first.
The Intel MPI is threadsafe; some versions of OpenMPI aren't.
Note that OpenMPI 1.8.4 had a segv bug in non-blocking collectives that is fixed in OpenMPI 1.10.1.
Enabling OpenMP§
To enable OpenMP with the Intel compilers, you simply need to add
-openmp
to your compile line. With the GNU compilers you need to add
-fopenmp
.
Problems§
If you experience problems building your applications, please contact your local IT support in the first instance. We are available at rc-support AT ucl.ac.uk to help you if you still cannot build your app or if you need to report a problem with our software stack.