blob: bf4121af1c9992ce4695152605f4765803bcf555 [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
20
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040021Building RMR
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040022
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040023The RIC Message Router (RMR) is built with CMake, and requires
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -040024a modern gcc compiler and make to be installed on the build
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040025system. Typically, installing the following list of packages
26in a container (Ubuntu) is all that is needed to craft a
27development environment (containerised builds are also the
28recommended approach):
29
30 gcc git make vim cmake g++ ksh bash
31
32Kshell and vi are needed only if you wish to use the container
33interactively. Bash is assumed necessary for CMake.
34
35
36Build process
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040037To build RMR, the usual CMake steps are followed:
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040038 mkdir build
39 cd build
40 cmake .. [options]
41 make package
42
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040043
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040044This will create a .deb (provided the system supports this) in
45the build directory. It's that simple.
46
E. Scott Daniels29cb1002019-06-20 08:23:11 -040047The following flags may be given on the 'cmake' command line
48(options) which are outside of "normal" CMake flags and affect
49the configuration:
50
51 -DBUILD_DOC=1 Man pages generated
52 -DDEV_PKG=1 Development package configuration
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040053 -DIGNORE_LIBDIR Ignore the system preferred library directory and install in /usr/local/lib
E. Scott Daniels29cb1002019-06-20 08:23:11 -040054 -DMAN_PREFIX=<path> Supply a path where man pages are installed (default: /usr/share/man)
55 -DPACK_EXTERNALS=1 Include external libraries used to build in the run-time package
56 -DPRESERVE_PTYPE=1 Do not change the processor type when naming deb packages
E. Scott Daniels54098f62019-08-06 16:24:20 -040057 -DSKIP_EXTERNALS=1 Do not use Nano/NNG submodules when building; use installed packages
E. Scott Daniels29cb1002019-06-20 08:23:11 -040058
59
60Packages
61The build can be configured to generate either a run-time or
62development package. The run-time generation is the default and
63the -DDEV_PKG=1 option must be given to generate the development
64package. The run-time package contains only the shared library
65files (*.so), and the development package contains the headers,
66man pages (if the man option is set) and archive (.a) files.
67Resulting package names are illustrated in the CI section below.
68
69
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040070Continuous Integration Build
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -040071Use the Dockerfile in the ci/ subdirectory. This installs all
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -040072the required tools, then builds RMR and executes the unit and
E. Scott Daniels54098f62019-08-06 16:24:20 -040073program tests. If tests pass, then an image is created in the
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040074local registry with both run-time and development packages.
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -040075
E. Scott Daniels29d87162019-06-12 13:48:25 -040076To support the distribution of package(s) created during the
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040077build by the CI process, a YAML file is left in the /tmp
78directory (build_packages.yml) which contains a list of the
79packages available from the image. Currently, both .deb and
80.rpm packages are generated.
81
82The following is a sample YAML file generated during this process:
83
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040084 ---
E. Scott Danielsf6f4f122019-06-18 16:02:17 -040085 files:
86 - /tmp/rmr-dev_1.0.34_x86_64.deb
87 - /tmp/rmr-dev-1.0.34-x86_64.rpm
88 - /tmp/rmr_1.0.34_x86_64.deb
89 - /tmp/rmr-1.0.34-x86_64.rpm
E. Scott Danielsd4f18ba2019-06-17 15:08:17 -040090 ...
91
E. Scott Daniels29d87162019-06-12 13:48:25 -040092
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040093
94Alternatives
95To build in a non-Linux environment, or to build with an
96alternate install path (or both) read on.
97
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -040098Instead of using 'make package' as listed above, using
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -040099'make install' will build and install on the local system.
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -0400100By default, the target install is into /usr/local which may
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400101not be desired. To install into an alternate path add
102these two options when the 'cmake ..' command is given:
103
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)f89eec52019-06-10 16:53:39 -0400109directory, which can be in your home directory. The second
110defines where manual pages are placed (if not defined
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400111/usr/share/man is the target). Manual pages are generally
112NOT built as the required tool has yet to be incorporated into
113the build process and generally is not available on most systems.
114
115
E. Scott Daniels29d87162019-06-12 13:48:25 -0400116Compiling and Linking User Applications
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400117Should the Rmr and NNG/Nano libraries be installed in a directory
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -0400118outside of the normal system spots (e.g. not in /usr/local)
119it might be necessary to define the specific directory for
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400120libraries (.e.g -L) on the command line, or via environment
121variables (e.g.. C_INCLUDE_PATH, LD_LIBRARY_PATH, LIBRARY_PATH).
122It may also be necessary to have the library directory defined
123in the environment at run time. It is difficult to know what
E. Scott Daniels54098f62019-08-06 16:24:20 -0400124each system needs, but the following linker options work when
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400125libraries are installed in the system spots:
126
127 -lrmr_nng -lnng -lpthread
128
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -0400129Adding -L is one way to compensate when libraries are installed
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400130a different spot (e.g. in $HOME/usr):
131
132 -L $HOME/usr -lrmr_nng -lnng -lpthread
133
134
135Libraries
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -0400136RMR supports only NNG as the underlying transport. Nanomsg
E. Scott Daniels54098f62019-08-06 16:24:20 -0400137support was dropped starting with version 1.0.45 as Nanomsg
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -0400138has reached end of life. The package generation and install
139will produce a single RMR library: librmr_nng. RMR is designed
140to support different underlying transport mechanisms, which
141might require separate libraries, and thus the library name is
142given a suffix of _nng to reflect the transport mechanism
143in use.
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400144
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -0400145Regardless of transport mechanism supported by an RMR library,
E. Scott Daniels54098f62019-08-06 16:24:20 -0400146the RMR API will be identical, thus it is possible for an application
147to shift mechanisms simply by referencing a different library (should
E. Scott Danielsb0ba22e2019-08-06 13:26:12 -0400148multiple RMR libraries become available).
Ashwin Sridharanfd9cc7a2019-04-03 16:47:02 -0400149
150
E. Scott Daniels15390d72019-05-06 20:19:59 +0000151Manual Pages
152By default the deb created does not include the manual pages. To
153enable their creation, and subsequent inclusion in the deb, add
154the following option to the cmake command:
155
156 -DBUILD_DOC=1
157
158This will cause the {X}fm text formatting package to be fetched
159(github) and built at cmake time (must exist before building)
160and will trigger the generation of the man pages in both postscript
Lott, Christopher (cl778h)f89eec52019-06-10 16:53:39 -0400161and troff format. The troff pages are placed into the deb and
162the postscript pages are left in the build directory for the
E. Scott Daniels15390d72019-05-06 20:19:59 +0000163developer to convert to PDF, or otherwise use.
E. Scott Daniels29d87162019-06-12 13:48:25 -0400164
165