blob: a12985daa892a70612184c48e2e21fafb2b2d3f6 [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
Alexander Afanasyev262203b2015-01-26 16:39:59 -0800201 bld.recurse("tools")
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700202 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400203
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700204 bld(features="subst",
205 source='nfd.conf.sample.in',
206 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700207 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700208 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
209 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800210
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700211 if bld.env['SPHINX_BUILD']:
212 bld(features="sphinx",
213 builder="man",
214 outdir="docs/manpages",
215 config="docs/conf.py",
216 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700217 install_path="${MANDIR}/",
218 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700219
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)