# Building Xerus

## Obtaining Xerus

You can get the source-code of the xerus library via git or as an archiv. For example to clone the repository with the latest stable version under linux simply type

git clone https://git.hemio.de/xerus/xerus.git


## Dependencies and Configuration

Xerus depends on several well established libraries, usually pre-installed or available through the standard package managers. In particular lapacke, CXSparse, binutils, boost and their dependencies. Also note that at least version 4.8 of the GCC is required, as this is the first version to offer support for all C++11 functionality used in xerus. Make sure that all these are installed on your system before proceeding.

E.g. to install all dependencies on a fedora system execute

dnf install gcc-c++ openblas-devel suitesparse-devel lapack-devel boost-devel binutils-devel


To build the python bindings you will furthermore need the python development headers, numpy as well as boost-python or boost-python3 depending on the python version you wish to use. E.g. for a fedora system and if you want to use python 2 simply execute

dnf install python2-numpy python-devel


To build the documentation (i.e. this homepage) locally you will need jekyll and doxygen.

After downloading the source it is necessary to set a number of options that are somewhat individual to your system and needs. All following build steps assume that these options are set in the config.mk file. Reasonable default values can be found in the config.mk.default file.

In particular the optimization level is interesting and the paths or standard flags for the required libraries need to be set. This way the xerus library can be compiled with any blas compatible library for the matrix operations. For more details see the description in the config.mk.default file

cp config.mk.default config.mk
nano config.mk


## Ensure Everything Works as Intended

The sources include a number of unit tests that ensure that everything works as intended. To perform them simply input

make test -j4


(where -j4 allows make to use up to 4 threads for the compilation). If all options were set correctly in the config.mk it should compile a test executable and launch it. The output of this executable should then list a number of passed tests and end with something similar to

|
|                       total summary 149 of 149 passed
-------------------------------------------------------------------------------
|
|                       Total time elapsed: 5594.088 ms
-------------------------------------------------------------------------------


Note in particular, that all tests were passed. Should this not be the case please file a bug report with as many details as you can in our issuetracker or write us an email.

## Building the Library

If all tests were passed you can build the library simply by calling make shared or make static depending on whether you want to build shared or static library objects. To build all shared objects as well as the python bindings use make python. After the compilation you should have a build/ directory with a libxerus_misc.a/.so (suffix depending on build type), a libxerus.a/.so and the xerus.so for python in case you also built the python bindings.

You can use these objects directly by setting your environment variables accordingly or you can install the library to a path already included in these variables. To do so simply set the path in config.mk and call (as root if necessary) make install.

## Compiling your own Applications Using Xerus

If xerus is properly installed on your system, compiling your own applications using xerus is as simple as using any other library. Just include -lxerus in your linker call and make sure to use -std=c++11 or -std=c++14 in all compilation units that include xerus.h and everything should work fine.

If you want to use the static version of xerus you also have to include all libraries xerus depends on in your linker call. In particular these are lapacke (-llapacke), lapack (-llapack), blas (-lblas or -lopenblas or similar), suitesparse (-lcholmod -lspqr) and binutils (-lbfd). On some old system one has to manually include the dependencys of binutils (-liberty -lz -ldl).

You can test this by trying to compile one of the examples (here without the installed xerus library)

g++ -std=c++11 doc/_include/examples/qtt.cpp build/libxerus.a build/libxerus_misc.a -llapacke -llapack -lopenblas -lgfortran -lcholmod -lspqr -lbfd -liberty -lz -ldl


or with the shared objects and correctly set environment variables

g++ -std=c++11 doc/_include/examples/qtt.cpp -lxerus


Within python you should be able to simply use

import xerus


if everything is set up correctly.