blob: d2aff10bfadbbd71c80b2c6bda149ef3fd80ac77 [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
Junxiao Shi6b597e72014-06-29 23:41:17 -070026VERSION = "0.2.0"
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070027APPNAME = "nfd"
28BUGREPORT = "http://redmine.named-data.net/projects/nfd"
Alexander Afanasyevb47d5382014-05-05 14:35:03 -070029URL = "http://named-data.net/doc/NFD/"
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -070030GIT_TAG_PREFIX = "NFD-"
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070031
Alexander Afanasyevb47d5382014-05-05 14:35:03 -070032from waflib import Logs, Utils, Context
Alexander Afanasyev20757882014-08-25 22:39:08 -070033import os
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080034
35def options(opt):
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070036 opt.load(['compiler_cxx', 'gnu_dirs'])
Wentao Shang53df1632014-04-21 12:01:32 -070037 opt.load(['boost', 'unix-socket', 'dependency-checker', 'websocket',
Alexander Afanasyeve9186212014-08-23 20:15:48 -070038 'default-compiler-flags', 'coverage', 'pch', 'boost-kqueue',
Junxiao Shib2bcbcd2014-11-08 09:30:28 -070039 'doxygen', 'sphinx_build', 'type_traits'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070040 tooldir=['.waf-tools'])
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080041
42 nfdopt = opt.add_option_group('NFD Options')
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070043 opt.addUnixOptions(nfdopt)
Wentao Shang53df1632014-04-21 12:01:32 -070044 opt.addWebsocketOptions(nfdopt)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070045 opt.addDependencyOptions(nfdopt, 'libpcap')
46 nfdopt.add_option('--without-libpcap', action='store_true', default=False,
47 dest='without_libpcap',
48 help='''Disable libpcap (Ethernet face support will be disabled)''')
49
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070050 opt.addDependencyOptions(nfdopt, 'librt', '(optional)')
51 opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
52
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070053 nfdopt.add_option('--with-tests', action='store_true', default=False,
54 dest='with_tests', help='''Build unit tests''')
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040055 nfdopt.add_option('--with-other-tests', action='store_true', default=False,
56 dest='with_other_tests', help='''Build other tests''')
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060057
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080058def configure(conf):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070059 conf.load(['compiler_cxx', 'gnu_dirs',
Alexander Afanasyeve9186212014-08-23 20:15:48 -070060 'default-compiler-flags', 'pch', 'boost-kqueue',
Wentao Shang53df1632014-04-21 12:01:32 -070061 'boost', 'dependency-checker', 'websocket',
Junxiao Shib2bcbcd2014-11-08 09:30:28 -070062 'doxygen', 'sphinx_build', 'type_traits'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070063
Davide Pesaventof0ae4422014-05-05 16:32:12 +020064 conf.find_program('bash', var='BASH')
65
Alexander Afanasyev4a771362014-04-24 21:29:33 -070066 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
67 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010068
Davide Pesaventob499a602014-11-18 22:36:56 +010069 conf.checkDependency(name='librt', lib='rt', mandatory=False)
70 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
71
Wentao Shang93ef6c92014-06-19 11:59:17 -040072 boost_libs = 'system chrono program_options random'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080073 if conf.options.with_tests:
74 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070075 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070076 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080077
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040078 if conf.options.with_other_tests:
79 conf.env['WITH_OTHER_TESTS'] = 1
80
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080081 conf.check_boost(lib=boost_libs)
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080082 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070083 Logs.error("Minimum required boost version is 1.48.0")
84 Logs.error("Please upgrade your distribution or install custom boost libraries" +
85 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080086 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080087
88 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -070089 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010090
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070091 if not conf.options.without_libpcap:
Alexander Afanasyeve9186212014-08-23 20:15:48 -070092 conf.check_asio_pcap_support()
93 if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
94 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
95 errmsg='not found, but required for Ethernet face support. '
96 'Specify --without-libpcap to disable Ethernet face support.')
97 else:
98 Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
99 'See http://redmine.named-data.net/issues/1877 for more details')
Davide Pesaventof0ae4422014-05-05 16:32:12 +0200100 if conf.env['HAVE_LIBPCAP']:
101 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
102 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -0700103
Alexander Afanasyev689569b2014-02-16 20:20:07 -0800104 conf.load('coverage')
105
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600106 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700107
Junxiao Shi759f7062014-11-29 10:19:22 -0700108 # disable assertions in release builds
109 if not conf.options.debug:
110 conf.define('NDEBUG', 1)
111
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700112 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800113
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700114def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700115 version(bld)
116
117 bld(features="subst",
118 name='version',
119 source='version.hpp.in',
120 target='version.hpp',
121 install_path=None,
122 VERSION_STRING=VERSION_BASE,
123 VERSION_BUILD=VERSION,
124 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
125 int(VERSION_SPLIT[1]) * 1000 +
126 int(VERSION_SPLIT[2]),
127 VERSION_MAJOR=VERSION_SPLIT[0],
128 VERSION_MINOR=VERSION_SPLIT[1],
129 VERSION_PATCH=VERSION_SPLIT[2],
130 )
131
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700132 core = bld(
133 target='core-objects',
134 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300135 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700136 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700137 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700138 includes='. core',
139 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300140 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700141 )
142
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800143 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700144 target='daemon-objects',
145 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700146 features='cxx',
147 source=bld.path.ant_glob(['daemon/**/*.cpp'],
148 excl=['daemon/face/ethernet-*.cpp',
149 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700150 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700151 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600152 use='core-objects WEBSOCKET',
153 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700154 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700155 )
156
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700157 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100158 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700159 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100160
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800161 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100162 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800163
Wentao Shang53df1632014-04-21 12:01:32 -0700164 if bld.env['HAVE_WEBSOCKET']:
165 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
166
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700167 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700168 features='cxx cxxprogram',
169 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700170 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600171 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600172
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700173 rib_objects = bld(
174 target='rib-objects',
175 name='rib-objects',
176 features='cxx',
177 source=bld.path.ant_glob(['rib/**/*.cpp'],
178 excl=['rib/main.cpp']),
179 use='core-objects',
180 )
181
182 bld(target='bin/nrd',
183 features='cxx cxxprogram',
184 source='rib/main.cpp',
185 use='rib-objects',
186 )
187
hilata198cadb2014-02-15 23:46:19 -0600188 for app in bld.path.ant_glob('tools/*.cpp'):
189 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700190 target='bin/%s' % (str(app.change_ext(''))),
191 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700192 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600193 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100194
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700195 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400196
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700197 bld(features="subst",
198 source='nfd.conf.sample.in',
199 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700200 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700201 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
202 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800203
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700204 if bld.env['SPHINX_BUILD']:
205 bld(features="sphinx",
206 builder="man",
207 outdir="docs/manpages",
208 config="docs/conf.py",
209 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700210 install_path="${MANDIR}/",
211 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700212
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700213 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700214 bld(features='subst',
215 source='tools/%s' % (str(script)),
216 target='bin/%s' % (str(script.change_ext(''))),
217 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700218 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700219 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700220
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700221 bld.install_files("${DATAROOTDIR}/ndn",
222 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
223
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700224def docs(bld):
225 from waflib import Options
226 Options.commands = ['doxygen', 'sphinx'] + Options.commands
227
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800228def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700229 version(bld)
230
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800231 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700232 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
233 else:
234 bld(features="subst",
235 name="doxygen-conf",
Alexander Afanasyev20757882014-08-25 22:39:08 -0700236 source=["docs/doxygen.conf.in",
237 "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
238 target=["docs/doxygen.conf",
239 "docs/named_data_theme/named_data_footer-with-analytics.html"],
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700240 VERSION=VERSION_BASE,
Alexander Afanasyev20757882014-08-25 22:39:08 -0700241 HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
242 if os.getenv('GOOGLE_ANALYTICS', None) \
243 else "../docs/named_data_theme/named_data_footer.html",
244 GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700245 )
246
247 bld(features="doxygen",
248 doxyfile='docs/doxygen.conf',
249 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700250
251def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700252 version(bld)
253
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700254 if not bld.env.SPHINX_BUILD:
255 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
256 else:
257 bld(features="sphinx",
258 outdir="docs",
259 source=bld.path.ant_glob('docs/**/*.rst'),
260 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700261 VERSION=VERSION_BASE)
262
263def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700264 if getattr(Context.g_module, 'VERSION_BASE', None):
265 return
266
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700267 Context.g_module.VERSION_BASE = Context.g_module.VERSION
268 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
269
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700270 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700271 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700272 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700273 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
274 stderr=None, stdin=None)
Alexander Afanasyev3b21fa32014-09-01 13:25:20 -0700275 out = str(p.communicate()[0].strip())
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700276 didGetVersion = (p.returncode == 0 and out != "")
277 if didGetVersion:
278 if out.startswith(GIT_TAG_PREFIX):
279 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
280 else:
281 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
282 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700283 pass
284
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700285 versionFile = ctx.path.find_node('VERSION')
286
287 if not didGetVersion and versionFile is not None:
288 try:
289 Context.g_module.VERSION = versionFile.read()
290 return
291 except (OSError, IOError):
292 pass
293
294 # version was obtained from git, update VERSION file if necessary
295 if versionFile is not None:
296 try:
297 version = versionFile.read()
298 if version == Context.g_module.VERSION:
299 return # no need to update
300 except (OSError, IOError):
301 Logs.warn("VERSION file exists, but not readable")
302 else:
303 versionFile = ctx.path.make_node('VERSION')
304
305 if versionFile is None:
306 return
307
308 try:
309 versionFile.write(Context.g_module.VERSION)
310 except (OSError, IOError):
311 Logs.warn("VERSION file is not writeable")
312
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700313def dist(ctx):
314 version(ctx)
315
316def distcheck(ctx):
317 version(ctx)