blob: ba1c6eb6947f0b0367908a0b2627c08b97939644 [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 Afanasyev8552a382014-05-15 20:13:42 -070037 'default-compiler-flags', 'coverage', 'pch',
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 Afanasyev8552a382014-05-15 20:13:42 -070059 'default-compiler-flags', 'pch',
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:
91 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
92 errmsg='not found, but required for Ethernet face support. '
93 'Specify --without-libpcap to disable Ethernet face support.')
Davide Pesaventof0ae4422014-05-05 16:32:12 +020094 if conf.env['HAVE_LIBPCAP']:
95 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
96 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070097
Alexander Afanasyev689569b2014-02-16 20:20:07 -080098 conf.load('coverage')
99
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600100 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700101
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700102 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800103
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700104def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700105 version(bld)
106
107 bld(features="subst",
108 name='version',
109 source='version.hpp.in',
110 target='version.hpp',
111 install_path=None,
112 VERSION_STRING=VERSION_BASE,
113 VERSION_BUILD=VERSION,
114 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
115 int(VERSION_SPLIT[1]) * 1000 +
116 int(VERSION_SPLIT[2]),
117 VERSION_MAJOR=VERSION_SPLIT[0],
118 VERSION_MINOR=VERSION_SPLIT[1],
119 VERSION_PATCH=VERSION_SPLIT[2],
120 )
121
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700122 core = bld(
123 target='core-objects',
124 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300125 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700126 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700127 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700128 includes='. core',
129 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300130 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700131 )
132
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800133 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700134 target='daemon-objects',
135 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700136 features='cxx',
137 source=bld.path.ant_glob(['daemon/**/*.cpp'],
138 excl=['daemon/face/ethernet-*.cpp',
139 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700140 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700141 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600142 use='core-objects WEBSOCKET',
143 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700144 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700145 )
146
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700147 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100148 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700149 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100150
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800151 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100152 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800153
Wentao Shang53df1632014-04-21 12:01:32 -0700154 if bld.env['HAVE_WEBSOCKET']:
155 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
156
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700157 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700158 features='cxx cxxprogram',
159 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700160 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600161 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600162
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700163 rib_objects = bld(
164 target='rib-objects',
165 name='rib-objects',
166 features='cxx',
167 source=bld.path.ant_glob(['rib/**/*.cpp'],
168 excl=['rib/main.cpp']),
169 use='core-objects',
170 )
171
172 bld(target='bin/nrd',
173 features='cxx cxxprogram',
174 source='rib/main.cpp',
175 use='rib-objects',
176 )
177
hilata198cadb2014-02-15 23:46:19 -0600178 for app in bld.path.ant_glob('tools/*.cpp'):
179 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700180 target='bin/%s' % (str(app.change_ext(''))),
181 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700182 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600183 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100184
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700185 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400186
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700187 bld(features="subst",
188 source='nfd.conf.sample.in',
189 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700190 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700191 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
192 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800193
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700194 if bld.env['SPHINX_BUILD']:
195 bld(features="sphinx",
196 builder="man",
197 outdir="docs/manpages",
198 config="docs/conf.py",
199 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700200 install_path="${MANDIR}/",
201 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700202
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700203 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700204 bld(features='subst',
205 source='tools/%s' % (str(script)),
206 target='bin/%s' % (str(script.change_ext(''))),
207 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700208 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700209 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700210
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700211 bld.install_files("${DATAROOTDIR}/ndn",
212 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
213
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700214def docs(bld):
215 from waflib import Options
216 Options.commands = ['doxygen', 'sphinx'] + Options.commands
217
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800218def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700219 version(bld)
220
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800221 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700222 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
223 else:
224 bld(features="subst",
225 name="doxygen-conf",
226 source="docs/doxygen.conf.in",
227 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700228 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700229 )
230
231 bld(features="doxygen",
232 doxyfile='docs/doxygen.conf',
233 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700234
235def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700236 version(bld)
237
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700238 if not bld.env.SPHINX_BUILD:
239 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
240 else:
241 bld(features="sphinx",
242 outdir="docs",
243 source=bld.path.ant_glob('docs/**/*.rst'),
244 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700245 VERSION=VERSION_BASE)
246
247def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700248 if getattr(Context.g_module, 'VERSION_BASE', None):
249 return
250
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700251 Context.g_module.VERSION_BASE = Context.g_module.VERSION
252 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
253
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700254 didGetVersion = False
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700255 try:
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700256 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700257 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
258 stderr=None, stdin=None)
259 out = p.communicate()[0].strip()
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700260 didGetVersion = (p.returncode == 0 and out != "")
261 if didGetVersion:
262 if out.startswith(GIT_TAG_PREFIX):
263 Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
264 else:
265 Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
266 except OSError:
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700267 pass
268
Alexander Afanasyev48f5a3c2014-08-22 22:33:01 -0700269 versionFile = ctx.path.find_node('VERSION')
270
271 if not didGetVersion and versionFile is not None:
272 try:
273 Context.g_module.VERSION = versionFile.read()
274 return
275 except (OSError, IOError):
276 pass
277
278 # version was obtained from git, update VERSION file if necessary
279 if versionFile is not None:
280 try:
281 version = versionFile.read()
282 if version == Context.g_module.VERSION:
283 return # no need to update
284 except (OSError, IOError):
285 Logs.warn("VERSION file exists, but not readable")
286 else:
287 versionFile = ctx.path.make_node('VERSION')
288
289 if versionFile is None:
290 return
291
292 try:
293 versionFile.write(Context.g_module.VERSION)
294 except (OSError, IOError):
295 Logs.warn("VERSION file is not writeable")
296
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700297def dist(ctx):
298 version(ctx)
299
300def distcheck(ctx):
301 version(ctx)