blob: 99f02df8d5478811a918aec86b38406b56b58eb6 [file] [log] [blame]
Alexander Afanasyevabaab522014-04-30 20:42:11 -07001.. _Getting Started with ndn-cxx:
2
Alexander Afanasyevc5452c52014-04-29 17:21:51 -07003Getting started with ndn-cxx
4============================
5
6Supported platforms
7-------------------
8
9ndn-cxx uses continuous integration and has been tested on the following
10platforms:
11
Ivan Yeoba1a4a92015-01-11 00:45:57 -080012- Ubuntu 14.04 (64-bit and 32-bit)
Davide Pesaventoe11c8d82016-04-16 14:32:07 +020013- Ubuntu 16.04 (64-bit and 32-bit)
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070014- OS X 10.9
Ivan Yeoba1a4a92015-01-11 00:45:57 -080015- OS X 10.10
Davide Pesaventoe11c8d82016-04-16 14:32:07 +020016- OS X 10.11
Davide Pesavento0530b5b2016-11-07 03:23:58 +010017- macOS 10.12
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070018
19ndn-cxx is known to work on the following platforms, although they are not officially
20supported:
21
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070022- Fedora >= 20
Ivan Yeoba1a4a92015-01-11 00:45:57 -080023- CentOS >= 6.2
24- Gentoo Linux
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070025- FreeBSD >= 10.0
Ivan Yeoba1a4a92015-01-11 00:45:57 -080026- Raspbian >= 3.12
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070027
28Prerequisites
29-------------
30
31Required:
32~~~~~~~~~
33
34- ``python`` >= 2.6
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070035- ``libsqlite3``
36- ``libcrypto++``
Davide Pesavento0530b5b2016-11-07 03:23:58 +010037- OpenSSL >= 1.0.1
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070038- ``pkg-config``
Davide Pesaventoe6e6fde2016-04-16 14:44:45 +020039- Boost libraries >= 1.54
Davide Pesavento0530b5b2016-11-07 03:23:58 +010040- OSX Security framework (on OSX/macOS platform only)
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070041
42Following are the detailed steps for each platform to install the compiler, all necessary
43development tools and libraries, and ndn-cxx prerequisites.
44
Davide Pesavento0530b5b2016-11-07 03:23:58 +010045- OS X / macOS
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070046
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070047 Install Xcode from AppStore or at least Command Line Tools (``xcode-select --install``)
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070048
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070049 * When using MacPorts
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070050
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070051 In a terminal, enter::
52
53 sudo port install pkgconfig boost sqlite3 libcryptopp openssl
54
55 * When using Homebrew
56
57 In a terminal, enter::
58
59 brew install boost pkg-config cryptopp openssl
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070060
Junxiao Shi190bee22015-02-14 19:21:36 -070061 .. note::
62
Davide Pesavento0530b5b2016-11-07 03:23:58 +010063 If a major OS upgrade is performed after installing dependencies with
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070064 MacPorts or Homebrew, remember to reinstall all packages.
Junxiao Shi190bee22015-02-14 19:21:36 -070065
Ivan Yeoba1a4a92015-01-11 00:45:57 -080066- Ubuntu
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070067
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070068 In a terminal, enter::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070069
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070070 sudo apt-get install build-essential libcrypto++-dev libsqlite3-dev libboost-all-dev libssl-dev
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070071
Ivan Yeoba1a4a92015-01-11 00:45:57 -080072- Fedora
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070073
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070074 In a terminal, enter::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070075
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070076 sudo yum install gcc-g++ git
77 sudo yum install sqlite-devel cryptopp-devel boost-devel openssl-devel
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070078
79Optional:
80~~~~~~~~~
81
82To build tutorials, manpages, and API documentation the following
83dependencies need to be installed:
84
85- ``doxygen``
86- ``graphviz``
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070087- ``python-sphinx`` and sphinx extensions ``sphinxcontrib-doxylink``,
88 ``sphinxcontrib-googleanalytics``
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070089
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070090The following lists steps for common platforms to install these prerequisites:
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070091
Davide Pesavento0530b5b2016-11-07 03:23:58 +010092- On OS X / macOS with MacPorts::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070093
94 sudo port install doxygen graphviz py27-sphinx sphinx_select
95 sudo port select sphinx py27-sphinx
96
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070097 # Install sphinx extensions
98 sudo port install py27-pip
99 sudo port select pip pip27
100 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
101
Ivan Yeoba1a4a92015-01-11 00:45:57 -0800102- On Ubuntu::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700103
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700104 sudo apt-get install doxygen graphviz python-sphinx python-pip
105 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700106
Ivan Yeoba1a4a92015-01-11 00:45:57 -0800107- On Fedora::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700108
Alexander Afanasyev5946ed12015-01-19 23:41:39 -0800109 sudo yum install doxygen graphviz python-sphinx
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700110 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700111
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700112.. _build:
113
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700114Build
115-----
116
117(These are instructions to build ndn-cxx. To do development of ndn-cxx
118code and update the build system, see Development.)
119
120To build in a terminal, change directory to the ndn-cxx root. Enter:
121
122::
123
124 ./waf configure
125 ./waf
126 sudo ./waf install
127
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700128By default, only the shared version of ndn-cxx library is built. To build the static library,
129use ``--enable-static`` option for ``./waf configure`` command. For example::
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700130
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700131 ./waf configure --enable-static
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700132
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700133To disable build of the shared library and build only the static library, use additional
134``--disable-shared`` option. Note that at least one version of the library needs to be
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700135enabled.
136
137::
138
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700139 ./waf configure --enable-static --disable-shared
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700140
141
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700142After the shared library is built and installed, some systems require additional actions.
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700143
144 - on Linux::
145
146 sudo ldconfig
147
148 - on FreeBSD::
149
150 sudo ldconfig -m
151
152 .. note::
153 When library is installed in a non-standard path (in general: not in ``/usr/lib`` or
154 ``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
155 additional actions may be necessary.
156
157 The installation path should be added to ``/etc/ld.so.conf`` (or in
158 ``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example::
159
160 echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
161
162 Alternatively, ``LD_LIBRARY_PATH`` environment variable should be set to the location of
163 the library::
164
165 export LD_LIBRARY_PATH=/usr/local/lib
166
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700167This builds and installs the following items:
168
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700169- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled)
170- ``<LIBPATH>/libndn-cxx.so``, ``<LIBPATH>/libndn-cxx.so.<VERSION>`` (on Linux),
171 ``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on OS X):
172 shared NDN C++ library (if enabled)
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700173- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all
174 neccessary flags to build against the library. For example, if
175 pkgconfig or pkgconf package is installed and ``PKG_CONFIG_PATH`` is
176 configured properly (or ``<LIBPATH>/pkgconfig`` is a default path),
177 ``pkgconfig --libs --clflags libndn-cxx`` will return all necessary
178 compile and link flags for the library.
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700179- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates
180- ``<BINPATH>/ndnsec-*``: convenience scripts for ``ndnsec`` tools
181
182If configured with tests: ``./waf configure --with-tests``), the above
183commands will also produce:
184
185- ``build/unit-tests``: A unit test binary for the library
186
Junxiao Shie04bd832014-11-29 23:02:38 -07001871.5GB available memory per CPU core is necessary for efficient compilation.
188On a multi-core machine with less than 1.5GB available memory per CPU core,
189limit the objects being compiled in parallel with ``./waf -jN`` where N is the amount
190of available memory divided by 1.5GB (eg. ``./waf -j1`` for 1.5GB memory),
191which could usually avoid memory thrashing and result in faster compilation.
192
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700193Build with examples
194-------------------
195
196By default, examples in ``examples/`` are not build. To enable them, use
197``--with-examples`` configure option:
198
199::
200
201 ./waf configure --with-examples
202 ./waf
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700203 sudo ./waf install
204
205:ref:`Additional step <build>`:
206
207 - on Linux::
208
209 sudo ldconfig
210
211 - on FreeBSD::
212
213 sudo ldconfig -m
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700214
215To run examples:
216
217::
218
219 # trivial producer app
220 ./build/examples/producer
221
222 # trivial consumer app
223 ./build/examples/consumer
224
225 # trivial consumer app with timers
226 ./build/examples/consumer-with-timer
227
228If you want to test out a sample application, just create a ``.cpp`` file in ``examples/``
229folder and it will be compiled on the next run on ``./waf``. For example:
230
231::
232
233 cp examples/consumer.cpp examples/my-new-consumer-app.cpp
234 ./waf
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700235 sudo ./waf install
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700236 ./build/examples/my-new-consumer-app
237
238
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700239Debug symbols
240~~~~~~~~~~~~~
241
242The default compiler flags enable debug symbols to be included in binaries (i.e., ``-g``
243flag for ``./waf configure`` and ``-g3`` for ``./waf configure --debug``). This
244potentially allows more meaningful debugging information if your application crashes.
245
246If it is undesirable, default flags can be easily overridden:
247
248::
249
250 CXXFLAGS="-O2" ./waf configure --prefix=/usr --sysconfdir=/etc
251 ./waf
252 sudo ./waf install
253
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700254:ref:`Additional step <build>`:
255
256 - on Linux::
257
258 sudo ldconfig
259
260 - on FreeBSD::
261
262 sudo ldconfig -m
263
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700264Documentation
265-------------
266
267ndn-cxx tutorials and API documentation can be built using the following
268commands:
269
270::
271
272 # Full set of documentation (tutorials + API) in build/docs
273 ./waf docs
274
275 # Only tutorials in `build/docs`
276 ./waf sphinx
277
278 # Only API docs in `build/docs/doxygen`
279 ./waf doxgyen
280
281Manpages are automatically created and installed during the normal build
282process (e.g., during ``./waf`` and ``./waf install``), if
283``python-sphinx`` module is detected during ``./waf configure`` stage.
284By default, manpages are installed into ``${PREFIX}/share/man`` (where
285default value for ``PREFIX`` is ``/usr/local``). This location can be
286changed during ``./waf configure`` stage using ``--prefix``,
287``--datarootdir``, or ``--mandir`` options.
288
289For more details, refer to ``./waf --help``.
290
291Development Build
292-----------------
293
294The following is the suggested configure commands for development build.
295
296::
297
298 ./waf configure --debug --with-tests
299 ./waf
300 sudo ./waf install
301
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700302:ref:`Additional step <build>`:
303
304 - on Linux::
305
306 sudo ldconfig
307
308 - on FreeBSD::
309
310 sudo ldconfig -m
311
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700312In the development build all compiler optimizations are disabled by
313default and all warnings are treated as error. The default behavior can
314be overridden by setting ``CXXFLAGS`` environment variable before
315running ``./waf configure``:
316
317::
318
319 CXXFLAGS="-O1 -g3" ./waf configure --debug --with-tests
320 ...
Alexander Afanasyev5946ed12015-01-19 23:41:39 -0800321
322Customize Compiler
323------------------
324
Davide Pesavento0530b5b2016-11-07 03:23:58 +0100325To choose a custom C++ compiler for building ndn-cxx, set ``CXX`` environment
326variable to point to the compiler binary. For example, to build with clang on
327Linux, use the following:
Alexander Afanasyev5946ed12015-01-19 23:41:39 -0800328
329::
330
Davide Pesavento0530b5b2016-11-07 03:23:58 +0100331 CXX=clang++ ./waf configure