blob: c43a556923229e275ca46b4db1cc2b5c8d5ad76b [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
Alexander Afanasyevb47d5382014-05-05 14:35:03 -070026VERSION = "0.1.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
Alexander Afanasyev82afa1a2014-03-20 16:56:56 -070067 boost_libs = 'system chrono program_options'
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',
124 features='cxx',
125 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 Afanasyev8552a382014-05-15 20:13:42 -0700129 pch='common-pch.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']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700141 use='core-objects',
Wentao Shang53df1632014-04-21 12:01:32 -0700142 includes='daemon websocketpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700143 export_includes='daemon',
Alexander Afanasyev8552a382014-05-15 20:13:42 -0700144 pch='common-pch.hpp',
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
Chengyu Fanb07788a2014-03-31 12:15:36 -0600194 bld(features='subst',
195 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700196 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600197 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700198 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700199 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600200
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700201 if bld.env['SPHINX_BUILD']:
202 bld(features="sphinx",
203 builder="man",
204 outdir="docs/manpages",
205 config="docs/conf.py",
206 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700207 install_path="${MANDIR}/",
208 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700209
Junxiao Shid71d84c2014-04-18 17:22:50 -0700210 for script in bld.path.ant_glob('tools/*.sh'):
211 bld(features='subst',
212 source='tools/%s' % (str(script)),
213 target='bin/%s' % (str(script.change_ext(''))),
214 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700215 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700216 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700217
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700218def docs(bld):
219 from waflib import Options
220 Options.commands = ['doxygen', 'sphinx'] + Options.commands
221
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800222def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700223 version(bld)
224
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800225 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700226 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
227 else:
228 bld(features="subst",
229 name="doxygen-conf",
230 source="docs/doxygen.conf.in",
231 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700232 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700233 )
234
235 bld(features="doxygen",
236 doxyfile='docs/doxygen.conf',
237 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700238
239def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700240 version(bld)
241
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700242 if not bld.env.SPHINX_BUILD:
243 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
244 else:
245 bld(features="sphinx",
246 outdir="docs",
247 source=bld.path.ant_glob('docs/**/*.rst'),
248 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700249 VERSION=VERSION_BASE)
250
251def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700252 if getattr(Context.g_module, 'VERSION_BASE', None):
253 return
254
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700255 Context.g_module.VERSION_BASE = Context.g_module.VERSION
256 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
257
258 try:
259 cmd = ['git', 'describe', '--match', 'NFD-*']
260 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
261 stderr=None, stdin=None)
262 out = p.communicate()[0].strip()
263 if p.returncode == 0 and out != "":
264 Context.g_module.VERSION = out[4:]
265 except:
266 pass
267
268def dist(ctx):
269 version(ctx)
270
271def distcheck(ctx):
272 version(ctx)