.. _Installation:
Installation
============
MPL is built on MPI. An MPI implementation needs to be installed as a prerequisite, e.g., `Open MPI `__ or `MPICH `__. MPL is a header-only library. Thus, it suffices to download the `source `__ and to copy the ``mpl`` directory, which contains all header files to a folder, where the compiler will find it, e.g., ``/usr/local/include`` on a typical Unix/Linux system.
For convenience and better integration into various IDEs, MPL also comes with CMake support. To install MPL via CMake get the sources and create a new ``build`` folder in the MPL source directory, e.g.,
.. code:: shell
   user@host:~/mpl$ mkdir build
   user@host:~/mpl$ cd build
Then, call the CMake tool to detect all dependencies and to generate the project configuration for your build system or IDE, e.g.,
.. code:: shell
   user@host:~/mpl/build$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ..
The option ``-DCMAKE_INSTALL_PREFIX:PATH`` specifies the installation path.
Usually, CMake will find the required MPI installation as well as the Boost Test library automatically. Depending on the local setup, however, CMake may need some hints to find these dependencies. See the CMake documentation on `FindMPI `__ and `FindBoost `__ for further details.
CMake can also be utilized to install the MPL header files. Just call CMake a second time and specify the ``--install`` option now, e.g.,
.. code:: shell
   user@host:~/mpl/build$ cmake --install .
A set of unit tests and a collection of examples that illustrate the usage of MPL can be complied via CMake, too, if required. To build the MPL unit tests add the option ``-DBUILD_TESTING=ON`` to the initial CMake call. Similarly, ``-DMPL_BUILD_EXAMPLES=ON`` enables building example codes. Thus,
.. code:: shell
   user@host:~/mpl/build$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr/local -DBUILD_TESTING=ON -DMPL_BUILD_EXAMPLES=ON ..
enables both, building unit tests and examples. MPL unit tests utilize the `Boost.Test `__ framework. Furthermore, adding ``-DMPL_BUILD_DOCUMENTATION=ON`` to the set of CMake options during configuration enables building the MPL documentation, which requires `Doxygen `__, `Breathe `__ and `Sphinx `__. Finally, build the unit tests, the example code and/or the documentation via
.. code:: shell
   user@host:~/mpl/build$ cmake --build .
After the unit test have been build successfully, they can be run conveniently by utilizing the CTest tool, i.e., via
.. code:: shell
   user@host:~/mpl/build$ ctest
   Test project /home/user/mpl/build
         Start  1: test_group
    1/30 Test  #1: test_group ...............................   Passed    0.44 sec
         Start  2: test_communicator
    2/30 Test  #2: test_communicator ........................   Passed    0.31 sec
         Start  3: test_cartesian_communicator
    3/30 Test  #3: test_cartesian_communicator ..............   Passed    0.38 sec
         Start  4: test_graph_communicator
    4/30 Test  #4: test_graph_communicator ..................   Passed    0.30 sec
         Start  5: test_dist_graph_communicator
    5/30 Test  #5: test_dist_graph_communicator .............   Passed    0.31 sec
         Start  6: test_communicator_send_recv
    6/30 Test  #6: test_communicator_send_recv ..............   Passed    0.36 sec
         Start  7: test_communicator_isend_irecv
    7/30 Test  #7: test_communicator_isend_irecv ............   Passed    0.30 sec
         Start  8: test_communicator_init_send_init_recv
    8/30 Test  #8: test_communicator_init_send_init_recv ....   Passed    0.34 sec
         Start  9: test_communicator_sendrecv
    9/30 Test  #9: test_communicator_sendrecv ...............   Passed    0.29 sec
         Start 10: test_communicator_probe
   10/30 Test #10: test_communicator_probe ..................   Passed    0.34 sec
         Start 11: test_communicator_mprobe_mrecv
   11/30 Test #11: test_communicator_mprobe_mrecv ...........   Passed    0.38 sec
         Start 12: test_communicator_barrier
   12/30 Test #12: test_communicator_barrier ................   Passed    0.37 sec
         Start 13: test_communicator_bcast
   13/30 Test #13: test_communicator_bcast ..................   Passed    0.30 sec
         Start 14: test_communicator_gather
   14/30 Test #14: test_communicator_gather .................   Passed    0.29 sec
         Start 15: test_communicator_gatherv
   15/30 Test #15: test_communicator_gatherv ................   Passed    0.30 sec
         Start 16: test_communicator_allgather
   16/30 Test #16: test_communicator_allgather ..............   Passed    0.40 sec
         Start 17: test_communicator_allgatherv
   17/30 Test #17: test_communicator_allgatherv .............   Passed    0.31 sec
         Start 18: test_communicator_scatter
   18/30 Test #18: test_communicator_scatter ................   Passed    0.29 sec
         Start 19: test_communicator_scatterv
   19/30 Test #19: test_communicator_scatterv ...............   Passed    0.29 sec
         Start 20: test_communicator_alltoall
   20/30 Test #20: test_communicator_alltoall ...............   Passed    0.29 sec
         Start 21: test_communicator_alltoallv
   21/30 Test #21: test_communicator_alltoallv ..............   Passed    0.36 sec
         Start 22: test_communicator_reduce
   22/30 Test #22: test_communicator_reduce .................   Passed    0.31 sec
         Start 23: test_communicator_allreduce
   23/30 Test #23: test_communicator_allreduce ..............   Passed    0.29 sec
         Start 24: test_communicator_reduce_scatter_block
   24/30 Test #24: test_communicator_reduce_scatter_block ...   Passed    0.34 sec
         Start 25: test_communicator_reduce_scatter
   25/30 Test #25: test_communicator_reduce_scatter .........   Passed    0.38 sec
         Start 26: test_communicator_scan
   26/30 Test #26: test_communicator_scan ...................   Passed    0.32 sec
         Start 27: test_communicator_exscan
   27/30 Test #27: test_communicator_exscan .................   Passed    0.29 sec
         Start 28: test_displacements
   28/30 Test #28: test_displacements .......................   Passed    0.06 sec
         Start 29: test_inter_communicator
   29/30 Test #29: test_inter_communicator ..................   Passed    0.29 sec
         Start 30: test_info
   30/30 Test #30: test_info ................................   Passed    0.29 sec
   100% tests passed, 0 tests failed out of 30
   Total Test time (real) =   9.57 sec
or via your IDE if it features support for CTest.
Alternatively, MPL may be installed via the `Spack `__ package manager. This will install the library headers ony but not compile the unit tests and the examples.