blob: 34de38207bef12a4fe35cf549bd37969dcb99f01 [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 Shi1c93cae2014-12-09 22:52:17 -070039 'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'],
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 Shi1c93cae2014-12-09 22:52:17 -070062 'doxygen', 'sphinx_build', 'type_traits', 'compiler-features'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070063
Davide Pesaventof0ae4422014-05-05 16:32:12 +020064 conf.find_program('bash', var='BASH')
65
Alexander Afanasyev6db058c2014-11-13 16:46:25 -080066 if not os.environ.has_key('PKG_CONFIG_PATH'):
67 os.environ['PKG_CONFIG_PATH'] = ':'.join([
68 '/usr/local/lib/pkgconfig',
69 '/opt/local/lib/pkgconfig'])
Alexander Afanasyev4a771362014-04-24 21:29:33 -070070 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
71 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010072
Davide Pesaventob499a602014-11-18 22:36:56 +010073 conf.checkDependency(name='librt', lib='rt', mandatory=False)
74 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
75
Alexander Afanasyev49343f62015-01-26 21:58:07 -080076 conf.check_cxx(header_name='ifaddrs.h', mandatory=False)
77 try:
78 for function in ['setegid', 'seteuid', 'sysconf', 'getgrnam_r', 'getpwnam_r']:
79 conf.check_cxx(function_name=function,
80 header_name=['unistd.h', 'pwd.h', 'grp.h'], mandatory=True)
81 conf.define('HAVE_PRIVILEGE_DROP_AND_ELEVATE', 1)
82 except:
83 Logs.warn('Dropping privileges is not supported on this platform')
84
Wentao Shang93ef6c92014-06-19 11:59:17 -040085 boost_libs = 'system chrono program_options random'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080086 if conf.options.with_tests:
87 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070088 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070089 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080090
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040091 if conf.options.with_other_tests:
92 conf.env['WITH_OTHER_TESTS'] = 1
93
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080094 conf.check_boost(lib=boost_libs)
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080095 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070096 Logs.error("Minimum required boost version is 1.48.0")
97 Logs.error("Please upgrade your distribution or install custom boost libraries" +
98 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080099 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800100
101 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -0700102 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +0100103
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700104 if not conf.options.without_libpcap:
Alexander Afanasyeve9186212014-08-23 20:15:48 -0700105 conf.check_asio_pcap_support()
106 if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
107 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
108 errmsg='not found, but required for Ethernet face support. '
109 'Specify --without-libpcap to disable Ethernet face support.')
110 else:
111 Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
112 'See http://redmine.named-data.net/issues/1877 for more details')
Davide Pesaventof0ae4422014-05-05 16:32:12 +0200113 if conf.env['HAVE_LIBPCAP']:
114 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
115 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -0700116
Alexander Afanasyev689569b2014-02-16 20:20:07 -0800117 conf.load('coverage')
118
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600119 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700120
Junxiao Shi759f7062014-11-29 10:19:22 -0700121 # disable assertions in release builds
122 if not conf.options.debug:
123 conf.define('NDEBUG', 1)
124
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700125 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800126
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700127def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700128 version(bld)
129
130 bld(features="subst",
131 name='version',
132 source='version.hpp.in',
133 target='version.hpp',
134 install_path=None,
135 VERSION_STRING=VERSION_BASE,
136 VERSION_BUILD=VERSION,
137 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
138 int(VERSION_SPLIT[1]) * 1000 +
139 int(VERSION_SPLIT[2]),
140 VERSION_MAJOR=VERSION_SPLIT[0],
141 VERSION_MINOR=VERSION_SPLIT[1],
142 VERSION_PATCH=VERSION_SPLIT[2],
143 )
144
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700145 core = bld(
146 target='core-objects',
147 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300148 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700149 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700150 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700151 includes='. core',
152 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300153 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700154 )
155
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800156 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700157 target='daemon-objects',
158 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700159 features='cxx',
160 source=bld.path.ant_glob(['daemon/**/*.cpp'],
161 excl=['daemon/face/ethernet-*.cpp',
162 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700163 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700164 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600165 use='core-objects WEBSOCKET',
166 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700167 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700168 )
169
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700170 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100171 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700172 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100173
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800174 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100175 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800176
Wentao Shang53df1632014-04-21 12:01:32 -0700177 if bld.env['HAVE_WEBSOCKET']:
178 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
179
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700180 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700181 features='cxx cxxprogram',
182 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700183 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600184 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600185
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700186 rib_objects = bld(
187 target='rib-objects',
188 name='rib-objects',
189 features='cxx',
190 source=bld.path.ant_glob(['rib/**/*.cpp'],
191 excl=['rib/main.cpp']),
192 use='core-objects',
193 )
194
195 bld(target='bin/nrd',
196 features='cxx cxxprogram',
197 source='rib/main.cpp',
198 use='rib-objects',
199 )
200
hilata198cadb2014-02-15 23:46:19 -0600201 for app in bld.path.ant_glob('tools/*.cpp'):
202 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700203 target='bin/%s' % (str(app.change_ext(''))),
204 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700205 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600206 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100207
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700208 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400209
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700210 bld(features="subst",
211 source='nfd.conf.sample.in',
212 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700213 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700214 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
215 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800216
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700217 if bld.env['SPHINX_BUILD']:
218 bld(features="sphinx",
219 builder="man",
220 outdir="docs/manpages",
221 config="docs/conf.py",
222 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700223 install_path="${MANDIR}/",
224 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700225
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700226 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700227 bld(features='subst',
228 source='tools/%s' % (str(script)),
229 target='bin/%s' % (str(script.change_ext(''))),
230 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700231 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700232 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700233
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700234 bld.install_files("${DATAROOTDIR}/ndn",
235 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
236
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700237def docs(bld):
238 from waflib import Options
239 Options.commands = ['doxygen', 'sphinx'] + Options.commands
240
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800241def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700242 version(bld)
243
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800244 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700245 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
246 else:
247 bld(features="subst",
248 name="doxygen-conf",
Alexander Afanasyev20757882014-08-25 22:39:08 -0700249 source=["docs/doxygen.conf.in",
250 "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
251 target=["docs/doxygen.conf",
252 "docs/named_data_theme/named_data_footer-with-analytics.html"],
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700253 VERSION=VERSION_BASE,
Alexander Afanasyev20757882014-08-25 22:39:08 -0700254 HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
255 if os.getenv('GOOGLE_ANALYTICS', None) \
256 else "../docs/named_data_theme/named_data_footer.html",
257 GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700258 )
259
260 bld(features="doxygen",
261 doxyfile='docs/doxygen.conf',
262 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700263
264def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700265 version(bld)
266
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700267 if not bld.env.SPHINX_BUILD:
268 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
269 else:
270 bld(features="sphinx",
271 outdir="docs",
272 source=bld.path.ant_glob('docs/**/*.rst'),
273 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700274 VERSION=VERSION_BASE)
275
276def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700277 if getattr(Context.g_module, 'VERSION_BASE', None):
278 return
279
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700280 Context.g_module.VERSION_BASE = Context.g_module.VERSION
281 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
282
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700283 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700284 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700285 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700286 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
287 stderr=None, stdin=None)
Alexander Afanasyev3b21fa32014-09-01 13:25:20 -0700288 out = str(p.communicate()[0].strip())
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700289 didGetVersion = (p.returncode == 0 and out != "")
290 if didGetVersion:
291 if out.startswith(GIT_TAG_PREFIX):
292 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
293 else:
294 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
295 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700296 pass
297
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700298 versionFile = ctx.path.find_node('VERSION')
299
300 if not didGetVersion and versionFile is not None:
301 try:
302 Context.g_module.VERSION = versionFile.read()
303 return
304 except (OSError, IOError):
305 pass
306
307 # version was obtained from git, update VERSION file if necessary
308 if versionFile is not None:
309 try:
310 version = versionFile.read()
311 if version == Context.g_module.VERSION:
312 return # no need to update
313 except (OSError, IOError):
314 Logs.warn("VERSION file exists, but not readable")
315 else:
316 versionFile = ctx.path.make_node('VERSION')
317
318 if versionFile is None:
319 return
320
321 try:
322 versionFile.write(Context.g_module.VERSION)
323 except (OSError, IOError):
324 Logs.warn("VERSION file is not writeable")
325
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700326def dist(ctx):
327 version(ctx)
328
329def distcheck(ctx):
330 version(ctx)