blob: e985314b49de1c499045f65874d6c031b0a4d01a [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 Afanasyev2aa39622014-01-22 11:51:11 -080033
34def options(opt):
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070035 opt.load(['compiler_cxx', 'gnu_dirs'])
Wentao Shang53df1632014-04-21 12:01:32 -070036 opt.load(['boost', 'unix-socket', 'dependency-checker', 'websocket',
Alexander Afanasyeve9186212014-08-23 20:15:48 -070037 'default-compiler-flags', 'coverage', 'pch', 'boost-kqueue',
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070038 'doxygen', 'sphinx_build'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070039 tooldir=['.waf-tools'])
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080040
41 nfdopt = opt.add_option_group('NFD Options')
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070042 opt.addUnixOptions(nfdopt)
Wentao Shang53df1632014-04-21 12:01:32 -070043 opt.addWebsocketOptions(nfdopt)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070044 opt.addDependencyOptions(nfdopt, 'libpcap')
45 nfdopt.add_option('--without-libpcap', action='store_true', default=False,
46 dest='without_libpcap',
47 help='''Disable libpcap (Ethernet face support will be disabled)''')
48
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070049 opt.addDependencyOptions(nfdopt, 'librt', '(optional)')
50 opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
51
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070052 nfdopt.add_option('--with-tests', action='store_true', default=False,
53 dest='with_tests', help='''Build unit tests''')
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040054 nfdopt.add_option('--with-other-tests', action='store_true', default=False,
55 dest='with_other_tests', help='''Build other tests''')
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060056
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080057def configure(conf):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070058 conf.load(['compiler_cxx', 'gnu_dirs',
Alexander Afanasyeve9186212014-08-23 20:15:48 -070059 'default-compiler-flags', 'pch', 'boost-kqueue',
Wentao Shang53df1632014-04-21 12:01:32 -070060 'boost', 'dependency-checker', 'websocket',
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070061 'doxygen', 'sphinx_build'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070062
Davide Pesaventof0ae4422014-05-05 16:32:12 +020063 conf.find_program('bash', var='BASH')
64
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
Wentao Shang93ef6c92014-06-19 11:59:17 -040068 boost_libs = 'system chrono program_options random'
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)
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080078 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070079 Logs.error("Minimum required boost version is 1.48.0")
80 Logs.error("Please upgrade your distribution or install custom boost libraries" +
81 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080082 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080083
84 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -070085 conf.checkWebsocket(mandatory=True)
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)
Davide Pesaventof0ae4422014-05-05 16:32:12 +020089
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070090 if not conf.options.without_libpcap:
Alexander Afanasyeve9186212014-08-23 20:15:48 -070091 conf.check_asio_pcap_support()
92 if conf.env['HAVE_ASIO_PCAP_SUPPORT']:
93 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
94 errmsg='not found, but required for Ethernet face support. '
95 'Specify --without-libpcap to disable Ethernet face support.')
96 else:
97 Logs.warn('Warning: Ethernet face support is not supported on this platform with Boost libraries version 1.56. '
98 'See http://redmine.named-data.net/issues/1877 for more details')
Davide Pesaventof0ae4422014-05-05 16:32:12 +020099 if conf.env['HAVE_LIBPCAP']:
100 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
101 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -0700102
Alexander Afanasyev689569b2014-02-16 20:20:07 -0800103 conf.load('coverage')
104
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600105 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700106
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700107 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800108
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700109def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700110 version(bld)
111
112 bld(features="subst",
113 name='version',
114 source='version.hpp.in',
115 target='version.hpp',
116 install_path=None,
117 VERSION_STRING=VERSION_BASE,
118 VERSION_BUILD=VERSION,
119 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
120 int(VERSION_SPLIT[1]) * 1000 +
121 int(VERSION_SPLIT[2]),
122 VERSION_MAJOR=VERSION_SPLIT[0],
123 VERSION_MINOR=VERSION_SPLIT[1],
124 VERSION_PATCH=VERSION_SPLIT[2],
125 )
126
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700127 core = bld(
128 target='core-objects',
129 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300130 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700131 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700132 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700133 includes='. core',
134 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300135 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700136 )
137
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800138 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700139 target='daemon-objects',
140 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700141 features='cxx',
142 source=bld.path.ant_glob(['daemon/**/*.cpp'],
143 excl=['daemon/face/ethernet-*.cpp',
144 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700145 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700146 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600147 use='core-objects WEBSOCKET',
148 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700149 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700150 )
151
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700152 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100153 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700154 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100155
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800156 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100157 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800158
Wentao Shang53df1632014-04-21 12:01:32 -0700159 if bld.env['HAVE_WEBSOCKET']:
160 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
161
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700162 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700163 features='cxx cxxprogram',
164 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700165 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600166 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600167
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700168 rib_objects = bld(
169 target='rib-objects',
170 name='rib-objects',
171 features='cxx',
172 source=bld.path.ant_glob(['rib/**/*.cpp'],
173 excl=['rib/main.cpp']),
174 use='core-objects',
175 )
176
177 bld(target='bin/nrd',
178 features='cxx cxxprogram',
179 source='rib/main.cpp',
180 use='rib-objects',
181 )
182
hilata198cadb2014-02-15 23:46:19 -0600183 for app in bld.path.ant_glob('tools/*.cpp'):
184 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700185 target='bin/%s' % (str(app.change_ext(''))),
186 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700187 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600188 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100189
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700190 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400191
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700192 bld(features="subst",
193 source='nfd.conf.sample.in',
194 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700195 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700196 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
197 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800198
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700199 if bld.env['SPHINX_BUILD']:
200 bld(features="sphinx",
201 builder="man",
202 outdir="docs/manpages",
203 config="docs/conf.py",
204 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700205 install_path="${MANDIR}/",
206 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700207
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700208 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700209 bld(features='subst',
210 source='tools/%s' % (str(script)),
211 target='bin/%s' % (str(script.change_ext(''))),
212 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700213 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700214 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700215
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700216 bld.install_files("${DATAROOTDIR}/ndn",
217 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
218
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700219def docs(bld):
220 from waflib import Options
221 Options.commands = ['doxygen', 'sphinx'] + Options.commands
222
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800223def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700224 version(bld)
225
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800226 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700227 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
228 else:
229 bld(features="subst",
230 name="doxygen-conf",
231 source="docs/doxygen.conf.in",
232 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700233 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700234 )
235
236 bld(features="doxygen",
237 doxyfile='docs/doxygen.conf',
238 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700239
240def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700241 version(bld)
242
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700243 if not bld.env.SPHINX_BUILD:
244 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
245 else:
246 bld(features="sphinx",
247 outdir="docs",
248 source=bld.path.ant_glob('docs/**/*.rst'),
249 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700250 VERSION=VERSION_BASE)
251
252def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700253 if getattr(Context.g_module, 'VERSION_BASE', None):
254 return
255
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700256 Context.g_module.VERSION_BASE = Context.g_module.VERSION
257 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
258
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700259 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700260 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700261 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700262 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
263 stderr=None, stdin=None)
264 out = p.communicate()[0].strip()
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700265 didGetVersion = (p.returncode == 0 and out != "")
266 if didGetVersion:
267 if out.startswith(GIT_TAG_PREFIX):
268 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
269 else:
270 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
271 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700272 pass
273
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700274 versionFile = ctx.path.find_node('VERSION')
275
276 if not didGetVersion and versionFile is not None:
277 try:
278 Context.g_module.VERSION = versionFile.read()
279 return
280 except (OSError, IOError):
281 pass
282
283 # version was obtained from git, update VERSION file if necessary
284 if versionFile is not None:
285 try:
286 version = versionFile.read()
287 if version == Context.g_module.VERSION:
288 return # no need to update
289 except (OSError, IOError):
290 Logs.warn("VERSION file exists, but not readable")
291 else:
292 versionFile = ctx.path.make_node('VERSION')
293
294 if versionFile is None:
295 return
296
297 try:
298 versionFile.write(Context.g_module.VERSION)
299 except (OSError, IOError):
300 Logs.warn("VERSION file is not writeable")
301
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700302def dist(ctx):
303 version(ctx)
304
305def distcheck(ctx):
306 version(ctx)