# Compiling

## Install build dependencies

### SL6/CentOS7

    sudo yum install openssl-devel libxml2-devel gsoap-devel \
                     doxygen cmake abi-compliance-checker

### Ubuntu

    sudo apt-get install abi-compliance-checker cmake debhelper doxygen \
                         gsoap libgridsite-dev libssl-dev libxml2-dev pkg-config

## How to build

Here is how to do a simple build of davix - have a look at the next section if you need to tweak some configuration option in cmake.

    git clone https://github.com/cern-fts/davix.git
    cd davix
    git submodule update --recursive --init
    mkdir build && cd build
    cmake ..
    make

## Build options

### Unit tests

You can run the tests with `make test`.

### Functional tests

Running functional tests requires authentication credentials, so they are not enabled by default. As a first step, add `-DFUNCTIONAL_TESTS=TRUE` to cmake.

You will see that davix no longer compiles - it expects to find the file `credentials/creds.cmake`. This is the file which orchestrates which functional tests are run. Here is an example - this is the file which runs our nightly build functional tests. Passwords were removed for obvious reasons.

    ### tests using a proxy
    test_with_proxy("davs://dpmhead-rc.cern.ch/dpm/cern.ch/home/dteam/davix-tests")
    test_with_proxy("davs://prometheus.desy.de/VOs/dteam/davix-tests")

    ### AWS S3
    set(accesskey xxx)
    set(secretkey xxx)
    set(url https://some-bucket.s3.amazonaws.com/davix-tests)
    set(alt https://s3-ap-southeast-2.amazonaws.com/some-bucket/davix-tests)
    set(region ap-southeast-2)

    # test v2
    test_s3(${accesskey} ${secretkey} ${url} "" noalt)
    test_s3(${accesskey} ${secretkey} ${alt} "" alt)

    # test v4
    test_s3(${accesskey} ${secretkey} ${url} ${region} noalt)
    test_s3(${accesskey} ${secretkey} ${alt} ${region} alt)

    ### CERN ceph
    set(accesskey xxx)
    set(secretkey xxx)
    set(url s3s://some-bucket.cs3.cern.ch/davix-tests)

    test_s3(${accesskey} ${secretkey} ${url} "" noalt)

    ### Azure
    set(azurekey xxx)
    set(url https://some-user.blob.core.windows.net/some-bucket/davix-tests)

    test_azure(${azurekey} ${url})

Since this file contains sensitive information, access to it should be restricted and it should never be committed to the source repository.

The `test_with_proxy` function uses the default grid-style proxy, `/tmp/x509_u$uid`. It should be generated beforehand.

To run the tests automatically, use the script under `test/run-tests.sh`. This script further expects the existence of `credentials/obtain-proxy.sh`, which is run to generate a proxy without any user intervention. Here is an example:

    #!/usr/bin/env bash
    echo "certificate_password_goes_here" | voms-proxy-init --cert $PWD/credentials/cert.p12 -pwstdin --voms dteam

Using `test/run-tests.sh`, you can run automatic functional tests in jenkins, for example.

## Generating the documentation

We use doxygen for the API documentation and sphinx for this how-to guide. Run `make doc` to generate both.