blob: 47aee6c043a28c7091073420cd3f07989e68fd8c [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
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',
129 )
130
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800131 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700132 target='daemon-objects',
133 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700134 features='cxx',
135 source=bld.path.ant_glob(['daemon/**/*.cpp'],
136 excl=['daemon/face/ethernet-*.cpp',
137 'daemon/face/unix-*.cpp',
Wentao Shang53df1632014-04-21 12:01:32 -0700138 'daemon/face/websocket-*.cpp',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700139 'daemon/main.cpp']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700140 use='core-objects',
Wentao Shang53df1632014-04-21 12:01:32 -0700141 includes='daemon websocketpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700142 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700143 )
144
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700145 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100146 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700147 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100148
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800149 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100150 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800151
Wentao Shang53df1632014-04-21 12:01:32 -0700152 if bld.env['HAVE_WEBSOCKET']:
153 nfd_objects.source += bld.path.ant_glob('daemon/face/websocket-*.cpp')
154
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700155 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700156 features='cxx cxxprogram',
157 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700158 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600159 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600160
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700161 rib_objects = bld(
162 target='rib-objects',
163 name='rib-objects',
164 features='cxx',
165 source=bld.path.ant_glob(['rib/**/*.cpp'],
166 excl=['rib/main.cpp']),
167 use='core-objects',
168 )
169
170 bld(target='bin/nrd',
171 features='cxx cxxprogram',
172 source='rib/main.cpp',
173 use='rib-objects',
174 )
175
hilata198cadb2014-02-15 23:46:19 -0600176 for app in bld.path.ant_glob('tools/*.cpp'):
177 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700178 target='bin/%s' % (str(app.change_ext(''))),
179 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700180 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600181 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100182
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700183 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400184
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700185 bld(features="subst",
186 source='nfd.conf.sample.in',
187 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700188 install_path="${SYSCONFDIR}/ndn",
Wentao Shang53df1632014-04-21 12:01:32 -0700189 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ",
190 IF_HAVE_WEBSOCKET="" if bld.env['HAVE_WEBSOCKET'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800191
Chengyu Fanb07788a2014-03-31 12:15:36 -0600192 bld(features='subst',
193 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700194 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600195 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700196 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700197 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600198
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700199 if bld.env['SPHINX_BUILD']:
200 bld(features="sphinx",
201 builder="man",
202 outdir="docs/manpages",
203 config="docs/conf.py",
204 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700205 install_path="${MANDIR}/",
206 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700207
Junxiao Shid71d84c2014-04-18 17:22:50 -0700208 for script in bld.path.ant_glob('tools/*.sh'):
209 bld(features='subst',
210 source='tools/%s' % (str(script)),
211 target='bin/%s' % (str(script.change_ext(''))),
212 install_path="${BINDIR}",
Alexander Afanasyevf7bbe472014-05-11 19:31:13 -0700213 chmod=Utils.O755,
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700214 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700215
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700216def docs(bld):
217 from waflib import Options
218 Options.commands = ['doxygen', 'sphinx'] + Options.commands
219
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800220def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700221 version(bld)
222
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800223 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700224 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
225 else:
226 bld(features="subst",
227 name="doxygen-conf",
228 source="docs/doxygen.conf.in",
229 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700230 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700231 )
232
233 bld(features="doxygen",
234 doxyfile='docs/doxygen.conf',
235 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700236
237def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700238 version(bld)
239
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700240 if not bld.env.SPHINX_BUILD:
241 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
242 else:
243 bld(features="sphinx",
244 outdir="docs",
245 source=bld.path.ant_glob('docs/**/*.rst'),
246 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700247 VERSION=VERSION_BASE)
248
249def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700250 if getattr(Context.g_module, 'VERSION_BASE', None):
251 return
252
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700253 Context.g_module.VERSION_BASE = Context.g_module.VERSION
254 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
255
256 try:
257 cmd = ['git', 'describe', '--match', 'NFD-*']
258 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
259 stderr=None, stdin=None)
260 out = p.communicate()[0].strip()
261 if p.returncode == 0 and out != "":
262 Context.g_module.VERSION = out[4:]
263 except:
264 pass
265
266def dist(ctx):
267 version(ctx)
268
269def distcheck(ctx):
270 version(ctx)