.. _installing:

Installing open62541
====================

Manual installation
-------------------

You can install open62541 using the well known `make install` command.
This allows you to use pre-built libraries and headers for your own project.

To override the default installation directory use ``cmake -DCMAKE_INSTALL_PREFIX=/some/path``.
Based on the SDK Features you selected, as described in :ref:`build_options`, these features will also
be included in the installation. Thus we recommend to enable as many non-experimental features as possible
for the installed binary.

The recommended cmake options for a default installation are:

.. code-block:: bash

   git submodule update --init --recursive
   mkdir build && cd build
   cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DUA_NAMESPACE_ZERO=FULL ..
   make
   sudo make install

This will enable the following features in 0.4:

 * Discovery
 * FullNamespace
 * Methods
 * Subscriptions

The following features are not enabled and can be optionally enabled using the build options as described in :ref:`build_options`:

 * Amalgamation
 * DiscoveryMulticast
 * Encryption
 * Multithreading
 * Subscriptions

.. important::
   We strongly recommend to not use ``UA_ENABLE_AMALGAMATION=ON`` for your installation. This will only generate a single ``open62541.h`` header file instead of the single header files.
   We encourage our users to use the non-amalgamated version to reduce the header size and simplify dependency management.


In your own CMake project you can then include the open62541 library using:

.. code-block:: cmake

   # optionally you can also specify a specific version
   # e.g. find_package(open62541 1.0.0)
   find_package(open62541 REQUIRED COMPONENTS Events FullNamespace)
   add_executable(main main.cpp)
   target_link_libraries(main open62541::open62541)


A full list of enabled features during build time is stored in the CMake Variable ``open62541_COMPONENTS_ALL``


Prebuilt packages
-----------------

Pack branches
^^^^^^^^^^^^^

Github allows you to download a specific branch as .zip package. Just using this .zip package for open62541 will likely fail:

 * CMake uses ``git describe --tags`` to automatically detect the version string. The .zip package does not include any git information
 * Specific options during the build stack require additional git submodules which are not inlined in the .zip

Therefore we provide packaging branches. They have the prefix `pack/` and are automatically updated to match the referenced branch.

Here are some examples:

 * `pack/master.zip <https://github.com/open62541/open62541/archive/pack/master.zip>`_
 * `pack/1.0.zip <https://github.com/open62541/open62541/archive/pack/1.0.zip>`_

These pack branches have inlined submodules and the version string is hardcoded. If you need to build from source but do not want to use git,
use these specific pack versions.

Prebuild binaries
^^^^^^^^^^^^^^^^^

You can always find prebuild binaries for every release on our `Github Release Page <https://github.com/open62541/open62541/releases>`_.


Nightly single file releases for Linux and Windows of the last 50 commits can be found here: https://open62541.org/releases/


OS Specific packages
^^^^^^^^^^^^^^^^^^^^

Debian packages can be found in our official PPA:

 * Daily Builds (based on master branch): https://launchpad.net/~open62541-team/+archive/ubuntu/daily
 * Release Builds (starting with Version 0.4): https://launchpad.net/~open62541-team/+archive/ubuntu/ppa

Install them with:


.. code-block:: bash

    sudo add-apt-repository ppa:open62541-team/ppa
    sudo apt-get update
    sudo apt-get install libopen62541-dev
