blob: 6aa342d8e1705d76eda07906acd7e29dc34b1c1d [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 Afanasyev97e4cac2014-03-28 10:55:11 -070026VERSION = '0.1.0'
27APPNAME = "nfd"
28BUGREPORT = "http://redmine.named-data.net/projects/nfd"
29URL = "https://github.com/named-data/NFD"
30
31from waflib import Logs
hilata198cadb2014-02-15 23:46:19 -060032import os
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080033
34def options(opt):
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070035 opt.load(['compiler_cxx', 'gnu_dirs'])
36 opt.load(['boost', 'unix-socket', 'dependency-checker',
37 'default-compiler-flags', 'coverage',
38 'doxygen', 'sphinx_build'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070039 tooldir=['.waf-tools'])
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080040
41 nfdopt = opt.add_option_group('NFD Options')
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070042 opt.addUnixOptions(nfdopt)
43 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):
Alexander Afanasyev49272f72014-04-06 21:49:46 -070057 conf.load("compiler_cxx boost gnu_dirs sphinx_build")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080058
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070059 try: conf.load("doxygen")
60 except: pass
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080061
Alexander Afanasyev49272f72014-04-06 21:49:46 -070062 try: conf.load("sphinx_build")
63 except: pass
64
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070065 conf.load('default-compiler-flags')
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070066
Alexander Afanasyev4a771362014-04-24 21:29:33 -070067 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
68 uselib_store='NDN_CXX', mandatory=True)
Davide Pesavento44deacc2014-02-19 10:48:07 +010069
Alexander Afanasyev82afa1a2014-03-20 16:56:56 -070070 boost_libs = 'system chrono program_options'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080071 if conf.options.with_tests:
72 conf.env['WITH_TESTS'] = 1
Junxiao Shi88884492014-02-15 15:57:43 -070073 conf.define('WITH_TESTS', 1);
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -070074 boost_libs += ' unit_test_framework'
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080075
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040076 if conf.options.with_other_tests:
77 conf.env['WITH_OTHER_TESTS'] = 1
78
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080079 conf.check_boost(lib=boost_libs)
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -060080
Alexander Afanasyeve1724c42014-02-26 22:00:54 -080081 if conf.env.BOOST_VERSION_NUMBER < 104800:
Junxiao Shiea48d8b2014-03-16 13:53:47 -070082 Logs.error("Minimum required boost version is 1.48.0")
83 Logs.error("Please upgrade your distribution or install custom boost libraries" +
84 " (http://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
Alexander Afanasyev2aa39622014-01-22 11:51:11 -080085 return
Alexander Afanasyevc78b1412014-02-19 14:08:26 -080086
87 conf.load('unix-socket')
Davide Pesavento44deacc2014-02-19 10:48:07 +010088
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070089 conf.checkDependency(name='librt', lib='rt', mandatory=False)
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -070090 conf.checkDependency(name='libresolv', lib='resolv', mandatory=False)
Alexander Afanasyev885a85b2014-04-12 21:01:13 -070091 if not conf.options.without_libpcap:
92 conf.checkDependency(name='libpcap', lib='pcap', mandatory=True,
93 errmsg='not found, but required for Ethernet face support. '
94 'Specify --without-libpcap to disable Ethernet face support.')
Alexander Afanasyevefea8fe2014-03-23 00:00:35 -070095
Alexander Afanasyev689569b2014-02-16 20:20:07 -080096 conf.load('coverage')
97
Junxiao Shid71d84c2014-04-18 17:22:50 -070098 conf.find_program('bash', var='BASH')
99
Steve DiBenedettofbb40a82014-03-11 19:40:15 -0600100 conf.define('DEFAULT_CONFIG_FILE', '%s/ndn/nfd.conf' % conf.env['SYSCONFDIR'])
Steve DiBenedetto2c2b8892014-02-27 11:46:48 -0700101
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700102 conf.write_config_header('config.hpp')
Alexander Afanasyev2aa39622014-01-22 11:51:11 -0800103
Junxiao Shi09bf7c42014-01-31 11:10:25 -0700104def build(bld):
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700105 core = bld(
106 target='core-objects',
107 name='core-objects',
108 features='cxx',
109 source=bld.path.ant_glob(['core/**/*.cpp']),
Alexander Afanasyev4a771362014-04-24 21:29:33 -0700110 use='BOOST NDN_CXX LIBRT',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700111 includes='. core',
112 export_includes='. core',
113 )
114
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800115 nfd_objects = bld(
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700116 target='daemon-objects',
117 name='daemon-objects',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700118 features='cxx',
119 source=bld.path.ant_glob(['daemon/**/*.cpp'],
120 excl=['daemon/face/ethernet-*.cpp',
121 'daemon/face/unix-*.cpp',
122 'daemon/main.cpp']),
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700123 use='core-objects',
124 includes='daemon',
125 export_includes='daemon',
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700126 )
127
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700128 if bld.env['HAVE_LIBPCAP']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100129 nfd_objects.source += bld.path.ant_glob('daemon/face/ethernet-*.cpp')
Alexander Afanasyev5cda2e02014-04-11 13:58:44 -0700130 nfd_objects.use += ' LIBPCAP'
Davide Pesavento44deacc2014-02-19 10:48:07 +0100131
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800132 if bld.env['HAVE_UNIX_SOCKETS']:
Davide Pesavento44deacc2014-02-19 10:48:07 +0100133 nfd_objects.source += bld.path.ant_glob('daemon/face/unix-*.cpp')
Alexander Afanasyevc78b1412014-02-19 14:08:26 -0800134
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700135 bld(target='bin/nfd',
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700136 features='cxx cxxprogram',
137 source='daemon/main.cpp',
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700138 use='daemon-objects',
hilata198cadb2014-02-15 23:46:19 -0600139 )
Steve DiBenedetto84da5bf2014-03-11 14:51:29 -0600140
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700141 rib_objects = bld(
142 target='rib-objects',
143 name='rib-objects',
144 features='cxx',
145 source=bld.path.ant_glob(['rib/**/*.cpp'],
146 excl=['rib/main.cpp']),
147 use='core-objects',
148 )
149
150 bld(target='bin/nrd',
151 features='cxx cxxprogram',
152 source='rib/main.cpp',
153 use='rib-objects',
154 )
155
hilata198cadb2014-02-15 23:46:19 -0600156 for app in bld.path.ant_glob('tools/*.cpp'):
157 bld(features=['cxx', 'cxxprogram'],
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700158 target='bin/%s' % (str(app.change_ext(''))),
159 source=['tools/%s' % (str(app))],
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700160 use='core-objects LIBRESOLV',
hilata198cadb2014-02-15 23:46:19 -0600161 )
Davide Pesavento44deacc2014-02-19 10:48:07 +0100162
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700163 bld.recurse("tests")
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -0400164
Alexander Afanasyev97e4cac2014-03-28 10:55:11 -0700165 bld(features="subst",
166 source='nfd.conf.sample.in',
167 target='nfd.conf.sample',
Alexander Afanasyev885a85b2014-04-12 21:01:13 -0700168 install_path="${SYSCONFDIR}/ndn",
169 IF_HAVE_LIBPCAP="" if bld.env['HAVE_LIBPCAP'] else "; ")
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800170
Chengyu Fanb07788a2014-03-31 12:15:36 -0600171 bld(features='subst',
172 source='tools/nfd-status-http-server.py',
Alexander Afanasyev03ea3eb2014-04-17 18:19:06 -0700173 target='bin/nfd-status-http-server',
Chengyu Fanb07788a2014-03-31 12:15:36 -0600174 install_path="${BINDIR}",
175 chmod=0755)
176
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700177 if bld.env['SPHINX_BUILD']:
178 bld(features="sphinx",
179 builder="man",
180 outdir="docs/manpages",
181 config="docs/conf.py",
182 source=bld.path.ant_glob('docs/manpages/**/*.rst'),
183 install_path="${MANDIR}/")
184
Junxiao Shid71d84c2014-04-18 17:22:50 -0700185 for script in bld.path.ant_glob('tools/*.sh'):
186 bld(features='subst',
187 source='tools/%s' % (str(script)),
188 target='bin/%s' % (str(script.change_ext(''))),
189 install_path="${BINDIR}",
190 chmod=0755)
191
Alexander Afanasyev284257b2014-04-11 14:16:51 -0700192def docs(bld):
193 from waflib import Options
194 Options.commands = ['doxygen', 'sphinx'] + Options.commands
195
Alexander Afanasyev35fc2b72014-02-13 16:56:21 -0800196def doxygen(bld):
197 if not bld.env.DOXYGEN:
198 bld.fatal("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
199 bld(features="doxygen",
Alexander Afanasyev49272f72014-04-06 21:49:46 -0700200 doxyfile='docs/doxygen.conf',
201 install_path=None)
202
203def sphinx(bld):
204 bld(features="sphinx",
205 outdir="docs",
206 source=bld.path.ant_glob('docs/**/*.rst'),
207 config="docs/conf.py",
208 install_path=None)