blob: b2febefbf0c4c5b9d9e8588879fd15044c010cf1 [file] [log] [blame]
#
#==================================================================================
# Copyright (c) 2019 Nokia
# Copyright (c) 2018-2019 AT&T Intellectual Property.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#==================================================================================
#
Building RMR
The RIC Message Router (RMR) is built with CMake, and requires cmake
version 3, make and a modern gcc compiler to be installed on the build
system. Typically, installing the following list of packages in a
container (Ubuntu) is all that is needed to craft a development
environment (containerised builds are also the recommended approach):
gcc git make vim cmake g++ ksh bash
Kshell and vi are needed only if you wish to use the container
interactively. Bash is assumed necessary for CMake.
Build process
To build RMR, the usual CMake steps are followed:
mkdir build
cd build
cmake .. [options]
make package
On a Debian/Ubuntu system, this will create a .deb (provided the
system supports this) in the build directory. It's that simple.
The following flags may be given on the 'cmake' command line (options)
which are outside of "normal" CMake flags and affect the
configuration:
-DBUILD_DOC=1 Man pages generated
-DDEV_PKG=1 Development package configuration
-DIGNORE_LIBDIR Ignore the system preferred library directory and install in /usr/local/lib
-DMAN_PREFIX=<path> Supply a path where man pages are installed (default: /usr/share/man)
-DPACK_EXTERNALS=1 Include external libraries used to build in the run-time package
-DPRESERVE_PTYPE=1 Do not change the processor type when naming deb packages
-DSKIP_EXTERNALS=1 Do not use Nano/NNG submodules when building; use installed packages
(See caution in the 'Libraries' section below)
Packages
The build can be configured to generate either a run-time or
development package. The run-time generation is the default and the
-DDEV_PKG=1 option must be given to generate the development package.
The run-time package contains only the shared library files (*.so),
and the development package contains the headers, man pages (if the
man option is set) and archive (.a) files. Resulting package names
are illustrated in the CI section below.
Continuous Integration Build
Use the Dockerfile in the ci/ subdirectory. This installs all the
required tools, then builds RMR and executes the unit and program
tests. If tests pass, then an image is created in the local registry
with both run-time and development packages.
To support the distribution of package(s) created during the build by
the CI process, a YAML file is left in the /tmp directory
(build_packages.yml) which contains a list of the packages available
from the image. Currently, both .deb and .rpm packages are generated.
The following is a sample YAML file generated during this process:
---
files:
- /tmp/rmr-dev_1.0.34_x86_64.deb
- /tmp/rmr-dev-1.0.34-x86_64.rpm
- /tmp/rmr_1.0.34_x86_64.deb
- /tmp/rmr-1.0.34-x86_64.rpm
...
Alternatives
To build in a non-Linux environment, or to build with an alternate
install path (or both) read on.
Instead of using 'make package' as listed above, using 'make install'
will build and install on the local system. By default, the target
install is into /usr/local which may not be desired. To install into
an alternate path add these two options when the 'cmake ..' command is
given:
-DCMAKE_INSTALL_PREFIX=/path/to/dir
-DMAN_PREFIX=/path/to/dir
The first will cause the make process to install into the named
directory, which can be in your home directory. The second defines
where manual pages are placed (if not defined /usr/share/man is the
target). Manual pages are generally NOT built as the required tool
has yet to be incorporated into the build process and generally is not
available on most systems.
Compiling and Linking User Applications
Should the Rmr and NNG/Nano libraries be installed in a directory
outside of the normal system spots (e.g. not in /usr/local) it might
be necessary to define the specific directory for libraries (.e.g -L)
on the command line, or via environment variables
(e.g.. C_INCLUDE_PATH, LD_LIBRARY_PATH, LIBRARY_PATH). It may also be
necessary to have the library directory defined in the environment at
run time. It is difficult to know what each system needs, but the
following linker options work when libraries are installed in the
system spots:
-lrmr_nng -lnng -lpthread
Adding -L is one way to compensate when libraries are installed in a
different spot (e.g. in $HOME/usr):
-L $HOME/usr -lrmr_nng -lnng -lpthread
Libraries
RMR is designed to support different underlying transport mechanisms,
which might require separate libraries, and thus the library name is
given a suffix that reflects the transport mechanism in use. RMR
supports NNG and SI95 as the underlying transports. Nanomsg support
was dropped starting with version 1.0.45 as Nanomsg has reached end of
life. The package generation and install will produce two RMR
libraries: librmr_nng and librmr_si.
NNG version with a commit ID of 906d5ea1b3d67bece941d8a4e0a049e5f6c65051
is required to build RMR. That version (as yet untagged) adds a
new error state which we must trap. While application environments
are encouraged to also build and install at least this version of
NNG, RMR is still compatable back to the version tagged as 1.1.1.
If you opt to build with the -DSKIP_EXTERNALS=1 flag set, you must
ensure that this version of NNG is present in your build environment.
If you do not set this flag, the proper NNG source will be used
automatically.
Regardless of transport mechanism supported by an RMR library, the RMR
API will be identical, thus it is possible for an application to shift
mechanisms simply by referencing a different library (should multiple
RMR libraries become available).
Manual Pages
By default the deb created does not include the manual pages. To
enable their creation, and subsequent inclusion in the deb, add the
following option to the cmake command:
-DBUILD_DOC=1
This will cause the {X}fm text formatting package to be fetched
(github) and built at cmake time (must exist before building) and will
trigger the generation of the man pages in both postscript and troff
format. The troff pages are placed into the deb and the postscript
pages are left in the build directory for the developer to convert to
PDF, or otherwise use.
Debug Mode
Because RMR is designed to keep its overhead to an absolute minimum,
messages written to standard error are by default very limited. The
route table collection thread provides the means to enable debug
messages on the fly, but only because that thread does not impact the
sending and receiving of user messages.
If it becomes necessary, for development or problem soving, to have
the RMR functions generate debugging messages the following
CMake flag can be given when the CMake environment is created:
-DDEBUG=n
The value for 'n' should be 1 or 2 to enable debugging. The default
when not given is the same as setting n to zero.
When running in debug mode, RMR will log messages received, sent, and
other useful information. Because debugging uses fprintf() there is a
significant amount of overhead with logging this information and thus
in debugging mode the user should not expect that usual message rates
can be achieved, and in some cases may cause messages to drop if TCP
queues become full.