blob: 5b37759b25d916c9ecb734ec42d3c72efa89dff3 [file] [log] [blame]
Alexander Afanasyev2aa39622014-01-22 11:51:11 -08001# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -07002
3"""
4Copyright (c) 2014 Regents of the University of California,
5 Arizona Board of Regents,
6 Colorado State University,
7 University Pierre & Marie Curie, Sorbonne University,
8 Washington University in St. Louis,
9 Beijing Institute of Technology
10
11This file is part of NFD (Named Data Networking Forwarding Daemon).
12See AUTHORS.md for complete list of NFD authors and contributors.
13
14NFD is free software: you can redistribute it and/or modify it under the terms
15of the GNU General Public License as published by the Free Software Foundation,
16either version 3 of the License, or (at your option) any later version.
17
18NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20PURPOSE. See the GNU General Public License for more details.
21
22You should have received a copy of the GNU General Public License along with
23NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24"""
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080025
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070026import re
27
28VERSION = re.search('^#define NFD_VERSION_STRING\\s+"(.*)"',
29 open("version.hpp").read(), re.M).group(1)
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070030APPNAME = "nfd"
31BUGREPORT = "http://redmine.named-data.net/projects/nfd"
32URL = "https://github.com/named-data/NFD"
33
34from waflib import Logs
hilata198cadb2014-02-15 23:46:19 -060035import os
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080036
37def options(opt):
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070038 opt.load(['compiler_cxx', 'gnu_dirs'])
39 opt.load(['boost', 'unix-socket', 'dependency-checker',
40 'default-compiler-flags', 'coverage',
41 'doxygen', 'sphinx_build'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070042 tooldir=['.waf-tools'])
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080043
44 nfdopt = opt.add_option_group('NFD Options')
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070045 opt.addUnixOptions(nfdopt)
46 opt.addDependencyOptions(nfdopt, 'libpcap')
47 nfdopt.add_option('--without-libpcap', action='store_true', default=False,
48 dest='without_libpcap',
49 help='''Disable libpcap (Ethernet face support will be disabled)''')
50
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070051 opt.addDependencyOptions(nfdopt, 'librt', '(optional)')
52 opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
53
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070054 nfdopt.add_option('--with-tests', action='store_true', default=False,
55 dest='with_tests', help='''Build unit tests''')
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040056 nfdopt.add_option('--with-other-tests', action='store_true', default=False,
57 dest='with_other_tests', help='''Build other tests''')
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060058
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080059def configure(conf):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070060 conf.load(['compiler_cxx', 'gnu_dirs',
61 'default-compiler-flags',
62 'boost', 'dependency-checker',
63 'doxygen', 'sphinx_build'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070064
Alexander Afanasyev4a771362014-04-24 21:29:33 -070065 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
66 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010067
Alexander Afanasyev82afa1a2014-03-20 16:56:56 -070068 boost_libs = 'system chrono program_options'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080069 if conf.options.with_tests:
70 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070071 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070072 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080073
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040074 if conf.options.with_other_tests:
75 conf.env['WITH_OTHER_TESTS'] = 1
76
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080077 conf.check_boost(lib=boost_libs)
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060078
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080079 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070080 Logs.error("Minimum required boost version is 1.48.0")
81 Logs.error("Please upgrade your distribution or install custom boost libraries" +
82 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080083 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080084
85 conf.load('unix-socket')
Davide Pesavento44deacc2014-02-19 10:48:07 +010086
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070087 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070088 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070089 if not conf.options.without_libpcap:
90 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
91 errmsg='not found, but required for Ethernet face support. '
92 'Specify --without-libpcap to disable Ethernet face support.')
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070093
Alexander Afanasyev689569b2014-02-16 20:20:07 -080094 conf.load('coverage')
95
Junxiao Shid71d84c2014-04-18 17:22:50 -070096 conf.find_program('bash', var='BASH')
97
Steve DiBenedettofbb40a82014-03-11 19:40:15 -060098 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -070099
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700100 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800101
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700102def build(bld):
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700103 core = bld(
104 target='core-objects',
105 name='core-objects',
106 features='cxx',
107 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyev4a771362014-04-24 21:29:33 -0700108 use='BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700109 includes='. core',
110 export_includes='. core',
111 )
112
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800113 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700114 target='daemon-objects',
115 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700116 features='cxx',
117 source=bld.path.ant_glob(['daemon/**/*.cpp'],
118 excl=['daemon/face/ethernet-*.cpp',
119 'daemon/face/unix-*.cpp',
120 'daemon/main.cpp']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700121 use='core-objects',
122 includes='daemon',
123 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700124 )
125
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700126 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100127 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700128 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100129
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800130 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100131 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800132
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700133 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700134 features='cxx cxxprogram',
135 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700136 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600137 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600138
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700139 rib_objects = bld(
140 target='rib-objects',
141 name='rib-objects',
142 features='cxx',
143 source=bld.path.ant_glob(['rib/**/*.cpp'],
144 excl=['rib/main.cpp']),
145 use='core-objects',
146 )
147
148 bld(target='bin/nrd',
149 features='cxx cxxprogram',
150 source='rib/main.cpp',
151 use='rib-objects',
152 )
153
hilata198cadb2014-02-15 23:46:19 -0600154 for app in bld.path.ant_glob('tools/*.cpp'):
155 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700156 target='bin/%s' % (str(app.change_ext(''))),
157 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700158 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600159 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100160
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700161 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400162
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700163 bld(features="subst",
164 source='nfd.conf.sample.in',
165 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700166 install_path="${SYSCONFDIR}/ndn",
167 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800168
Chengyu Fanb07788a2014-03-31 12:15:36 -0600169 bld(features='subst',
170 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700171 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600172 install_path="${BINDIR}",
173 chmod=0755)
174
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700175 if bld.env['SPHINX_BUILD']:
176 bld(features="sphinx",
177 builder="man",
178 outdir="docs/manpages",
179 config="docs/conf.py",
180 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700181 install_path="${MANDIR}/",
182 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700183
Junxiao Shid71d84c2014-04-18 17:22:50 -0700184 for script in bld.path.ant_glob('tools/*.sh'):
185 bld(features='subst',
186 source='tools/%s' % (str(script)),
187 target='bin/%s' % (str(script.change_ext(''))),
188 install_path="${BINDIR}",
189 chmod=0755)
190
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700191def docs(bld):
192 from waflib import Options
193 Options.commands = ['doxygen', 'sphinx'] + Options.commands
194
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800195def doxygen(bld):
196 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700197 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
198 else:
199 bld(features="subst",
200 name="doxygen-conf",
201 source="docs/doxygen.conf.in",
202 target="docs/doxygen.conf",
203 VERSION=VERSION,
204 )
205
206 bld(features="doxygen",
207 doxyfile='docs/doxygen.conf',
208 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700209
210def sphinx(bld):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700211 if not bld.env.SPHINX_BUILD:
212 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
213 else:
214 bld(features="sphinx",
215 outdir="docs",
216 source=bld.path.ant_glob('docs/**/*.rst'),
217 config="docs/conf.py",
218 VERSION=VERSION)