blob: 4e8622bb575d9221970eef1d0a18ba4fda25398b [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'])
35 opt.load(['boost', 'unix-socket', 'dependency-checker',
36 '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)
42 opt.addDependencyOptions(nfdopt, 'libpcap')
43 nfdopt.add_option('--without-libpcap', action='store_true', default=False,
44 dest='without_libpcap',
45 help='''Disable libpcap (Ethernet face support will be disabled)''')
46
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070047 opt.addDependencyOptions(nfdopt, 'librt', '(optional)')
48 opt.addDependencyOptions(nfdopt, 'libresolv', '(optional)')
49
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070050 nfdopt.add_option('--with-tests', action='store_true', default=False,
51 dest='with_tests', help='''Build unit tests''')
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040052 nfdopt.add_option('--with-other-tests', action='store_true', default=False,
53 dest='with_other_tests', help='''Build other tests''')
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060054
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080055def configure(conf):
Beichuan Zhang55b8ed42014-04-26 22:25:44 -070056 conf.load(['compiler_cxx', 'gnu_dirs',
57 'default-compiler-flags',
58 'boost', 'dependency-checker',
59 'doxygen', 'sphinx_build'])
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070060
Alexander Afanasyev4a771362014-04-24 21:29:33 -070061 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
62 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010063
Alexander Afanasyev82afa1a2014-03-20 16:56:56 -070064 boost_libs = 'system chrono program_options'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080065 if conf.options.with_tests:
66 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070067 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070068 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080069
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040070 if conf.options.with_other_tests:
71 conf.env['WITH_OTHER_TESTS'] = 1
72
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080073 conf.check_boost(lib=boost_libs)
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060074
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080075 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070076 Logs.error("Minimum required boost version is 1.48.0")
77 Logs.error("Please upgrade your distribution or install custom boost libraries" +
78 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080079 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080080
81 conf.load('unix-socket')
Davide Pesavento44deacc2014-02-19 10:48:07 +010082
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070083 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070084 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070085 if not conf.options.without_libpcap:
86 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
87 errmsg='not found, but required for Ethernet face support. '
88 'Specify --without-libpcap to disable Ethernet face support.')
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070089
Alexander Afanasyev689569b2014-02-16 20:20:07 -080090 conf.load('coverage')
91
Junxiao Shid71d84c2014-04-18 17:22:50 -070092 conf.find_program('bash', var='BASH')
93
Steve DiBenedettofbb40a82014-03-11 19:40:15 -060094 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -070095
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070096 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080097
Junxiao Shi09bf7c42014-01-31 11:10:25 -070098def build(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -070099 version(bld)
100
101 bld(features="subst",
102 name='version',
103 source='version.hpp.in',
104 target='version.hpp',
105 install_path=None,
106 VERSION_STRING=VERSION_BASE,
107 VERSION_BUILD=VERSION,
108 VERSION=int(VERSION_SPLIT[0]) * 1000000 +
109 int(VERSION_SPLIT[1]) * 1000 +
110 int(VERSION_SPLIT[2]),
111 VERSION_MAJOR=VERSION_SPLIT[0],
112 VERSION_MINOR=VERSION_SPLIT[1],
113 VERSION_PATCH=VERSION_SPLIT[2],
114 )
115
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700116 core = bld(
117 target='core-objects',
118 name='core-objects',
119 features='cxx',
120 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700121 use='version BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700122 includes='. core',
123 export_includes='. core',
124 )
125
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800126 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700127 target='daemon-objects',
128 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700129 features='cxx',
130 source=bld.path.ant_glob(['daemon/**/*.cpp'],
131 excl=['daemon/face/ethernet-*.cpp',
132 'daemon/face/unix-*.cpp',
133 'daemon/main.cpp']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700134 use='core-objects',
135 includes='daemon',
136 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700137 )
138
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700139 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100140 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700141 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100142
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800143 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100144 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800145
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700146 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700147 features='cxx cxxprogram',
148 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700149 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600150 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600151
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700152 rib_objects = bld(
153 target='rib-objects',
154 name='rib-objects',
155 features='cxx',
156 source=bld.path.ant_glob(['rib/**/*.cpp'],
157 excl=['rib/main.cpp']),
158 use='core-objects',
159 )
160
161 bld(target='bin/nrd',
162 features='cxx cxxprogram',
163 source='rib/main.cpp',
164 use='rib-objects',
165 )
166
hilata198cadb2014-02-15 23:46:19 -0600167 for app in bld.path.ant_glob('tools/*.cpp'):
168 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700169 target='bin/%s' % (str(app.change_ext(''))),
170 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700171 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600172 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100173
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700174 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400175
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700176 bld(features="subst",
177 source='nfd.conf.sample.in',
178 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700179 install_path="${SYSCONFDIR}/ndn",
180 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800181
Chengyu Fanb07788a2014-03-31 12:15:36 -0600182 bld(features='subst',
183 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700184 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600185 install_path="${BINDIR}",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700186 chmod=0755,
187 VERSION=VERSION)
Chengyu Fanb07788a2014-03-31 12:15:36 -0600188
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700189 if bld.env['SPHINX_BUILD']:
190 bld(features="sphinx",
191 builder="man",
192 outdir="docs/manpages",
193 config="docs/conf.py",
194 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700195 install_path="${MANDIR}/",
196 VERSION=VERSION)
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700197
Junxiao Shid71d84c2014-04-18 17:22:50 -0700198 for script in bld.path.ant_glob('tools/*.sh'):
199 bld(features='subst',
200 source='tools/%s' % (str(script)),
201 target='bin/%s' % (str(script.change_ext(''))),
202 install_path="${BINDIR}",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700203 chmod=0755,
204 VERSION=VERSION)
Junxiao Shid71d84c2014-04-18 17:22:50 -0700205
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700206def docs(bld):
207 from waflib import Options
208 Options.commands = ['doxygen', 'sphinx'] + Options.commands
209
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800210def doxygen(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700211 version(bld)
212
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800213 if not bld.env.DOXYGEN:
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700214 Logs.error("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
215 else:
216 bld(features="subst",
217 name="doxygen-conf",
218 source="docs/doxygen.conf.in",
219 target="docs/doxygen.conf",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700220 VERSION=VERSION_BASE,
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700221 )
222
223 bld(features="doxygen",
224 doxyfile='docs/doxygen.conf',
225 use="doxygen-conf")
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700226
227def sphinx(bld):
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700228 version(bld)
229
Beichuan Zhang55b8ed42014-04-26 22:25:44 -0700230 if not bld.env.SPHINX_BUILD:
231 bld.fatal("ERROR: cannot build documentation (`sphinx-build' is not found in $PATH)")
232 else:
233 bld(features="sphinx",
234 outdir="docs",
235 source=bld.path.ant_glob('docs/**/*.rst'),
236 config="docs/conf.py",
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700237 VERSION=VERSION_BASE)
238
239def version(ctx):
Alexander Afanasyev26181532014-05-07 23:38:51 -0700240 if getattr(Context.g_module, 'VERSION_BASE', None):
241 return
242
Alexander Afanasyevb47d5382014-05-05 14:35:03 -0700243 Context.g_module.VERSION_BASE = Context.g_module.VERSION
244 Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
245
246 try:
247 cmd = ['git', 'describe', '--match', 'NFD-*']
248 p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
249 stderr=None, stdin=None)
250 out = p.communicate()[0].strip()
251 if p.returncode == 0 and out != "":
252 Context.g_module.VERSION = out[4:]
253 except:
254 pass
255
256def dist(ctx):
257 version(ctx)
258
259def distcheck(ctx):
260 version(ctx)