blob: dac94321374661507c085e719bc098100896dd33 [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',
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070039 'doxygen', 'sphinx_build'],
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',
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070062 'doxygen', 'sphinx_build'])
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
Wentao Shang93ef6c92014-06-19 11:59:17 -040069 boost_libs = 'system chrono program_options random'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080070 if conf.options.with_tests:
71 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070072 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070073 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080074
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040075 if conf.options.with_other_tests:
76 conf.env['WITH_OTHER_TESTS'] = 1
77
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080078 conf.check_boost(lib=boost_libs)
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')
Wentao Shang53df1632014-04-21 12:01:32 -070086 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010087
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070088 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070089 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Davide Pesaventof0ae4422014-05-05 16:32:12 +020090
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
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700108 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800109
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700110def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700111 version(bld)
112
113 bld(features="subst",
114 name='version',
115 source='version.hpp.in',
116 target='version.hpp',
117 install_path=None,
118 VERSION_STRING=VERSION_BASE,
119 VERSION_BUILD=VERSION,
120 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
121 int(VERSION_SPLIT[1]) * 1000 +
122 int(VERSION_SPLIT[2]),
123 VERSION_MAJOR=VERSION_SPLIT[0],
124 VERSION_MINOR=VERSION_SPLIT[1],
125 VERSION_PATCH=VERSION_SPLIT[2],
126 )
127
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700128 core = bld(
129 target='core-objects',
130 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300131 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700132 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700133 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700134 includes='. core',
135 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300136 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700137 )
138
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800139 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700140 target='daemon-objects',
141 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700142 features='cxx',
143 source=bld.path.ant_glob(['daemon/**/*.cpp'],
144 excl=['daemon/face/ethernet-*.cpp',
145 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700146 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700147 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600148 use='core-objects WEBSOCKET',
149 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700150 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700151 )
152
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700153 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100154 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700155 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100156
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800157 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100158 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800159
Wentao Shang53df1632014-04-21 12:01:32 -0700160 if bld.env['HAVE_WEBSOCKET']:
161 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
162
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700163 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700164 features='cxx cxxprogram',
165 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700166 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600167 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600168
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700169 rib_objects = bld(
170 target='rib-objects',
171 name='rib-objects',
172 features='cxx',
173 source=bld.path.ant_glob(['rib/**/*.cpp'],
174 excl=['rib/main.cpp']),
175 use='core-objects',
176 )
177
178 bld(target='bin/nrd',
179 features='cxx cxxprogram',
180 source='rib/main.cpp',
181 use='rib-objects',
182 )
183
hilata198cadb2014-02-15 23:46:19 -0600184 for app in bld.path.ant_glob('tools/*.cpp'):
185 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700186 target='bin/%s' % (str(app.change_ext(''))),
187 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700188 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600189 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100190
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700191 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400192
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700193 bld(features="subst",
194 source='nfd.conf.sample.in',
195 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700196 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700197 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
198 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800199
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700200 if bld.env['SPHINX_BUILD']:
201 bld(features="sphinx",
202 builder="man",
203 outdir="docs/manpages",
204 config="docs/conf.py",
205 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700206 install_path="${MANDIR}/",
207 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700208
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700209 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700210 bld(features='subst',
211 source='tools/%s' % (str(script)),
212 target='bin/%s' % (str(script.change_ext(''))),
213 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700214 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700215 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700216
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700217 bld.install_files("${DATAROOTDIR}/ndn",
218 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
219
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700220def docs(bld):
221 from waflib import Options
222 Options.commands = ['doxygen', 'sphinx'] + Options.commands
223
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800224def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700225 version(bld)
226
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800227 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700228 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
229 else:
230 bld(features="subst",
231 name="doxygen-conf",
Alexander Afanasyev20757882014-08-25 22:39:08 -0700232 source=["docs/doxygen.conf.in",
233 "docs/named_data_theme/named_data_footer-with-analytics.html.in"],
234 target=["docs/doxygen.conf",
235 "docs/named_data_theme/named_data_footer-with-analytics.html"],
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700236 VERSION=VERSION_BASE,
Alexander Afanasyev20757882014-08-25 22:39:08 -0700237 HTML_FOOTER="../build/docs/named_data_theme/named_data_footer-with-analytics.html" \
238 if os.getenv('GOOGLE_ANALYTICS', None) \
239 else "../docs/named_data_theme/named_data_footer.html",
240 GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ""),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700241 )
242
243 bld(features="doxygen",
244 doxyfile='docs/doxygen.conf',
245 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700246
247def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700248 version(bld)
249
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700250 if not bld.env.SPHINX_BUILD:
251 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
252 else:
253 bld(features="sphinx",
254 outdir="docs",
255 source=bld.path.ant_glob('docs/**/*.rst'),
256 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700257 VERSION=VERSION_BASE)
258
259def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700260 if getattr(Context.g_module, 'VERSION_BASE', None):
261 return
262
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700263 Context.g_module.VERSION_BASE = Context.g_module.VERSION
264 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
265
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700266 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700267 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700268 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700269 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
270 stderr=None, stdin=None)
Alexander Afanasyev3b21fa32014-09-01 13:25:20 -0700271 out = str(p.communicate()[0].strip())
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700272 didGetVersion = (p.returncode == 0 and out != "")
273 if didGetVersion:
274 if out.startswith(GIT_TAG_PREFIX):
275 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
276 else:
277 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
278 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700279 pass
280
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700281 versionFile = ctx.path.find_node('VERSION')
282
283 if not didGetVersion and versionFile is not None:
284 try:
285 Context.g_module.VERSION = versionFile.read()
286 return
287 except (OSError, IOError):
288 pass
289
290 # version was obtained from git, update VERSION file if necessary
291 if versionFile is not None:
292 try:
293 version = versionFile.read()
294 if version == Context.g_module.VERSION:
295 return # no need to update
296 except (OSError, IOError):
297 Logs.warn("VERSION file exists, but not readable")
298 else:
299 versionFile = ctx.path.make_node('VERSION')
300
301 if versionFile is None:
302 return
303
304 try:
305 versionFile.write(Context.g_module.VERSION)
306 except (OSError, IOError):
307 Logs.warn("VERSION file is not writeable")
308
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700309def dist(ctx):
310 version(ctx)
311
312def distcheck(ctx):
313 version(ctx)