blob: 93c6a2d90253df3662c3c7736d18fa5b00611f79 [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 Fanb07788a2014-03-31 12:15:36 -0600193 bld(features='subst',
194 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700195 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600196 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700197 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700198 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600199
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
Junxiao Shid71d84c2014-04-18 17:22:50 -0700209 for script in bld.path.ant_glob('tools/*.sh'):
210 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 Afanasyev284257b2014-04-11 14:16:51 -0700217def docs(bld):
218 from waflib import Options
219 Options.commands = ['doxygen', 'sphinx'] + Options.commands
220
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800221def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700222 version(bld)
223
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800224 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700225 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
226 else:
227 bld(features="subst",
228 name="doxygen-conf",
229 source="docs/doxygen.conf.in",
230 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700231 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700232 )
233
234 bld(features="doxygen",
235 doxyfile='docs/doxygen.conf',
236 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700237
238def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700239 version(bld)
240
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700241 if not bld.env.SPHINX_BUILD:
242 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
243 else:
244 bld(features="sphinx",
245 outdir="docs",
246 source=bld.path.ant_glob('docs/**/*.rst'),
247 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700248 VERSION=VERSION_BASE)
249
250def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700251 if getattr(Context.g_module, 'VERSION_BASE', None):
252 return
253
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700254 Context.g_module.VERSION_BASE = Context.g_module.VERSION
255 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
256
257 try:
258 cmd = ['git', 'describe', '--match', 'NFD-*']
259 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
260 stderr=None, stdin=None)
261 out = p.communicate()[0].strip()
262 if p.returncode == 0 and out != "":
263 Context.g_module.VERSION = out[4:]
264 except:
265 pass
266
267def dist(ctx):
268 version(ctx)
269
270def distcheck(ctx):
271 version(ctx)