blob: b2febefbf0c4c5b9d9e8588879fd15044c010cf1 [file] [log] [blame]
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -04001#
2#==================================================================================
E. Scott Daniels29d87162019-06-12 13:48:25 -04003# Copyright (c) 2019 Nokia
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -04004# Copyright (c) 2018-2019 AT&T Intellectual Property.
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#==================================================================================
18#
19
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040020Building RMR
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040021
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040022The RIC Message Router (RMR) is built with CMake, and requires cmake
23version 3, make and a modern gcc compiler to be installed on the build
24system. Typically, installing the following list of packages in a
25container (Ubuntu) is all that is needed to craft a development
26environment (containerised builds are also the recommended approach):
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040027
28 gcc git make vim cmake g++ ksh bash
29
30Kshell and vi are needed only if you wish to use the container
31interactively. Bash is assumed necessary for CMake.
32
33
34Build process
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040035To build RMR, the usual CMake steps are followed:
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040036 mkdir build
37 cd build
38 cmake .. [options]
39 make package
40
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040041
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040042On a Debian/Ubuntu system, this will create a .deb (provided the
43system supports this) in the build directory. It's that simple.
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040044
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040045The following flags may be given on the 'cmake' command line (options)
46which are outside of "normal" CMake flags and affect the
47configuration:
E. Scott Daniels29cb1002019-06-20 08:23:11 -040048
49 -DBUILD_DOC=1 Man pages generated
50 -DDEV_PKG=1 Development package configuration
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040051 -DIGNORE_LIBDIR Ignore the system preferred library directory and install in /usr/local/lib
E. Scott Daniels29cb1002019-06-20 08:23:11 -040052 -DMAN_PREFIX=<path> Supply a path where man pages are installed (default: /usr/share/man)
53 -DPACK_EXTERNALS=1 Include external libraries used to build in the run-time package
54 -DPRESERVE_PTYPE=1 Do not change the processor type when naming deb packages
E. Scott Daniels54098f62019-08-06 16:24:20 -040055 -DSKIP_EXTERNALS=1 Do not use Nano/NNG submodules when building; use installed packages
E. Scott Daniels5b8070a2019-09-25 13:02:30 -040056 (See caution in the 'Libraries' section below)
E. Scott Daniels29cb1002019-06-20 08:23:11 -040057
58
59Packages
E. Scott Daniels29cb1002019-06-20 08:23:11 -040060
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040061The build can be configured to generate either a run-time or
62development package. The run-time generation is the default and the
63-DDEV_PKG=1 option must be given to generate the development package.
64The run-time package contains only the shared library files (*.so),
65and the development package contains the headers, man pages (if the
66man option is set) and archive (.a) files. Resulting package names
67are illustrated in the CI section below.
E. Scott Daniels29cb1002019-06-20 08:23:11 -040068
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040069Continuous Integration Build
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -040070
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040071Use the Dockerfile in the ci/ subdirectory. This installs all the
72required tools, then builds RMR and executes the unit and program
73tests. If tests pass, then an image is created in the local registry
74with both run-time and development packages.
75
76To support the distribution of package(s) created during the build by
77the CI process, a YAML file is left in the /tmp directory
78(build_packages.yml) which contains a list of the packages available
79from the image. Currently, both .deb and .rpm packages are generated.
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040080
81The following is a sample YAML file generated during this process:
82
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040083 ---
E. Scott Danielsf6f4f122019-06-18 16:02:17 -040084 files:
85 - /tmp/rmr-dev_1.0.34_x86_64.deb
86 - /tmp/rmr-dev-1.0.34-x86_64.rpm
87 - /tmp/rmr_1.0.34_x86_64.deb
88 - /tmp/rmr-1.0.34-x86_64.rpm
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040089 ...
90
E. Scott Daniels29d87162019-06-12 13:48:25 -040091
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040092
93Alternatives
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040094
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -040095To build in a non-Linux environment, or to build with an alternate
96install path (or both) read on.
97
98Instead of using 'make package' as listed above, using 'make install'
99will build and install on the local system. By default, the target
100install is into /usr/local which may not be desired. To install into
101an alternate path add these two options when the 'cmake ..' command is
102given:
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400103
104 -DCMAKE_INSTALL_PREFIX=/path/to/dir
105 -DMAN_PREFIX=/path/to/dir
106
107
108The first will cause the make process to install into the named
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400109directory, which can be in your home directory. The second defines
110where manual pages are placed (if not defined /usr/share/man is the
111target). Manual pages are generally NOT built as the required tool
112has yet to be incorporated into the build process and generally is not
113available on most systems.
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400114
115
E. Scott Daniels29d87162019-06-12 13:48:25 -0400116Compiling and Linking User Applications
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400117
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400118Should the Rmr and NNG/Nano libraries be installed in a directory
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400119outside of the normal system spots (e.g. not in /usr/local) it might
120be necessary to define the specific directory for libraries (.e.g -L)
121on the command line, or via environment variables
122(e.g.. C_INCLUDE_PATH, LD_LIBRARY_PATH, LIBRARY_PATH). It may also be
123necessary to have the library directory defined in the environment at
124run time. It is difficult to know what each system needs, but the
125following linker options work when libraries are installed in the
126system spots:
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400127
128 -lrmr_nng -lnng -lpthread
129
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400130Adding -L is one way to compensate when libraries are installed in a
131different spot (e.g. in $HOME/usr):
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400132
133 -L $HOME/usr -lrmr_nng -lnng -lpthread
134
135
136Libraries
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400137
138RMR is designed to support different underlying transport mechanisms,
139which might require separate libraries, and thus the library name is
140given a suffix that reflects the transport mechanism in use. RMR
141supports NNG and SI95 as the underlying transports. Nanomsg support
142was dropped starting with version 1.0.45 as Nanomsg has reached end of
143life. The package generation and install will produce two RMR
144libraries: librmr_nng and librmr_si.
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400145
E. Scott Daniels5b8070a2019-09-25 13:02:30 -0400146NNG version with a commit ID of 906d5ea1b3d67bece941d8a4e0a049e5f6c65051
147is required to build RMR. That version (as yet untagged) adds a
148new error state which we must trap. While application environments
149are encouraged to also build and install at least this version of
150NNG, RMR is still compatable back to the version tagged as 1.1.1.
151If you opt to build with the -DSKIP_EXTERNALS=1 flag set, you must
152ensure that this version of NNG is present in your build environment.
153If you do not set this flag, the proper NNG source will be used
154automatically.
155
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400156Regardless of transport mechanism supported by an RMR library, the RMR
157API will be identical, thus it is possible for an application to shift
158mechanisms simply by referencing a different library (should multiple
159RMR libraries become available).
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400160
E. Scott Daniels15390d72019-05-06 20:19:59 +0000161Manual Pages
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400162
E. Scott Daniels15390d72019-05-06 20:19:59 +0000163By default the deb created does not include the manual pages. To
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400164enable their creation, and subsequent inclusion in the deb, add the
165following option to the cmake command:
E. Scott Daniels15390d72019-05-06 20:19:59 +0000166
167 -DBUILD_DOC=1
168
169This will cause the {X}fm text formatting package to be fetched
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400170(github) and built at cmake time (must exist before building) and will
171trigger the generation of the man pages in both postscript and troff
172format. The troff pages are placed into the deb and the postscript
173pages are left in the build directory for the developer to convert to
174PDF, or otherwise use.
E. Scott Daniels29d87162019-06-12 13:48:25 -0400175
E. Scott Danielsa1c1dc62019-09-30 13:05:12 -0400176Debug Mode
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400177
E. Scott Danielsa1c1dc62019-09-30 13:05:12 -0400178Because RMR is designed to keep its overhead to an absolute minimum,
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400179messages written to standard error are by default very limited. The
180route table collection thread provides the means to enable debug
181messages on the fly, but only because that thread does not impact the
182sending and receiving of user messages.
E. Scott Daniels29d87162019-06-12 13:48:25 -0400183
E. Scott Danielsa1c1dc62019-09-30 13:05:12 -0400184If it becomes necessary, for development or problem soving, to have
185the RMR functions generate debugging messages the following
186CMake flag can be given when the CMake environment is created:
187 -DDEBUG=n
188
189The value for 'n' should be 1 or 2 to enable debugging. The default
190when not given is the same as setting n to zero.
191
Lott, Christopher (cl778h)fe6a8562020-04-06 15:05:22 -0400192When running in debug mode, RMR will log messages received, sent, and
193other useful information. Because debugging uses fprintf() there is a
194significant amount of overhead with logging this information and thus
195in debugging mode the user should not expect that usual message rates
196can be achieved, and in some cases may cause messages to drop if TCP
197queues become full.