blob: b3f1480decf6234d1068980db9ac9068d28e33da [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 Afanasyev5cda2e02014-04-11 13:58:44 -070036 'default-compiler-flags', 'coverage',
37 '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',
58 'default-compiler-flags',
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
Alexander Afanasyev4a771362014-04-24 21:29:33 -070062 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
63 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010064
Alexander Afanasyev82afa1a2014-03-20 16:56:56 -070065 boost_libs = 'system chrono program_options'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080066 if conf.options.with_tests:
67 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070068 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070069 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080070
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040071 if conf.options.with_other_tests:
72 conf.env['WITH_OTHER_TESTS'] = 1
73
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080074 conf.check_boost(lib=boost_libs)
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060075
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080076 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070077 Logs.error("Minimum required boost version is 1.48.0")
78 Logs.error("Please upgrade your distribution or install custom boost libraries" +
79 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080080 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080081
82 conf.load('unix-socket')
Wentao Shang53df1632014-04-21 12:01:32 -070083 conf.checkWebsocket(mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010084
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070085 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070086 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070087 if not conf.options.without_libpcap:
88 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
89 errmsg='not found, but required for Ethernet face support. '
90 'Specify --without-libpcap to disable Ethernet face support.')
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070091
Alexander Afanasyev689569b2014-02-16 20:20:07 -080092 conf.load('coverage')
93
Junxiao Shid71d84c2014-04-18 17:22:50 -070094 conf.find_program('bash', var='BASH')
95
Steve DiBenedettofbb40a82014-03-11 19:40:15 -060096 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -070097
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070098 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080099
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700100def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700101 version(bld)
102
103 bld(features="subst",
104 name='version',
105 source='version.hpp.in',
106 target='version.hpp',
107 install_path=None,
108 VERSION_STRING=VERSION_BASE,
109 VERSION_BUILD=VERSION,
110 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
111 int(VERSION_SPLIT[1]) * 1000 +
112 int(VERSION_SPLIT[2]),
113 VERSION_MAJOR=VERSION_SPLIT[0],
114 VERSION_MINOR=VERSION_SPLIT[1],
115 VERSION_PATCH=VERSION_SPLIT[2],
116 )
117
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700118 core = bld(
119 target='core-objects',
120 name='core-objects',
121 features='cxx',
122 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700123 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700124 includes='. core',
125 export_includes='. core',
126 )
127
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800128 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700129 target='daemon-objects',
130 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700131 features='cxx',
132 source=bld.path.ant_glob(['daemon/**/*.cpp'],
133 excl=['daemon/face/ethernet-*.cpp',
134 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700135 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700136 'daemon/main.cpp']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700137 use='core-objects',
Wentao Shang53df1632014-04-21 12:01:32 -0700138 includes='daemon websocketpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700139 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700140 )
141
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700142 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100143 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700144 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100145
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800146 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100147 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800148
Wentao Shang53df1632014-04-21 12:01:32 -0700149 if bld.env['HAVE_WEBSOCKET']:
150 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
151
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700152 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700153 features='cxx cxxprogram',
154 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700155 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600156 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600157
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700158 rib_objects = bld(
159 target='rib-objects',
160 name='rib-objects',
161 features='cxx',
162 source=bld.path.ant_glob(['rib/**/*.cpp'],
163 excl=['rib/main.cpp']),
164 use='core-objects',
165 )
166
167 bld(target='bin/nrd',
168 features='cxx cxxprogram',
169 source='rib/main.cpp',
170 use='rib-objects',
171 )
172
hilata198cadb2014-02-15 23:46:19 -0600173 for app in bld.path.ant_glob('tools/*.cpp'):
174 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700175 target='bin/%s' % (str(app.change_ext(''))),
176 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700177 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600178 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100179
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700180 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400181
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700182 bld(features="subst",
183 source='nfd.conf.sample.in',
184 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700185 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700186 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
187 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800188
Chengyu Fanb07788a2014-03-31 12:15:36 -0600189 bld(features='subst',
190 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700191 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600192 install_path="${BINDIR}",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700193 chmod=0755,
194 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600195
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700196 if bld.env['SPHINX_BUILD']:
197 bld(features="sphinx",
198 builder="man",
199 outdir="docs/manpages",
200 config="docs/conf.py",
201 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700202 install_path="${MANDIR}/",
203 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700204
Junxiao Shid71d84c2014-04-18 17:22:50 -0700205 for script in bld.path.ant_glob('tools/*.sh'):
206 bld(features='subst',
207 source='tools/%s' % (str(script)),
208 target='bin/%s' % (str(script.change_ext(''))),
209 install_path="${BINDIR}",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700210 chmod=0755,
211 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700212
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)