blob: 7a03afd720494365c979f041b5964951c3517d2e [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
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700193 if bld.env['SPHINX_BUILD']:
194 bld(features="sphinx",
195 builder="man",
196 outdir="docs/manpages",
197 config="docs/conf.py",
198 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700199 install_path="${MANDIR}/",
200 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700201
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700202 for script in bld.path.ant_glob(['tools/*.sh', 'tools/*.py']):
Junxiao Shid71d84c2014-04-18 17:22:50 -0700203 bld(features='subst',
204 source='tools/%s' % (str(script)),
205 target='bin/%s' % (str(script.change_ext(''))),
206 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700207 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700208 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700209
Alexander Afanasyev8a093762014-07-16 18:43:09 -0700210 bld.install_files("${DATAROOTDIR}/ndn",
211 bld.path.ant_glob('tools/nfd-status-http-server-files/*'))
212
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700213def docs(bld):
214 from waflib import Options
215 Options.commands = ['doxygen', 'sphinx'] + Options.commands
216
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800217def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700218 version(bld)
219
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800220 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700221 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
222 else:
223 bld(features="subst",
224 name="doxygen-conf",
225 source="docs/doxygen.conf.in",
226 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700227 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700228 )
229
230 bld(features="doxygen",
231 doxyfile='docs/doxygen.conf',
232 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700233
234def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700235 version(bld)
236
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700237 if not bld.env.SPHINX_BUILD:
238 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
239 else:
240 bld(features="sphinx",
241 outdir="docs",
242 source=bld.path.ant_glob('docs/**/*.rst'),
243 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700244 VERSION=VERSION_BASE)
245
246def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700247 if getattr(Context.g_module, 'VERSION_BASE', None):
248 return
249
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700250 Context.g_module.VERSION_BASE = Context.g_module.VERSION
251 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
252
253 try:
254 cmd = ['git', 'describe', '--match', 'NFD-*']
255 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
256 stderr=None, stdin=None)
257 out = p.communicate()[0].strip()
258 if p.returncode == 0 and out != "":
259 Context.g_module.VERSION = out[4:]
260 except:
261 pass
262
263def dist(ctx):
264 version(ctx)
265
266def distcheck(ctx):
267 version(ctx)