blob: 548fad36886284d178dfb896ad3695e263d655e2 [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 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
Wentao Shang93ef6c92014-06-19 11:59:17 -040076 boost_libs = 'system chrono program_options random'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080077 if conf.options.with_tests:
78 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070079 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070080 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080081
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040082 if conf.options.with_other_tests:
83 conf.env['WITH_OTHER_TESTS'] = 1
84
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080085 conf.check_boost(lib=boost_libs)
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080086 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070087 Logs.error("Minimum required boost version is 1.48.0")
88 Logs.error("Please upgrade your distribution or install custom boost libraries" +
89 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080090 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080091
92 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -070093 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010094
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070095 if not conf.options.without_libpcap:
Alexander Afanasyeve9186212014-08-23 20:15:48 -070096 conf.check_asio_pcap_support()
97 if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
98 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
99 errmsg='not found, but required for Ethernet face support. '
100 'Specify --without-libpcap to disable Ethernet face support.')
101 else:
102 Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
103 'See http://redmine.named-data.net/issues/1877 for more details')
Davide Pesaventof0ae4422014-05-05 16:32:12 +0200104 if conf.env['HAVE_LIBPCAP']:
105 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
106 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -0700107
Alexander Afanasyev689569b2014-02-16 20:20:07 -0800108 conf.load('coverage')
109
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600110 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700111
Junxiao Shi759f7062014-11-29 10:19:22 -0700112 # disable assertions in release builds
113 if not conf.options.debug:
114 conf.define('NDEBUG', 1)
115
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700116 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800117
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700118def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700119 version(bld)
120
121 bld(features="subst",
122 name='version',
123 source='version.hpp.in',
124 target='version.hpp',
125 install_path=None,
126 VERSION_STRING=VERSION_BASE,
127 VERSION_BUILD=VERSION,
128 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
129 int(VERSION_SPLIT[1]) * 1000 +
130 int(VERSION_SPLIT[2]),
131 VERSION_MAJOR=VERSION_SPLIT[0],
132 VERSION_MINOR=VERSION_SPLIT[1],
133 VERSION_PATCH=VERSION_SPLIT[2],
134 )
135
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700136 core = bld(
137 target='core-objects',
138 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300139 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700140 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700141 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700142 includes='. core',
143 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300144 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700145 )
146
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800147 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700148 target='daemon-objects',
149 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700150 features='cxx',
151 source=bld.path.ant_glob(['daemon/**/*.cpp'],
152 excl=['daemon/face/ethernet-*.cpp',
153 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700154 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700155 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600156 use='core-objects WEBSOCKET',
157 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700158 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700159 )
160
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700161 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100162 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700163 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100164
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800165 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100166 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800167
Wentao Shang53df1632014-04-21 12:01:32 -0700168 if bld.env['HAVE_WEBSOCKET']:
169 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
170
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700171 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700172 features='cxx cxxprogram',
173 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700174 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600175 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600176
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700177 rib_objects = bld(
178 target='rib-objects',
179 name='rib-objects',
180 features='cxx',
181 source=bld.path.ant_glob(['rib/**/*.cpp'],
182 excl=['rib/main.cpp']),
183 use='core-objects',
184 )
185
186 bld(target='bin/nrd',
187 features='cxx cxxprogram',
188 source='rib/main.cpp',
189 use='rib-objects',
190 )
191
hilata198cadb2014-02-15 23:46:19 -0600192 for app in bld.path.ant_glob('tools/*.cpp'):
193 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700194 target='bin/%s' % (str(app.change_ext(''))),
195 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700196 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600197 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100198
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700199 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400200
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700201 bld(features="subst",
202 source='nfd.conf.sample.in',
203 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700204 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700205 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
206 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800207
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700208 if bld.env['SPHINX_BUILD']:
209 bld(features="sphinx",
210 builder="man",
211 outdir="docs/manpages",
212 config="docs/conf.py",
213 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700214 install_path="${MANDIR}/",
215 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700216
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700217 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700218 bld(features='subst',
219 source='tools/%s' % (str(script)),
220 target='bin/%s' % (str(script.change_ext(''))),
221 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700222 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700223 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700224
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700225 bld.install_files("${DATAROOTDIR}/ndn",
226 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
227
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700228def docs(bld):
229 from waflib import Options
230 Options.commands = ['doxygen', 'sphinx'] + Options.commands
231
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800232def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700233 version(bld)
234
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800235 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700236 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
237 else:
238 bld(features="subst",
239 name="doxygen-conf",
Alexander Afanasyev20757882014-08-25 22:39:08 -0700240 source=["docs/doxygen.conf.in",
241 "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
242 target=["docs/doxygen.conf",
243 "docs/named_data_theme/named_data_footer-with-analytics.html"],
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700244 VERSION=VERSION_BASE,
Alexander Afanasyev20757882014-08-25 22:39:08 -0700245 HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
246 if os.getenv('GOOGLE_ANALYTICS', None) \
247 else "../docs/named_data_theme/named_data_footer.html",
248 GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700249 )
250
251 bld(features="doxygen",
252 doxyfile='docs/doxygen.conf',
253 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700254
255def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700256 version(bld)
257
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700258 if not bld.env.SPHINX_BUILD:
259 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
260 else:
261 bld(features="sphinx",
262 outdir="docs",
263 source=bld.path.ant_glob('docs/**/*.rst'),
264 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700265 VERSION=VERSION_BASE)
266
267def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700268 if getattr(Context.g_module, 'VERSION_BASE', None):
269 return
270
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700271 Context.g_module.VERSION_BASE = Context.g_module.VERSION
272 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
273
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700274 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700275 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700276 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700277 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
278 stderr=None, stdin=None)
Alexander Afanasyev3b21fa32014-09-01 13:25:20 -0700279 out = str(p.communicate()[0].strip())
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700280 didGetVersion = (p.returncode == 0 and out != "")
281 if didGetVersion:
282 if out.startswith(GIT_TAG_PREFIX):
283 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
284 else:
285 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
286 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700287 pass
288
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700289 versionFile = ctx.path.find_node('VERSION')
290
291 if not didGetVersion and versionFile is not None:
292 try:
293 Context.g_module.VERSION = versionFile.read()
294 return
295 except (OSError, IOError):
296 pass
297
298 # version was obtained from git, update VERSION file if necessary
299 if versionFile is not None:
300 try:
301 version = versionFile.read()
302 if version == Context.g_module.VERSION:
303 return # no need to update
304 except (OSError, IOError):
305 Logs.warn("VERSION file exists, but not readable")
306 else:
307 versionFile = ctx.path.make_node('VERSION')
308
309 if versionFile is None:
310 return
311
312 try:
313 versionFile.write(Context.g_module.VERSION)
314 except (OSError, IOError):
315 Logs.warn("VERSION file is not writeable")
316
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700317def dist(ctx):
318 version(ctx)
319
320def distcheck(ctx):
321 version(ctx)