blob: d424973bf0766d89dc02289cbccf923a7396a8cb [file] [log] [blame]
Yingdi Yuce94f352015-04-11 19:17:01 -07001# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
2
Alexander Afanasyev9091d832018-04-18 17:21:08 -04003from waflib import Context, Logs, Utils
4import os, subprocess
Yingdi Yuce94f352015-04-11 19:17:01 -07005
Alexander Afanasyev9091d832018-04-18 17:21:08 -04006VERSION = '0.1.0'
7APPNAME = 'ndn-nac'
8PACKAGE_BUGREPORT = "http://redmine.named-data.net/projects/nac"
9GIT_TAG_PREFIX = "ndn-nac-"
Yingdi Yuce94f352015-04-11 19:17:01 -070010
11def options(opt):
12 opt.load(['compiler_c', 'compiler_cxx', 'gnu_dirs'])
Alexander Afanasyev9091d832018-04-18 17:21:08 -040013 opt.load(['boost', 'default-compiler-flags', 'sanitizers', 'coverage', 'doxygen'],
Yingdi Yuce94f352015-04-11 19:17:01 -070014 tooldir=['.waf-tools'])
15
Alexander Afanasyev9091d832018-04-18 17:21:08 -040016 opt = opt.add_option_group ("NDN-NAC Options")
Yingdi Yuce94f352015-04-11 19:17:01 -070017
Alexander Afanasyev9091d832018-04-18 17:21:08 -040018 opt.add_option('--with-tests', action='store_true', default=False, dest='with_tests',
19 help='''Build unit tests''')
Yingdi Yuce94f352015-04-11 19:17:01 -070020
21def configure(conf):
Alexander Afanasyev867228e2016-10-17 16:54:55 -070022 conf.load(['compiler_c', 'compiler_cxx', 'gnu_dirs', 'boost', 'default-compiler-flags', 'sanitizers', 'doxygen'])
Yingdi Yuce94f352015-04-11 19:17:01 -070023
Alexander Afanasyev9091d832018-04-18 17:21:08 -040024 conf.env['WITH_TESTS'] = conf.options.with_tests
25
Yingdi Yuda495a92015-05-05 13:57:59 -070026 if 'PKG_CONFIG_PATH' not in os.environ:
27 os.environ['PKG_CONFIG_PATH'] = Utils.subst_vars('${LIBDIR}/pkgconfig', conf.env)
Yingdi Yuce94f352015-04-11 19:17:01 -070028 conf.check_cfg(package='libndn-cxx', args=['--cflags', '--libs'],
29 uselib_store='NDN_CXX', mandatory=True)
30
31 boost_libs = 'system iostreams'
Alexander Afanasyev9091d832018-04-18 17:21:08 -040032 if conf.env['WITH_TESTS']:
33 conf.define('NDN_NAC_HAVE_TESTS', 1);
Yingdi Yuce94f352015-04-11 19:17:01 -070034 boost_libs += ' unit_test_framework'
35
36 conf.check_boost(lib=boost_libs)
37
Alexander Afanasyev9091d832018-04-18 17:21:08 -040038 conf.check_compiler_flags()
39
40 # Loading "late" to prevent tests from being compiled with profiling flags
41 conf.load('coverage')
42
43 conf.load('sanitizers')
44
45 conf.define('SYSCONFDIR', conf.env['SYSCONFDIR'])
46
Yingdi Yuce94f352015-04-11 19:17:01 -070047 conf.write_config_header('config.hpp')
48
49def build(bld):
Alexander Afanasyev9091d832018-04-18 17:21:08 -040050 version(bld)
51
52 bld.shlib(
53 target="libndn-nac",
54 vnum=VERSION_BASE,
55 cnum=VERSION_BASE,
Yingdi Yuce94f352015-04-11 19:17:01 -070056 source = bld.path.ant_glob(['src/**/*.cpp']),
Zhiyi Zhang19a11d22018-04-12 22:58:20 -070057 use = 'BOOST NDN_CXX CRYPTOPP',
Yingdi Yuce94f352015-04-11 19:17:01 -070058 includes = ['src', '.'],
Alexander Afanasyev9091d832018-04-18 17:21:08 -040059 export_includes=['src', '.'])
Yingdi Yuce94f352015-04-11 19:17:01 -070060
61 # Unit tests
Alexander Afanasyev9091d832018-04-18 17:21:08 -040062 if bld.env['WITH_TESTS']:
Yingdi Yuce94f352015-04-11 19:17:01 -070063 bld.recurse('tests')
64
65 bld.install_files(
66 dest = "%s/ndn-group-encrypt" % bld.env['INCLUDEDIR'],
Yingdi Yu0a6663a2016-03-20 18:55:46 -070067 files = bld.path.ant_glob(['src/**/*.hpp', 'src/**/*.h', 'common.hpp']),
68 cwd = bld.path.find_dir("src"),
Alexander Afanasyev9091d832018-04-18 17:21:08 -040069 relative_trick = True)
Yingdi Yu0a6663a2016-03-20 18:55:46 -070070
71 bld.install_files(
72 dest = "%s/ndn-group-encrypt" % bld.env['INCLUDEDIR'],
Yingdi Yuce94f352015-04-11 19:17:01 -070073 files = bld.path.get_bld().ant_glob(['src/**/*.hpp', 'common.hpp', 'config.hpp']),
74 cwd = bld.path.get_bld().find_dir("src"),
Alexander Afanasyev9091d832018-04-18 17:21:08 -040075 relative_trick = False )
Yingdi Yuce94f352015-04-11 19:17:01 -070076
Yingdi Yuda495a92015-05-05 13:57:59 -070077 bld(features = "subst",
Alexander Afanasyev9091d832018-04-18 17:21:08 -040078 source='libndn-nac.pc.in',
79 target='libndn-nac.pc',
Yingdi Yuce94f352015-04-11 19:17:01 -070080 install_path = '${LIBDIR}/pkgconfig',
81 PREFIX = bld.env['PREFIX'],
Alexander Afanasyev9091d832018-04-18 17:21:08 -040082 INCLUDEDIR = "%s/ndn-nac" % bld.env['INCLUDEDIR'],
83 VERSION = VERSION)
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -070084
85def docs(bld):
86 from waflib import Options
Alexander Afanasyev9091d832018-04-18 17:21:08 -040087 Options.commands = ['doxygen', 'sphinx'] + Options.commands
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -070088
89def doxygen(bld):
90 version(bld)
91
92 if not bld.env.DOXYGEN:
Alexander Afanasyev9091d832018-04-18 17:21:08 -040093 bld.fatal('Cannot build documentation ("doxygen" not found in PATH)')
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -070094
Alexander Afanasyev9091d832018-04-18 17:21:08 -040095 bld(features='subst',
96 name='doxygen.conf',
97 source=['docs/doxygen.conf.in',
98 'docs/named_data_theme/named_data_footer-with-analytics.html.in'],
99 target=['docs/doxygen.conf',
100 'docs/named_data_theme/named_data_footer-with-analytics.html'],
101 VERSION=VERSION,
102 HTML_FOOTER='../build/docs/named_data_theme/named_data_footer-with-analytics.html' \
103 if os.getenv('GOOGLE_ANALYTICS', None) \
104 else '../docs/named_data_theme/named_data_footer.html',
105 GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ''))
106
107 bld(features='doxygen',
108 doxyfile='docs/doxygen.conf',
109 use='doxygen.conf')
110
111def sphinx(bld):
112 version(bld)
113
114 if not bld.env.SPHINX_BUILD:
115 bld.fatal('Cannot build documentation ("sphinx-build" not found in PATH)')
116
117 bld(features='sphinx',
118 config='docs/conf.py',
119 outdir='docs',
120 source=bld.path.ant_glob('docs/**/*.rst'),
121 VERSION=VERSION)
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700122
123def version(ctx):
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400124 # don't execute more than once
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700125 if getattr(Context.g_module, 'VERSION_BASE', None):
126 return
127
128 Context.g_module.VERSION_BASE = Context.g_module.VERSION
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400129 Context.g_module.VERSION_SPLIT = VERSION_BASE.split('.')
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700130
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400131 # first, try to get a version string from git
132 gotVersionFromGit = False
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700133 try:
134 cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400135 out = subprocess.check_output(cmd, universal_newlines=True).strip()
136 if out:
137 gotVersionFromGit = True
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700138 if out.startswith(GIT_TAG_PREFIX):
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400139 Context.g_module.VERSION = out.lstrip(GIT_TAG_PREFIX)
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700140 else:
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400141 # no tags matched
142 Context.g_module.VERSION = '%s-commit-%s' % (VERSION_BASE, out)
143 except subprocess.CalledProcessError:
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700144 pass
145
146 versionFile = ctx.path.find_node('VERSION')
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400147 if not gotVersionFromGit and versionFile is not None:
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700148 try:
149 Context.g_module.VERSION = versionFile.read()
150 return
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400151 except EnvironmentError:
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700152 pass
153
154 # version was obtained from git, update VERSION file if necessary
155 if versionFile is not None:
156 try:
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400157 if versionFile.read() == Context.g_module.VERSION:
158 # already up-to-date
159 return
160 except EnvironmentError as e:
161 Logs.warn('%s exists but is not readable (%s)' % (versionFile, e.strerror))
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700162 else:
163 versionFile = ctx.path.make_node('VERSION')
164
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700165 try:
166 versionFile.write(Context.g_module.VERSION)
Alexander Afanasyev9091d832018-04-18 17:21:08 -0400167 except EnvironmentError as e:
168 Logs.warn('%s is not writable (%s)' % (versionFile, e.strerror))
Alexander Afanasyev9d7f8fe2016-08-05 11:28:06 -0700169
170def dist(ctx):
171 version(ctx)
172
173def distcheck(ctx):
174 version(ctx)