blob: 682df49fc73af800f4a0226f40a9df13fcaf20a2 [file] [log] [blame]
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -08001# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
2VERSION='0.3~dev0'
3NAME="ndn-cpp-dev"
4
5from waflib import Build, Logs, Utils, Task, TaskGen, Configure
6
7def options(opt):
8 opt.load('compiler_c compiler_cxx gnu_dirs c_osx')
9 opt.load('boost doxygen openssl cryptopp', tooldir=['.waf-tools'])
10
11 opt = opt.add_option_group('NDN-CPP Options')
12
13 opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''')
14
15 opt.add_option('--with-tests', action='store_true',default=False,dest='with_tests',
16 help='''build unit tests''')
17 opt.add_option('--with-log4cxx', action='store_true',default=False,dest='log4cxx',
18 help='''Compile with log4cxx logging support''')
19
20 opt.add_option('--with-c++11', action='store_true', default=False, dest='use_cxx11',
21 help='''Use C++11 features, even if available in the compiler''')
22 opt.add_option('--without-system-boost', action='store_false', default=True, dest='use_system_boost',
23 help='''Use system's boost libraries''')
Yingdi Yue6bfab22014-02-06 16:01:19 -080024 opt.add_option('--without-tools', action='store_false', default=True, dest='with_tools',
25 help='''Do not build tools''')
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080026
27
28def configure(conf):
29 conf.load("compiler_c compiler_cxx boost gnu_dirs c_osx openssl cryptopp")
30 try:
31 conf.load("doxygen")
32 except:
33 pass
34
35 if conf.options.with_tests:
36 conf.env['WITH_TESTS'] = True
37
Yingdi Yue6bfab22014-02-06 16:01:19 -080038 if conf.options.with_tools:
39 conf.env['WITH_TOOLS'] = True
40
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080041 conf.check_openssl()
42
43 if conf.options.debug:
44 conf.define ('_DEBUG', 1)
45 flags = ['-O0',
46 '-Wall',
47 # '-Werror',
48 '-Wno-unused-variable',
49 '-g3',
50 '-Wno-unused-private-field', # only clang supports
51 '-fcolor-diagnostics', # only clang supports
52 '-Qunused-arguments', # only clang supports
53 '-Wno-tautological-compare', # suppress warnings from CryptoPP
54 '-Wno-unused-function', # another annoying warning from CryptoPP
55
56 '-Wno-deprecated-declarations',
57 ]
58
59 conf.add_supported_cxxflags (cxxflags = flags)
60 else:
61 flags = ['-O3', '-g', '-Wno-tautological-compare', '-Wno-unused-function', '-Wno-deprecated-declarations']
62 conf.add_supported_cxxflags (cxxflags = flags)
63
64 if Utils.unversioned_sys_platform () == "darwin":
65 conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION', mandatory=True)
Alexander Afanasyevd409d592014-01-28 18:36:38 -080066 conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES', mandatory=True)
67 conf.check_cxx(framework_name='Security', uselib_store='OSX_SECURITY', define_name='HAVE_SECURITY',
68 use="OSX_COREFOUNDATION", mandatory=True)
69 conf.define('HAVE_OSX_SECURITY', 1)
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080070
71 conf.define ("PACKAGE_BUGREPORT", "ndn-lib@lists.cs.ucla.edu")
72 conf.define ("PACKAGE_NAME", NAME)
73 conf.define ("PACKAGE_VERSION", VERSION)
74 conf.define ("PACKAGE_URL", "https://github.com/named-data/ndn-cpp")
75
76 conf.check_cfg(package='sqlite3', args=['--cflags', '--libs'], uselib_store='SQLITE3', mandatory=True)
77
78 if conf.options.log4cxx:
79 conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'], uselib_store='LOG4CXX', mandatory=True)
80 conf.define ("HAVE_LOG4CXX", 1)
81
82 conf.check_cryptopp(path=conf.options.cryptopp_dir, mandatory=True)
83
84 if conf.options.use_cxx11:
85 conf.add_supported_cxxflags(cxxflags = ['-std=c++11', '-std=c++0x'])
86
87 conf.check(msg='Checking for type std::shared_ptr',
88 type_name="std::shared_ptr<int>", header_name="memory", define_name='HAVE_STD_SHARED_PTR')
89 conf.check(msg='Checking for type std::function',
90 type_name="std::function<void()>", header_name="functional", define_name='HAVE_STD_FUNCTION')
91 conf.define('HAVE_CXX11', 1)
92 else:
93 if conf.options.use_system_boost:
Yingdi Yue6bfab22014-02-06 16:01:19 -080094 USED_BOOST_LIBS = 'system filesystem date_time iostreams regex program_options'
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -080095 if conf.env['WITH_TESTS']:
96 USED_BOOST_LIBS += " unit_test_framework"
97
98 conf.check_boost(lib=USED_BOOST_LIBS)
99
100 boost_version = conf.env.BOOST_VERSION.split('_')
101 if int(boost_version[0]) > 1 or (int(boost_version[0]) == 1 and int(boost_version[1]) >= 46):
102 conf.env['USE_SYSTEM_BOOST'] = True
103 conf.define('USE_SYSTEM_BOOST', 1)
104
Alexander Afanasyevc6d795f2014-01-29 15:13:59 -0800105 conf.check_cxx(lib='pthread', uselib_store='PTHREAD', define_name='HAVE_PTHREAD', mandatory=False)
Alexander Afanasyev19508852014-01-29 01:01:51 -0800106 conf.check_cxx(lib='rt', uselib_store='RT', define_name='HAVE_RT', mandatory=False)
107
Alexander Afanasyev09c613f2014-01-29 00:23:58 -0800108 conf.write_config_header('src/ndn-cpp-config.h', define_prefix='NDN_CPP_')
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800109
110def build (bld):
111 libndn_cpp = bld (
Alexander Afanasyev59efe102014-01-29 15:56:30 -0800112 features=['cxx', 'cxxstlib'], # 'cxxshlib',
113 # vnum = "0.3.0",
Alexander Afanasyev1e0a0772014-01-28 20:07:07 -0800114 target="ndn-cpp-dev",
115 name = "ndn-cpp-dev",
116 source = bld.path.ant_glob('src/**/*.cpp',
117 excl = ['src/**/*-osx.cpp', 'src/**/*-sqlite3.cpp']),
Alexander Afanasyevc6d795f2014-01-29 15:13:59 -0800118 use = 'BOOST OPENSSL LOG4CXX CRYPTOPP SQLITE3 RT PTHREAD',
Alexander Afanasyev09c613f2014-01-29 00:23:58 -0800119 includes = "src",
120 export_includes = "src",
Alexander Afanasyevc6d795f2014-01-29 15:13:59 -0800121 install_path = '${LIBDIR}',
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800122 )
123
124 if Utils.unversioned_sys_platform () == "darwin":
Alexander Afanasyev1e0a0772014-01-28 20:07:07 -0800125 libndn_cpp.source += bld.path.ant_glob('src/**/*-osx.cpp')
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800126 libndn_cpp.mac_app = True
Alexander Afanasyevd409d592014-01-28 18:36:38 -0800127 libndn_cpp.use += " OSX_COREFOUNDATION OSX_SECURITY"
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800128
Alexander Afanasyev1e0a0772014-01-28 20:07:07 -0800129 # In case we want to make it optional later
130 libndn_cpp.source += bld.path.ant_glob('src/**/*-sqlite3.cpp')
Alexander Afanasyevd409d592014-01-28 18:36:38 -0800131
Alexander Afanasyev1e0a0772014-01-28 20:07:07 -0800132
Alexander Afanasyev200dd6f2014-01-28 19:04:25 -0800133 pkgconfig_libs = []
134 pkgconfig_ldflags = []
135 pkgconfig_includes = []
136 for lib in Utils.to_list(libndn_cpp.use):
137 if bld.env['LIB_%s' % lib]:
138 pkgconfig_libs += Utils.to_list(bld.env['LIB_%s' % lib])
139 if bld.env['LIBPATH_%s' % lib]:
140 pkgconfig_ldflags += Utils.to_list(bld.env['LIBPATH_%s' % lib])
141 if bld.env['INCLUDES_%s' % lib]:
142 pkgconfig_includes += Utils.to_list(bld.env['INCLUDES_%s' % lib])
143
Alexander Afanasyev84cf4292014-01-29 22:16:27 -0800144 EXTRA_FRAMEWORKS = "";
145 if Utils.unversioned_sys_platform () == "darwin":
146 EXTRA_FRAMEWORKS = "-framework CoreFoundation -framework Security"
147
Alexander Afanasyev200dd6f2014-01-28 19:04:25 -0800148 def uniq(alist):
149 set = {}
150 return [set.setdefault(e,e) for e in alist if e not in set]
151
Alexander Afanasyevd409d592014-01-28 18:36:38 -0800152 bld (features = "subst",
153 source = "libndn-cpp-dev.pc.in",
154 target = "libndn-cpp-dev.pc",
155 install_path = "${LIBDIR}/pkgconfig",
Alexander Afanasyev200dd6f2014-01-28 19:04:25 -0800156 VERSION = VERSION,
157
158 # This probably not the right thing to do, but to simplify life of apps
159 # that use the library
160 EXTRA_LIBS = " ".join([('-l%s' % i) for i in uniq(pkgconfig_libs)]),
161 EXTRA_LDFLAGS = " ".join([('-L%s' % i) for i in uniq(pkgconfig_ldflags)]),
162 EXTRA_INCLUDES = " ".join([('-I%s' % i) for i in uniq(pkgconfig_includes)]),
Alexander Afanasyev84cf4292014-01-29 22:16:27 -0800163 EXTRA_FRAMEWORKS = EXTRA_FRAMEWORKS,
Alexander Afanasyevd409d592014-01-28 18:36:38 -0800164 )
Alexander Afanasyev200dd6f2014-01-28 19:04:25 -0800165
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800166 # Unit tests
167 if bld.env['WITH_TESTS']:
Alexander Afanasyevd409d592014-01-28 18:36:38 -0800168 bld.recurse('tests')
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800169
Yingdi Yue6bfab22014-02-06 16:01:19 -0800170 if bld.env['WITH_TOOLS']:
171 bld.recurse("tools examples")
172 else:
173 bld.recurse("examples")
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800174
Alexander Afanasyev19508852014-01-29 01:01:51 -0800175 headers = bld.path.ant_glob(['src/**/*.hpp'])
176 bld.install_files("%s/ndn-cpp-dev" % bld.env['INCLUDEDIR'], headers, relative_trick=True, cwd=bld.path.find_node('src'))
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800177
Alexander Afanasyev19508852014-01-29 01:01:51 -0800178 bld.install_files("%s/ndn-cpp-dev" % bld.env['INCLUDEDIR'], bld.path.find_resource('src/ndn-cpp-config.h'))
Alexander Afanasyeva1ae0a12014-01-28 15:21:02 -0800179
180@Configure.conf
181def add_supported_cxxflags(self, cxxflags):
182 """
183 Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
184 """
185 self.start_msg('Checking allowed flags for c++ compiler')
186
187 supportedFlags = []
188 for flag in cxxflags:
189 if self.check_cxx (cxxflags=[flag], mandatory=False):
190 supportedFlags += [flag]
191
192 self.end_msg (' '.join (supportedFlags))
193 self.env.CXXFLAGS += supportedFlags
194
195# doxygen docs
196from waflib.Build import BuildContext
197class doxy (BuildContext):
198 cmd = "doxygen"
199 fun = "doxygen"
200
201def doxygen (bld):
202 if not bld.env.DOXYGEN:
203 bld.fatal ("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
204 bld (features="doxygen",
205 doxyfile='Doxyfile')
206
207# doxygen docs
208from waflib.Build import BuildContext
209class sphinx (BuildContext):
210 cmd = "sphinx"
211 fun = "sphinx"
212
213def sphinx (bld):
214 bld.load('sphinx_build', tooldir=['waf-tools'])
215
216 bld (features="sphinx",
217 outdir = "doc/html",
218 source = "doc/source/conf.py")