blob: 553529b3b70028f7d73e96267791f6f0762f528c [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 Afanasyev97e4cac2014-03-28 10:55:11 -070030
Alexander Afanasyevb47d5382014-05-05 14:35:03 -070031from waflib import Logs, Utils, Context
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080032
33def options(opt):
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070034 opt.load(['compiler_cxx', 'gnu_dirs'])
Wentao Shang53df1632014-04-21 12:01:32 -070035 opt.load(['boost', 'unix-socket', 'dependency-checker', 'websocket',
Alexander Afanasyev8552a382014-05-15 20:13:42 -070036 'default-compiler-flags', 'coverage', 'pch',
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070037 'doxygen', 'sphinx_build'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070038 tooldir=['.waf-tools'])
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080039
40 nfdopt = opt.add_option_group('NFD Options')
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070041 opt.addUnixOptions(nfdopt)
Wentao Shang53df1632014-04-21 12:01:32 -070042 opt.addWebsocketOptions(nfdopt)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070043 opt.addDependencyOptions(nfdopt, 'libpcap')
44 nfdopt.add_option('--without-libpcap', action='store_true', default=False,
45 dest='without_libpcap',
46 help='''Disable libpcap (Ethernet face support will be disabled)''')
47
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070048 opt.addDependencyOptions(nfdopt, 'librt', '(optional)')
49 opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
50
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070051 nfdopt.add_option('--with-tests', action='store_true', default=False,
52 dest='with_tests', help='''Build unit tests''')
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040053 nfdopt.add_option('--with-other-tests', action='store_true', default=False,
54 dest='with_other_tests', help='''Build other tests''')
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060055
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080056def configure(conf):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070057 conf.load(['compiler_cxx', 'gnu_dirs',
Alexander Afanasyev8552a382014-05-15 20:13:42 -070058 'default-compiler-flags', 'pch',
Wentao Shang53df1632014-04-21 12:01:32 -070059 'boost', 'dependency-checker', 'websocket',
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070060 'doxygen', 'sphinx_build'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070061
Davide Pesaventof0ae4422014-05-05 16:32:12 +020062 conf.find_program('bash', var='BASH')
63
Alexander Afanasyev4a771362014-04-24 21:29:33 -070064 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
65 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010066
Wentao Shang93ef6c92014-06-19 11:59:17 -040067 boost_libs = 'system chrono program_options random'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080068 if conf.options.with_tests:
69 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070070 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070071 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080072
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040073 if conf.options.with_other_tests:
74 conf.env['WITH_OTHER_TESTS'] = 1
75
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080076 conf.check_boost(lib=boost_libs)
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080077 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070078 Logs.error("Minimum required boost version is 1.48.0")
79 Logs.error("Please upgrade your distribution or install custom boost libraries" +
80 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080081 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080082
83 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -070084 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010085
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070086 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070087 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Davide Pesaventof0ae4422014-05-05 16:32:12 +020088
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070089 if not conf.options.without_libpcap:
90 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
91 errmsg='not found, but required for Ethernet face support. '
92 'Specify --without-libpcap to disable Ethernet face support.')
Davide Pesaventof0ae4422014-05-05 16:32:12 +020093 if conf.env['HAVE_LIBPCAP']:
94 conf.check_cxx(function_name='pcap_set_immediate_mode', header_name='pcap/pcap.h',
95 cxxflags='-Wno-error', use='LIBPCAP', mandatory=False)
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070096
Alexander Afanasyev689569b2014-02-16 20:20:07 -080097 conf.load('coverage')
98
Steve DiBenedettofbb40a82014-03-11 19:40:15 -060099 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700100
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700101 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800102
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700103def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700104 version(bld)
105
106 bld(features="subst",
107 name='version',
108 source='version.hpp.in',
109 target='version.hpp',
110 install_path=None,
111 VERSION_STRING=VERSION_BASE,
112 VERSION_BUILD=VERSION,
113 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
114 int(VERSION_SPLIT[1]) * 1000 +
115 int(VERSION_SPLIT[2]),
116 VERSION_MAJOR=VERSION_SPLIT[0],
117 VERSION_MINOR=VERSION_SPLIT[1],
118 VERSION_PATCH=VERSION_SPLIT[2],
119 )
120
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700121 core = bld(
122 target='core-objects',
123 name='core-objects',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300124 features='cxx pch',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700125 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700126 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700127 includes='. core',
128 export_includes='. core',
Alexander Afanasyev58ea4582014-05-30 08:38:56 +0300129 headers='common.hpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700130 )
131
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800132 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700133 target='daemon-objects',
134 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700135 features='cxx',
136 source=bld.path.ant_glob(['daemon/**/*.cpp'],
137 excl=['daemon/face/ethernet-*.cpp',
138 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700139 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700140 'daemon/main.cpp']),
Steve DiBenedettoef04f272014-06-04 14:28:31 -0600141 use='core-objects WEBSOCKET',
142 includes='daemon',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700143 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700144 )
145
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700146 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100147 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700148 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100149
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800150 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100151 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800152
Wentao Shang53df1632014-04-21 12:01:32 -0700153 if bld.env['HAVE_WEBSOCKET']:
154 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
155
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700156 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700157 features='cxx cxxprogram',
158 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700159 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600160 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600161
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700162 rib_objects = bld(
163 target='rib-objects',
164 name='rib-objects',
165 features='cxx',
166 source=bld.path.ant_glob(['rib/**/*.cpp'],
167 excl=['rib/main.cpp']),
168 use='core-objects',
169 )
170
171 bld(target='bin/nrd',
172 features='cxx cxxprogram',
173 source='rib/main.cpp',
174 use='rib-objects',
175 )
176
hilata198cadb2014-02-15 23:46:19 -0600177 for app in bld.path.ant_glob('tools/*.cpp'):
178 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700179 target='bin/%s' % (str(app.change_ext(''))),
180 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700181 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600182 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100183
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700184 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400185
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700186 bld(features="subst",
187 source='nfd.conf.sample.in',
188 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700189 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700190 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
191 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800192
Chengyu Fan45d1a762014-07-08 14:21:32 -0600193 for file in bld.path.ant_glob('tools/nfd-status-http-server-files/*'):
194 bld(features="subst",
195 source='tools/nfd-status-http-server-files/%s' % (str(file)),
196 target='nfd-status-http-server/%s' % (str(file)),
197 install_path="${DATAROOTDIR}/ndn",
198 VERSION=VERSION)
199
Chengyu Fanb07788a2014-03-31 12:15:36 -0600200 bld(features='subst',
201 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700202 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600203 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700204 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700205 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600206
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700207 if bld.env['SPHINX_BUILD']:
208 bld(features="sphinx",
209 builder="man",
210 outdir="docs/manpages",
211 config="docs/conf.py",
212 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700213 install_path="${MANDIR}/",
214 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700215
Junxiao Shid71d84c2014-04-18 17:22:50 -0700216 for script in bld.path.ant_glob('tools/*.sh'):
217 bld(features='subst',
218 source='tools/%s' % (str(script)),
219 target='bin/%s' % (str(script.change_ext(''))),
220 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700221 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700222 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700223
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700224def docs(bld):
225 from waflib import Options
226 Options.commands = ['doxygen', 'sphinx'] + Options.commands
227
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800228def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700229 version(bld)
230
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800231 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700232 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
233 else:
234 bld(features="subst",
235 name="doxygen-conf",
236 source="docs/doxygen.conf.in",
237 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700238 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700239 )
240
241 bld(features="doxygen",
242 doxyfile='docs/doxygen.conf',
243 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700244
245def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700246 version(bld)
247
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700248 if not bld.env.SPHINX_BUILD:
249 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
250 else:
251 bld(features="sphinx",
252 outdir="docs",
253 source=bld.path.ant_glob('docs/**/*.rst'),
254 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700255 VERSION=VERSION_BASE)
256
257def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700258 if getattr(Context.g_module, 'VERSION_BASE', None):
259 return
260
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700261 Context.g_module.VERSION_BASE = Context.g_module.VERSION
262 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
263
264 try:
265 cmd = ['git', 'describe', '--match', 'NFD-*']
266 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
267 stderr=None, stdin=None)
268 out = p.communicate()[0].strip()
269 if p.returncode == 0 and out != "":
270 Context.g_module.VERSION = out[4:]
271 except:
272 pass
273
274def dist(ctx):
275 version(ctx)
276
277def distcheck(ctx):
278 version(ctx)