blob: 2faba072e672af834a2cc6bca6ef7fb8a0079000 [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.8
15- OS X 10.9
Ivan Yeoba1a4a92015-01-11 00:45:57 -080016- OS X 10.10
Davide Pesaventoe11c8d82016-04-16 14:32:07 +020017- OS X 10.11
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++``
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070037- OpenSSL version >= 1.0
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070038- ``pkg-config``
Davide Pesaventoe6e6fde2016-04-16 14:44:45 +020039- Boost libraries >= 1.54
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070040- OSX Security framework (on OSX platform only)
41
42Following are the detailed steps for each platform to install the compiler, all necessary
43development tools and libraries, and ndn-cxx prerequisites.
44
45- OS X
46
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
60 brew link --force openssl
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070061
Junxiao Shi190bee22015-02-14 19:21:36 -070062 .. note::
63
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070064 If a major OS X system upgrade is performed after installing dependencies with
65 MacPorts or Homebrew, remember to reinstall all packages.
Junxiao Shi190bee22015-02-14 19:21:36 -070066
Ivan Yeoba1a4a92015-01-11 00:45:57 -080067- Ubuntu
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070068
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070069 In a terminal, enter::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070070
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070071 sudo apt-get install build-essential libcrypto++-dev libsqlite3-dev libboost-all-dev libssl-dev
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070072
Ivan Yeoba1a4a92015-01-11 00:45:57 -080073- Fedora
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070074
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070075 In a terminal, enter::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070076
Alexander Afanasyev67cb75c2016-06-15 12:34:58 -070077 sudo yum install gcc-g++ git
78 sudo yum install sqlite-devel cryptopp-devel boost-devel openssl-devel
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070079
80Optional:
81~~~~~~~~~
82
83To build tutorials, manpages, and API documentation the following
84dependencies need to be installed:
85
86- ``doxygen``
87- ``graphviz``
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070088- ``python-sphinx`` and sphinx extensions ``sphinxcontrib-doxylink``,
89 ``sphinxcontrib-googleanalytics``
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070090
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070091The following lists steps for common platforms to install these prerequisites:
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070092
Ivan Yeoba1a4a92015-01-11 00:45:57 -080093- On OS X with MacPorts::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -070094
95 sudo port install doxygen graphviz py27-sphinx sphinx_select
96 sudo port select sphinx py27-sphinx
97
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -070098 # Install sphinx extensions
99 sudo port install py27-pip
100 sudo port select pip pip27
101 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
102
Ivan Yeoba1a4a92015-01-11 00:45:57 -0800103- On Ubuntu::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700104
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700105 sudo apt-get install doxygen graphviz python-sphinx python-pip
106 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700107
Ivan Yeoba1a4a92015-01-11 00:45:57 -0800108- On Fedora::
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700109
Alexander Afanasyev5946ed12015-01-19 23:41:39 -0800110 sudo yum install doxygen graphviz python-sphinx
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700111 sudo pip install sphinxcontrib-doxylink sphinxcontrib-googleanalytics
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700112
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700113.. _build:
114
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700115Build
116-----
117
118(These are instructions to build ndn-cxx. To do development of ndn-cxx
119code and update the build system, see Development.)
120
121To build in a terminal, change directory to the ndn-cxx root. Enter:
122
123::
124
125 ./waf configure
126 ./waf
127 sudo ./waf install
128
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700129By default, only the shared version of ndn-cxx library is built. To build the static library,
130use ``--enable-static`` option for ``./waf configure`` command. For example::
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700131
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700132 ./waf configure --enable-static
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700133
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700134To disable build of the shared library and build only the static library, use additional
135``--disable-shared`` option. Note that at least one version of the library needs to be
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700136enabled.
137
138::
139
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700140 ./waf configure --enable-static --disable-shared
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700141
142
Spyridon Mastorakis5ebfda62015-07-21 20:57:40 -0700143After the shared library is built and installed, some systems require additional actions.
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700144
145 - on Linux::
146
147 sudo ldconfig
148
149 - on FreeBSD::
150
151 sudo ldconfig -m
152
153 .. note::
154 When library is installed in a non-standard path (in general: not in ``/usr/lib`` or
155 ``/usr/local/lib``; on some Linux distros including Fedora: not in ``/usr/lib``),
156 additional actions may be necessary.
157
158 The installation path should be added to ``/etc/ld.so.conf`` (or in
159 ``/etc/ld.so.conf.d``) **before** running ``sudo ldconfig``. For example::
160
161 echo /usr/local/lib | sudo tee /etc/ld.so.conf.d/ndn-cxx.conf
162
163 Alternatively, ``LD_LIBRARY_PATH`` environment variable should be set to the location of
164 the library::
165
166 export LD_LIBRARY_PATH=/usr/local/lib
167
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700168This builds and installs the following items:
169
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700170- ``<LIBPATH>/libndn-cxx.a``: static NDN C++ library (if enabled)
171- ``<LIBPATH>/libndn-cxx.so``, ``<LIBPATH>/libndn-cxx.so.<VERSION>`` (on Linux),
172 ``<LIBPATH>/libndn-cxx.dylib``, ``<LIBPATH>/libndn-cxx.<VERSION>.dylib`` (on OS X):
173 shared NDN C++ library (if enabled)
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700174- ``<LIBPATH>/pkgconfig/libndn-cxx.pc``: pkgconfig file storing all
175 neccessary flags to build against the library. For example, if
176 pkgconfig or pkgconf package is installed and ``PKG_CONFIG_PATH`` is
177 configured properly (or ``<LIBPATH>/pkgconfig`` is a default path),
178 ``pkgconfig --libs --clflags libndn-cxx`` will return all necessary
179 compile and link flags for the library.
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700180- ``<BINPATH>/ndncatchunks3``: a simplified equivalent to ndncatchunks2
181 in NDNx package
182- ``<BINPATH>/ndnputchunks3``: a simplified equivalent to ndnputchunks2
183 in NDNx package
184- ``<BINPATH>/ndnsec``: tool to manage NDN keys and certificates
185- ``<BINPATH>/ndnsec-*``: convenience scripts for ``ndnsec`` tools
186
187If configured with tests: ``./waf configure --with-tests``), the above
188commands will also produce:
189
190- ``build/unit-tests``: A unit test binary for the library
191
Junxiao Shie04bd832014-11-29 23:02:38 -07001921.5GB available memory per CPU core is necessary for efficient compilation.
193On a multi-core machine with less than 1.5GB available memory per CPU core,
194limit the objects being compiled in parallel with ``./waf -jN`` where N is the amount
195of available memory divided by 1.5GB (eg. ``./waf -j1`` for 1.5GB memory),
196which could usually avoid memory thrashing and result in faster compilation.
197
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700198Build with examples
199-------------------
200
201By default, examples in ``examples/`` are not build. To enable them, use
202``--with-examples`` configure option:
203
204::
205
206 ./waf configure --with-examples
207 ./waf
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700208 sudo ./waf install
209
210:ref:`Additional step <build>`:
211
212 - on Linux::
213
214 sudo ldconfig
215
216 - on FreeBSD::
217
218 sudo ldconfig -m
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700219
220To run examples:
221
222::
223
224 # trivial producer app
225 ./build/examples/producer
226
227 # trivial consumer app
228 ./build/examples/consumer
229
230 # trivial consumer app with timers
231 ./build/examples/consumer-with-timer
232
233If you want to test out a sample application, just create a ``.cpp`` file in ``examples/``
234folder and it will be compiled on the next run on ``./waf``. For example:
235
236::
237
238 cp examples/consumer.cpp examples/my-new-consumer-app.cpp
239 ./waf
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700240 sudo ./waf install
Alexander Afanasyevc8bcd452014-05-12 17:58:47 -0700241 ./build/examples/my-new-consumer-app
242
243
Alexander Afanasyev9b0e1142014-05-08 00:17:34 -0700244Debug symbols
245~~~~~~~~~~~~~
246
247The default compiler flags enable debug symbols to be included in binaries (i.e., ``-g``
248flag for ``./waf configure`` and ``-g3`` for ``./waf configure --debug``). This
249potentially allows more meaningful debugging information if your application crashes.
250
251If it is undesirable, default flags can be easily overridden:
252
253::
254
255 CXXFLAGS="-O2" ./waf configure --prefix=/usr --sysconfdir=/etc
256 ./waf
257 sudo ./waf install
258
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700259:ref:`Additional step <build>`:
260
261 - on Linux::
262
263 sudo ldconfig
264
265 - on FreeBSD::
266
267 sudo ldconfig -m
268
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700269Documentation
270-------------
271
272ndn-cxx tutorials and API documentation can be built using the following
273commands:
274
275::
276
277 # Full set of documentation (tutorials + API) in build/docs
278 ./waf docs
279
280 # Only tutorials in `build/docs`
281 ./waf sphinx
282
283 # Only API docs in `build/docs/doxygen`
284 ./waf doxgyen
285
286Manpages are automatically created and installed during the normal build
287process (e.g., during ``./waf`` and ``./waf install``), if
288``python-sphinx`` module is detected during ``./waf configure`` stage.
289By default, manpages are installed into ``${PREFIX}/share/man`` (where
290default value for ``PREFIX`` is ``/usr/local``). This location can be
291changed during ``./waf configure`` stage using ``--prefix``,
292``--datarootdir``, or ``--mandir`` options.
293
294For more details, refer to ``./waf --help``.
295
296Development Build
297-----------------
298
299The following is the suggested configure commands for development build.
300
301::
302
303 ./waf configure --debug --with-tests
304 ./waf
305 sudo ./waf install
306
Alexander Afanasyev7ed29432015-06-05 18:01:16 -0700307:ref:`Additional step <build>`:
308
309 - on Linux::
310
311 sudo ldconfig
312
313 - on FreeBSD::
314
315 sudo ldconfig -m
316
Alexander Afanasyevc5452c52014-04-29 17:21:51 -0700317In the development build all compiler optimizations are disabled by
318default and all warnings are treated as error. The default behavior can
319be overridden by setting ``CXXFLAGS`` environment variable before
320running ``./waf configure``:
321
322::
323
324 CXXFLAGS="-O1 -g3" ./waf configure --debug --with-tests
325 ...
Alexander Afanasyev5946ed12015-01-19 23:41:39 -0800326
327Customize Compiler
328------------------
329
330To customize compiler, set ``CXX`` environment variable to point to compiler binary and, in
331some case, specify type of the compiler using ``--check-cxx-compiler``. For example, when
332using clang compiler on Linux system, use the following:
333
334::
335
336 CXX=clang++ ./waf configure --check-cxx-compiler=clang++