build: update waf to version 2.0.6

Fix discovered build issues

Change-Id: I9a861c955283c1b20cc5065a4baa22bd7c2ab0c1
diff --git a/wscript b/wscript
index 8d418a7..919b827 100644
--- a/wscript
+++ b/wscript
@@ -27,7 +27,7 @@
 GIT_TAG_PREFIX = "NLSR-"
 
 from waflib import Logs, Utils, Context
-import os
+import os, subprocess
 
 def options(opt):
     opt.load(['compiler_cxx', 'gnu_dirs'])
@@ -36,10 +36,7 @@
             tooldir=['.waf-tools'])
 
     nlsropt = opt.add_option_group('NLSR Options')
-
-    nlsropt.add_option('--with-tests', action='store_true', default=False, dest='with_tests',
-                       help='''build unit tests''')
-
+    nlsropt.add_option('--with-tests', action='store_true', default=False, help='build unit tests')
 
 def configure(conf):
     conf.load(['compiler_cxx', 'gnu_dirs',
@@ -54,21 +51,21 @@
 
     boost_libs = 'system chrono program_options iostreams thread regex filesystem log log_setup'
     if conf.options.with_tests:
-        conf.env['WITH_TESTS'] = 1
-        conf.define('WITH_TESTS', 1);
+        conf.env['WITH_TESTS'] = True
+        conf.define('WITH_TESTS', 1)
         boost_libs += ' unit_test_framework'
 
     conf.check_boost(lib=boost_libs, mt=True)
-
     if conf.env.BOOST_VERSION_NUMBER < 105400:
-        Logs.error("Minimum required boost version is 1.54.0")
-        Logs.error("Please upgrade your distribution or install custom boost libraries" +
-                   " (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)")
-        return
+        conf.fatal('Minimum required Boost version is 1.54.0\n'
+                   'Please upgrade your distribution or manually install a newer version of Boost'
+                   ' (https://redmine.named-data.net/projects/nfd/wiki/Boost_FAQ)')
 
     conf.check_cfg(package='ChronoSync', args=['--cflags', '--libs'],
                    uselib_store='SYNC', mandatory=True)
 
+    conf.check_compiler_flags()
+
     conf.load('coverage')
 
     conf.load('sanitizers')
@@ -82,7 +79,7 @@
     version(bld)
 
     bld(features="subst",
-        name='version',
+        name='version.hpp',
         source='src/version.hpp.in',
         target='src/version.hpp',
         install_path=None,
@@ -95,43 +92,39 @@
         VERSION_MINOR=VERSION_SPLIT[1],
         VERSION_PATCH=VERSION_SPLIT[2])
 
-    nlsr_objects = bld(
+    bld.objects(
         target='nlsr-objects',
-        name='nlsr-objects',
-        features='cxx',
         source=bld.path.ant_glob(['src/**/*.cpp'],
                                  excl=['src/main.cpp']),
         use='NDN_CXX BOOST SYNC',
         includes='. src',
         export_includes='. src')
 
-    nlsr = bld(
+    bld.program(
         target='bin/nlsr',
-        features='cxx cxxprogram',
+        name='nlsr',
         source='src/main.cpp',
         use='nlsr-objects')
 
-    nlsrc = bld(
+    bld.program(
         target='bin/nlsrc',
-        features='cxx cxxprogram',
+        name='nlsrc',
         source='tools/nlsrc.cpp',
         use='nlsr-objects BOOST')
 
-    bld(features="subst",
-        source='nlsr.conf',
-        target='nlsr.conf.sample',
-        install_path="${SYSCONFDIR}/ndn")
+    bld.install_as('${SYSCONFDIR}/ndn/nlsr.conf.sample', 'nlsr.conf')
 
-    if bld.env['WITH_TESTS']:
+    if bld.env.WITH_TESTS:
         bld.recurse('tests')
 
-    if bld.env['SPHINX_BUILD']:
-        bld(features="sphinx",
-            builder="man",
-            outdir="docs/manpages",
-            config="docs/conf.py",
+    if bld.env.SPHINX_BUILD:
+        bld(features='sphinx',
+            name='manpages',
+            builder='man',
+            outdir='docs/manpages',
+            config='docs/conf.py',
             source=bld.path.ant_glob('docs/manpages/**/*.rst'),
-            install_path="${MANDIR}/",
+            install_path='${MANDIR}',
             VERSION=VERSION)
 
 def docs(bld):
@@ -142,79 +135,82 @@
     version(bld)
 
     if not bld.env.DOXYGEN:
-        Logs.error("ERROR: cannot build documentation (`doxygen' not found in $PATH)")
-    else:
-        bld(features="subst",
-            name="doxygen-conf",
-            source="docs/doxygen.conf.in",
-            target="docs/doxygen.conf",
-            VERSION=VERSION_BASE)
+        bld.fatal('Cannot build documentation ("doxygen" not found in PATH)')
 
-        bld(features="doxygen",
-            doxyfile='docs/doxygen.conf',
-            use="doxygen-conf")
+    bld(features='subst',
+        name='doxygen.conf',
+        source=['docs/doxygen.conf.in',
+                'docs/named_data_theme/named_data_footer-with-analytics.html.in'],
+        target=['docs/doxygen.conf',
+                'docs/named_data_theme/named_data_footer-with-analytics.html'],
+        VERSION=VERSION,
+        HTML_FOOTER='../build/docs/named_data_theme/named_data_footer-with-analytics.html' \
+                        if os.getenv('GOOGLE_ANALYTICS', None) \
+                        else '../docs/named_data_theme/named_data_footer.html',
+        GOOGLE_ANALYTICS=os.getenv('GOOGLE_ANALYTICS', ''))
+
+    bld(features='doxygen',
+        doxyfile='docs/doxygen.conf',
+        use='doxygen.conf')
 
 def sphinx(bld):
     version(bld)
 
     if not bld.env.SPHINX_BUILD:
-        bld.fatal("ERROR: cannot build documentation (`sphinx-build' not found in $PATH)")
-    else:
-        bld(features="sphinx",
-            outdir="docs",
-            source=bld.path.ant_glob('docs/**/*.rst'),
-            config="docs/conf.py",
-            VERSION=VERSION_BASE)
+        bld.fatal('Cannot build documentation ("sphinx-build" not found in PATH)')
+
+    bld(features='sphinx',
+        config='docs/conf.py',
+        outdir='docs',
+        source=bld.path.ant_glob('docs/**/*.rst'),
+        VERSION=VERSION)
 
 def version(ctx):
+    # don't execute more than once
     if getattr(Context.g_module, 'VERSION_BASE', None):
         return
 
     Context.g_module.VERSION_BASE = Context.g_module.VERSION
-    Context.g_module.VERSION_SPLIT = [v for v in VERSION_BASE.split('.')]
+    Context.g_module.VERSION_SPLIT = VERSION_BASE.split('.')
 
-    didGetVersion = False
+    # first, try to get a version string from git
+    gotVersionFromGit = False
     try:
         cmd = ['git', 'describe', '--always', '--match', '%s*' % GIT_TAG_PREFIX]
-        p = Utils.subprocess.Popen(cmd, stdout=Utils.subprocess.PIPE,
-                                   stderr=None, stdin=None)
-        out = str(p.communicate()[0].strip())
-        didGetVersion = (p.returncode == 0 and out != "")
-        if didGetVersion:
+        out = subprocess.check_output(cmd, universal_newlines=True).strip()
+        if out:
+            gotVersionFromGit = True
             if out.startswith(GIT_TAG_PREFIX):
-                Context.g_module.VERSION = out[len(GIT_TAG_PREFIX):]
+                Context.g_module.VERSION = out.lstrip(GIT_TAG_PREFIX)
             else:
-                Context.g_module.VERSION = "%s-commit-%s" % (Context.g_module.VERSION_BASE, out)
-    except OSError:
+                # no tags matched
+                Context.g_module.VERSION = '%s-commit-%s' % (VERSION_BASE, out)
+    except subprocess.CalledProcessError:
         pass
 
     versionFile = ctx.path.find_node('VERSION')
-
-    if not didGetVersion and versionFile is not None:
+    if not gotVersionFromGit and versionFile is not None:
         try:
             Context.g_module.VERSION = versionFile.read()
             return
-        except (OSError, IOError):
+        except EnvironmentError:
             pass
 
     # version was obtained from git, update VERSION file if necessary
     if versionFile is not None:
         try:
-            version = versionFile.read()
-            if version == Context.g_module.VERSION:
-                return # no need to update
-        except (OSError, IOError):
-            Logs.warn("VERSION file exists, but not readable")
+            if versionFile.read() == Context.g_module.VERSION:
+                # already up-to-date
+                return
+        except EnvironmentError as e:
+            Logs.warn('%s exists but is not readable (%s)' % (versionFile, e.strerror))
     else:
         versionFile = ctx.path.make_node('VERSION')
 
-    if versionFile is None:
-        return
-
     try:
         versionFile.write(Context.g_module.VERSION)
-    except (OSError, IOError):
-        Logs.warn("VERSION file is not writeable")
+    except EnvironmentError as e:
+        Logs.warn('%s is not writable (%s)' % (versionFile, e.strerror))
 
 def dist(ctx):
     version(ctx)