diff --git a/bindings/python/wscript b/bindings/python/wscript --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -6,25 +6,17 @@ import shutil import sys -import Task -import Options -import Configure -import TaskGen -import Logs -import Build -import Utils +from waflib import Task, Options, Configure, TaskGen, Logs, Build, Utils, Errors +from waflib.Errors import WafError -from waflib.Errors import WafError +feature = TaskGen.feature +after = TaskGen.after ## https://launchpad.net/pybindgen/ REQUIRED_PYBINDGEN_VERSION = (0, 15, 0, 809) REQUIRED_PYGCCXML_VERSION = (0, 9, 5) -from TaskGen import feature, after -import Task - - def add_to_python_path(path): if os.environ.get('PYTHONPATH', ''): @@ -38,7 +30,7 @@ def options(opt): - opt.tool_options('python') + opt.load('python') opt.add_option('--disable-python', help=("Don't build Python bindings."), action="store_true", default=False, @@ -76,7 +68,7 @@ available_modules.sort() all_modules_enabled = (enabled_modules == available_modules) - conf.check_tool('misc', tooldir=['waf-tools']) + conf.load('misc', tooldir=['waf-tools']) if sys.platform == 'cygwin': conf.report_optional_feature("python", "Python Bindings", False, @@ -91,20 +83,20 @@ conf.env.PYTHON = Options.options.with_python try: - conf.check_tool('python') - except Configure.ConfigurationError, ex: + conf.load('python') + except Errors.ConfigurationError, ex: conf.report_optional_feature("python", "Python Bindings", False, "The python interpreter was not found") return try: conf.check_python_version((2,3)) - except Configure.ConfigurationError, ex: + except Errors.ConfigurationError, ex: conf.report_optional_feature("python", "Python Bindings", False, "The python found version is too low (2.3 required)") return try: conf.check_python_headers() - except Configure.ConfigurationError, ex: + except Errors.ConfigurationError, ex: conf.report_optional_feature("python", "Python Bindings", False, "Python library or headers missing") return @@ -161,7 +153,7 @@ try: conf.check_python_module('pybindgen') - except Configure.ConfigurationError: + except Errors.ConfigurationError: Logs.warn("pybindgen missing => no python bindings") conf.report_optional_feature("python", "Python Bindings", False, "PyBindGen missing") @@ -197,9 +189,9 @@ try: ret = conf.run_c_code(code=test_program, - env=conf.env.copy(), compile_filename='test.cc', + env=conf.env.derive(), compile_filename='test.cc', features='cxx cprogram', execute=False) - except Configure.ConfigurationError: + except Errors.ConfigurationError: ret = 1 conf.msg('Checking for types %s and %s equivalence' % (t1, t2), (ret and 'no' or 'yes')) return not ret @@ -250,7 +242,7 @@ ## Check for pygccxml try: conf.check_python_module('pygccxml') - except Configure.ConfigurationError: + except Errors.ConfigurationError: conf.report_optional_feature("pygccxml", "Python API Scanning Support", False, "Missing 'pygccxml' Python module") return @@ -437,8 +429,6 @@ return env = bld.env - curdir = bld.path.abspath() - set_pybindgen_pythonpath(env) if Options.options.apiscan: @@ -489,9 +479,7 @@ grp = bld.get_group(bld.current_group) grp.append(task) - bld.new_task_gen(features='copy', - source="ns__init__.py", - target='ns/__init__.py') + bld(features='copy', source="ns__init__.py", target='ns/__init__.py') bld.install_as('${PYTHONARCHDIR}/ns/__init__.py', 'ns__init__.py') diff --git a/src/antenna/wscript b/src/antenna/wscript --- a/src/antenna/wscript +++ b/src/antenna/wscript @@ -21,7 +21,7 @@ 'test/test-parabolic-antenna.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'antenna' headers.source = [ 'model/angles.h', diff --git a/src/aodv/wscript b/src/aodv/wscript --- a/src/aodv/wscript +++ b/src/aodv/wscript @@ -23,7 +23,7 @@ 'test/loopback.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'aodv' headers.source = [ 'model/aodv-id-cache.h', @@ -37,6 +37,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/applications/wscript b/src/applications/wscript --- a/src/applications/wscript +++ b/src/applications/wscript @@ -32,7 +32,7 @@ 'test/udp-client-server-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'applications' headers.source = [ 'model/bulk-send-application.h', diff --git a/src/bridge/wscript b/src/bridge/wscript --- a/src/bridge/wscript +++ b/src/bridge/wscript @@ -7,7 +7,7 @@ 'model/bridge-channel.cc', 'helper/bridge-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'bridge' headers.source = [ 'model/bridge-net-device.h', @@ -16,6 +16,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/brite/wscript b/src/brite/wscript --- a/src/brite/wscript +++ b/src/brite/wscript @@ -1,6 +1,8 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- + import os -import Options + +from waflib import Options def options(opt): @@ -89,7 +91,7 @@ if bld.env['BRITE'] and bld.env['DL']: module.uselib = 'BRITE DL' - headers = bld.new_task_gen(features=['ns3header']) + headers = bld.new_task_gen(features='ns3header') headers.module = 'brite' headers.source = [ ] @@ -100,4 +102,4 @@ module_test.source.append('test/brite-test-topology.cc') if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_BRITE']: - bld.add_subdirs('examples') + bld.recurse('examples') diff --git a/src/buildings/wscript b/src/buildings/wscript --- a/src/buildings/wscript +++ b/src/buildings/wscript @@ -25,7 +25,7 @@ 'test/buildings-shadowing-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'buildings' headers.source = [ 'model/building.h', @@ -42,7 +42,7 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/click/wscript b/src/click/wscript --- a/src/click/wscript +++ b/src/click/wscript @@ -1,7 +1,8 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- import os -import Options + +from waflib import Options def options(opt): @@ -107,7 +108,7 @@ module.use.extend(['NSCLICK', 'DL']) module_test.use.extend(['NSCLICK', 'DL']) - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'click' headers.source = [ 'model/ipv4-click-routing.h', @@ -116,6 +117,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/config-store/wscript b/src/config-store/wscript --- a/src/config-store/wscript +++ b/src/config-store/wscript @@ -11,25 +11,29 @@ def configure(conf): if Options.options.disable_gtk: - conf.env['ENABLE_GTK_CONFIG_STORE'] = False + conf.env['ENABLE_GTK2'] = False conf.report_optional_feature("GtkConfigStore", "GtkConfigStore", - conf.env['ENABLE_GTK_CONFIG_STORE'], + conf.env['ENABLE_GTK2'], "--disable-gtk option given") else: - have_gtk = conf.pkg_check_modules('GTK_CONFIG_STORE', 'gtk+-2.0 >= 2.12', mandatory=False) - conf.env['ENABLE_GTK_CONFIG_STORE'] = have_gtk + have_gtk2 = conf.check_cfg(package='gtk+-2.0', atleast_version='2.12', + args=['--cflags', '--libs'], uselib_store='GTK2', + mandatory=False) + + conf.env['ENABLE_GTK2'] = have_gtk2 conf.report_optional_feature("GtkConfigStore", "GtkConfigStore", - conf.env['ENABLE_GTK_CONFIG_STORE'], + conf.env['ENABLE_GTK2'], "library 'gtk+-2.0 >= 2.12' not found") - have_libxml2 = conf.pkg_check_modules('LIBXML2', 'libxml-2.0 >= 2.6', mandatory=False) - if have_libxml2: - conf.define('HAVE_LIBXML2', 1) + have_libxml2 = conf.check_cfg(package='libxml-2.0', atleast_version='2.7', + args=['--cflags', '--libs'], uselib_store='LIBXML2', + mandatory=False) conf.env['ENABLE_LIBXML2'] = have_libxml2 conf.report_optional_feature("XmlIo", "XmlIo", conf.env['ENABLE_LIBXML2'], "library 'libxml-2.0 >= 2.7' not found") + conf.write_config_header('ns3/config-store-config.h', top=True) @@ -45,27 +49,27 @@ 'model/raw-text-config.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'config-store' headers.source = [ 'model/file-config.h', 'model/config-store.h', ] - if bld.env['ENABLE_GTK_CONFIG_STORE']: + if bld.env['ENABLE_GTK2']: headers.source.append ('model/gtk-config-store.h') module.source.extend (['model/gtk-config-store.cc', 'model/model-node-creator.cc', 'model/model-typeid-creator.cc', 'model/display-functions.cc', ]) - module.use.append('GTK_CONFIG_STORE') + module.use.append('GTK2') if bld.env['ENABLE_LIBXML2']: module.source.append ('model/xml-config.cc') module.use.append('LIBXML2') if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/core/wscript b/src/core/wscript --- a/src/core/wscript +++ b/src/core/wscript @@ -1,8 +1,7 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- import sys -import Options - +from waflib import Options import wutils def options(opt): @@ -49,7 +48,7 @@ conf.check_nonfatal(header_name='signal.h', define_name='HAVE_SIGNAL_H') # Check for POSIX threads - test_env = conf.env.copy() + test_env = conf.env.derive() if Options.platform != 'darwin' and Options.platform != 'cygwin': test_env.append_value('LINKFLAGS', '-pthread') test_env.append_value('CXXFLAGS', '-pthread') @@ -173,7 +172,7 @@ 'test/watchdog-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'core' headers.source = [ 'model/nstime.h', @@ -309,7 +308,7 @@ core_test.source.extend(['test/rng-test-suite.cc']) if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') pymod = bld.ns3_python_bindings() if pymod is not None: diff --git a/src/csma-layout/wscript b/src/csma-layout/wscript --- a/src/csma-layout/wscript +++ b/src/csma-layout/wscript @@ -5,14 +5,14 @@ obj.source = [ 'model/csma-star-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'csma-layout' headers.source = [ 'model/csma-star-helper.h', ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/csma/wscript b/src/csma/wscript --- a/src/csma/wscript +++ b/src/csma/wscript @@ -8,7 +8,7 @@ 'model/csma-channel.cc', 'helper/csma-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'csma' headers.source = [ 'model/backoff.h', @@ -18,6 +18,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/dsdv/wscript b/src/dsdv/wscript --- a/src/dsdv/wscript +++ b/src/dsdv/wscript @@ -16,7 +16,7 @@ 'test/dsdv-testcase.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'dsdv' headers.source = [ 'model/dsdv-rtable.h', @@ -26,6 +26,6 @@ 'helper/dsdv-helper.h', ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/dsr/wscript b/src/dsr/wscript --- a/src/dsr/wscript +++ b/src/dsr/wscript @@ -24,7 +24,7 @@ 'test/dsr-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'dsr' headers.source = [ 'model/dsr-routing.h', @@ -43,6 +43,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/emu/wscript b/src/emu/wscript --- a/src/emu/wscript +++ b/src/emu/wscript @@ -36,7 +36,7 @@ 'helper/emu-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'emu' headers.source = [ 'model/emu-net-device.h', @@ -52,6 +52,6 @@ module.env.append_value("DEFINES", "EMU_SOCK_CREATOR=\"%s\"" % (creator.target,)) if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/energy/wscript b/src/energy/wscript --- a/src/energy/wscript +++ b/src/energy/wscript @@ -25,7 +25,7 @@ 'test/li-ion-energy-source-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'energy' headers.source = [ 'model/wifi-radio-energy-model.h', @@ -44,6 +44,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/flow-monitor/wscript b/src/flow-monitor/wscript --- a/src/flow-monitor/wscript +++ b/src/flow-monitor/wscript @@ -17,7 +17,7 @@ 'test/histogram-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'flow-monitor' headers.source = ["model/%s" % s for s in [ 'flow-monitor.h', @@ -30,6 +30,6 @@ headers.source.append("helper/flow-monitor-helper.h") if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/internet/wscript b/src/internet/wscript --- a/src/internet/wscript +++ b/src/internet/wscript @@ -2,10 +2,8 @@ import os import sys -import Options -import Logs -import Utils -import Task +from waflib import Options, Logs, Utils, Task + # Required NSC version NSC_RELEASE_NAME = "nsc-0.5.3" @@ -210,7 +208,7 @@ 'test/ipv6-address-helper-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'internet' headers.source = [ 'model/udp-header.h', @@ -294,7 +292,7 @@ internet_test.use.append('DL') if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/lte/wscript b/src/lte/wscript --- a/src/lte/wscript +++ b/src/lte/wscript @@ -114,7 +114,7 @@ 'test/lte-test-mimo.cc' ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'lte' headers.source = [ 'model/lte-common.h', @@ -190,6 +190,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/mesh/wscript b/src/mesh/wscript --- a/src/mesh/wscript +++ b/src/mesh/wscript @@ -53,7 +53,7 @@ 'test/flame/regression.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'mesh' headers.source = [ 'model/mesh-information-element.h', @@ -90,6 +90,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/mobility/wscript b/src/mobility/wscript --- a/src/mobility/wscript +++ b/src/mobility/wscript @@ -31,7 +31,7 @@ 'test/waypoint-mobility-model-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'mobility' headers.source = [ 'model/box.h', @@ -55,6 +55,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/mpi/wscript b/src/mpi/wscript --- a/src/mpi/wscript +++ b/src/mpi/wscript @@ -1,7 +1,8 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- import sys import subprocess -import Options + +from waflib import Options from waflib.Errors import WafError def configure(conf): @@ -39,7 +40,7 @@ 'model/mpi-receiver.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'mpi' headers.source = [ 'model/distributed-simulator-impl.h', @@ -51,6 +52,6 @@ sim.use.append('MPI') if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/netanim/wscript b/src/netanim/wscript --- a/src/netanim/wscript +++ b/src/netanim/wscript @@ -18,7 +18,7 @@ 'test/netanim-test.cc', ] - headers = bld.new_task_gen (features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'netanim' headers.source = [ 'model/animation-interface.h', @@ -26,5 +26,5 @@ ] if (bld.env['ENABLE_EXAMPLES']) : - bld.add_subdirs ('examples') + bld.recurse('examples') diff --git a/src/network/wscript b/src/network/wscript --- a/src/network/wscript +++ b/src/network/wscript @@ -71,7 +71,7 @@ 'test/sequence-number-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'network' headers.source = [ 'model/address.h', @@ -135,6 +135,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/nix-vector-routing/wscript b/src/nix-vector-routing/wscript --- a/src/nix-vector-routing/wscript +++ b/src/nix-vector-routing/wscript @@ -8,7 +8,7 @@ 'helper/ipv4-nix-vector-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'nix-vector-routing' headers.source = [ 'model/ipv4-nix-vector-routing.h', @@ -16,6 +16,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/olsr/wscript b/src/olsr/wscript --- a/src/olsr/wscript +++ b/src/olsr/wscript @@ -20,7 +20,7 @@ 'test/tc-regression-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'olsr' headers.source = [ 'model/olsr-routing-protocol.h', @@ -32,6 +32,6 @@ if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/openflow/wscript b/src/openflow/wscript --- a/src/openflow/wscript +++ b/src/openflow/wscript @@ -1,27 +1,26 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- import os -import Options + +from waflib import Options from waflib.Errors import WafError def options(opt): opt.add_option('--with-openflow', help=('Path to OFSID source for NS-3 OpenFlow Integration support'), default='', dest='with_openflow') - opt.tool_options('boost', tooldir=["waf-tools"]) + opt.load('boost', tooldir=["waf-tools"]) def configure(conf): + conf.load('boost', tooldir=["waf-tools"]) try: - conf.check_tool('boost') - conf.check_boost(lib='signals filesystem') - if not conf.env.LIB_BOOST: - conf.check_boost(lib='signals filesystem', libpath="/usr/lib64") - except WafError: + conf.check_boost(lib='signals filesystem system') + except: conf.env['LIB_BOOST'] = [] - if not conf.env.LIB_BOOST: - conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False, - "Required boost libraries not found") + if not conf.env['LIB_BOOST']: + conf.report_optional_feature("openflow", "NS-3 OpenFlow Integration", False, + "Required boost libraries signals and filesystem not found") # Add this module to the list of modules that won't be built # if they are enabled. @@ -29,6 +28,7 @@ return + if Options.options.with_openflow: if os.path.isdir(Options.options.with_openflow): conf.msg("Checking for OpenFlow location", ("%s (given)" % Options.options.with_openflow)) @@ -142,7 +142,7 @@ obj.use.extend('OPENFLOW DL XML2'.split()) obj_test.use.extend('OPENFLOW DL XML2'.split()) - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'openflow' headers.source = [ ] @@ -160,4 +160,4 @@ headers.source.append('helper/openflow-switch-helper.h') if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_OPENFLOW']: - bld.add_subdirs('examples') + bld.recurse('examples') diff --git a/src/point-to-point-layout/wscript b/src/point-to-point-layout/wscript --- a/src/point-to-point-layout/wscript +++ b/src/point-to-point-layout/wscript @@ -9,7 +9,7 @@ 'model/point-to-point-star.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'point-to-point-layout' headers.source = [ 'model/point-to-point-dumbbell.h', diff --git a/src/point-to-point/wscript b/src/point-to-point/wscript --- a/src/point-to-point/wscript +++ b/src/point-to-point/wscript @@ -16,7 +16,7 @@ 'test/point-to-point-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'point-to-point' headers.source = [ 'model/point-to-point-net-device.h', @@ -27,6 +27,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/propagation/wscript b/src/propagation/wscript --- a/src/propagation/wscript +++ b/src/propagation/wscript @@ -24,7 +24,7 @@ 'test/itu-r-1411-nlos-over-rooftop-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'propagation' headers.source = [ 'model/propagation-delay-model.h', @@ -41,6 +41,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/spectrum/wscript b/src/spectrum/wscript --- a/src/spectrum/wscript +++ b/src/spectrum/wscript @@ -41,7 +41,7 @@ 'test/spectrum-ideal-phy-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'spectrum' headers.source = [ 'model/spectrum-model.h', @@ -76,7 +76,7 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/stats/wscript b/src/stats/wscript --- a/src/stats/wscript +++ b/src/stats/wscript @@ -1,13 +1,14 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- def configure(conf): - conf.env['SQLITE_STATS'] = conf.check_nonfatal(lib='sqlite3', define_name='SQLITE3', uselib_store='SQLITE3') - if not conf.env['SQLITE_STATS']: - conf.env['SQLITE_STATS'] = conf.pkg_check_modules('SQLITE3', 'sqlite3', mandatory=False) - conf.report_optional_feature("SqliteDataOutput", "SQlite stats data output", - conf.env['SQLITE_STATS'], - "library 'sqlite3' not found") + have_sqlite3 = conf.check_cfg(package='sqlite3', uselib_store='SQLITE3', + args=['--cflags', '--libs'], + mandatory=False) + conf.env['SQLITE_STATS'] = have_sqlite3 + conf.report_optional_feature("SqliteDataOutput", "SQlite stats data output", + conf.env['SQLITE_STATS'], + "library 'sqlite3' not found") def build(bld): obj = bld.create_ns3_module('stats', ['network']) @@ -25,7 +26,7 @@ 'test/basic-data-calculators-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'stats' headers.source = [ 'model/data-calculator.h', diff --git a/src/tap-bridge/wscript b/src/tap-bridge/wscript --- a/src/tap-bridge/wscript +++ b/src/tap-bridge/wscript @@ -34,7 +34,7 @@ 'model/tap-encode-decode.cc', 'helper/tap-bridge-helper.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'tap-bridge' headers.source = [ 'model/tap-bridge.h', @@ -52,6 +52,6 @@ module.env.append_value("DEFINES", "TAP_CREATOR=\"%s\"" % (tap_creator.target,)) if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/test/wscript b/src/test/wscript --- a/src/test/wscript +++ b/src/test/wscript @@ -16,7 +16,7 @@ return test = bld.create_ns3_module('test', ['internet', 'mobility', 'applications', 'csma', 'bridge', 'config-store', 'tools', 'point-to-point', 'csma-layout', 'flow-monitor', 'wifi']) - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'test' test_test = bld.create_ns3_module_test_library('test') diff --git a/src/tools/wscript b/src/tools/wscript --- a/src/tools/wscript +++ b/src/tools/wscript @@ -15,7 +15,7 @@ 'test/event-garbage-collector-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'tools' headers.source = [ 'model/average.h', @@ -25,6 +25,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/topology-read/wscript b/src/topology-read/wscript --- a/src/topology-read/wscript +++ b/src/topology-read/wscript @@ -15,7 +15,7 @@ 'test/rocketfuel-topology-reader-test-suite.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'topology-read' headers.source = [ 'model/topology-reader.h', @@ -26,6 +26,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/uan/wscript b/src/uan/wscript --- a/src/uan/wscript +++ b/src/uan/wscript @@ -34,7 +34,7 @@ 'test/uan-test.cc', 'test/uan-energy-model-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'uan' headers.source = [ 'model/uan-channel.h', @@ -64,6 +64,6 @@ ] if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/virtual-net-device/wscript b/src/virtual-net-device/wscript --- a/src/virtual-net-device/wscript +++ b/src/virtual-net-device/wscript @@ -6,13 +6,13 @@ module.source = [ 'model/virtual-net-device.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'virtual-net-device' headers.source = [ 'model/virtual-net-device.h', ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/visualizer/wscript b/src/visualizer/wscript --- a/src/visualizer/wscript +++ b/src/visualizer/wscript @@ -1,5 +1,5 @@ ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- -import Options +from waflib import Options required_python_modules = [ 'gtk', @@ -38,7 +38,7 @@ def build(bld): module = bld.create_ns3_module('visualizer', ['internet', 'wifi', 'point-to-point']) - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'visualizer' # Don't do anything more for this module if Python was explicitly @@ -61,7 +61,7 @@ 'model/dummy-file-for-static-builds.cc', ] - module.features.append('pyembed') + module.features += ' pyembed' #module.env.append_value('CXXFLAGS', module.env['shlib_CXXFLAGS']) #module.includes = '.' diff --git a/src/wifi/wscript b/src/wifi/wscript --- a/src/wifi/wscript +++ b/src/wifi/wscript @@ -75,7 +75,7 @@ 'test/wifi-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'wifi' headers.source = [ 'model/wifi-information-element.h', @@ -144,7 +144,7 @@ obj_test.use.extend(['GSL', 'GSLCBLAS', 'M']) if (bld.env['ENABLE_EXAMPLES']): - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/wimax/wscript b/src/wimax/wscript --- a/src/wimax/wscript +++ b/src/wimax/wscript @@ -63,7 +63,7 @@ 'test/wimax-fragmentation-test.cc', ] - headers = bld.new_task_gen(features=['ns3header']) + headers = bld(features='ns3header') headers.module = 'wimax' headers.source = [ 'model/wimax-channel.h', @@ -113,6 +113,6 @@ ] if bld.env['ENABLE_EXAMPLES']: - bld.add_subdirs('examples') + bld.recurse('examples') bld.ns3_python_bindings() diff --git a/src/wscript b/src/wscript --- a/src/wscript +++ b/src/wscript @@ -6,14 +6,8 @@ import types import warnings +from waflib import TaskGen, Task, Options, Build, Utils from waflib.Errors import WafError - -import TaskGen -import Task -import Options -import Build -import Utils - import wutils try: @@ -48,12 +42,12 @@ dest='enable_modules') for module in all_modules: - opt.sub_options(module, mandatory=False) + opt.recurse(module, mandatory=False) def configure(conf): for module in all_modules: - conf.sub_config(module, mandatory=False) + conf.recurse(module, mandatory=False) blddir = os.path.abspath(os.path.join(conf.bldnode.abspath(), conf.variant)) conf.env.append_value('NS3_MODULE_PATH', blddir) @@ -75,10 +69,10 @@ static = bool(bld.env.ENABLE_STATIC_NS3) # Create a separate library for this module. if static: - module = bld.new_task_gen(features=['cxx', 'cxxstlib', 'ns3module']) + module = bld(features='cxx cxxstlib ns3module') else: - module = bld.new_task_gen(features=['cxx', 'cxxshlib', 'ns3module']) - module.target = '%s/ns%s-%s%s' % (bld.srcnode.relpath_gen(module.path), wutils.VERSION, + module = bld(features='cxx cxxshlib ns3module') + module.target = '%s/ns%s-%s%s' % (bld.srcnode.path_from(module.path), wutils.VERSION, name, bld.env.BUILD_SUFFIX) linkflags = [] cxxflags = [] @@ -119,7 +113,7 @@ module.use = ['ns3-' + dep for dep in dependencies] module.test = test module.is_ns3_module = True - module.ns3_dir_location = bld.path.relpath_gen(bld.srcnode) + module.ns3_dir_location = bld.path.path_from(bld.srcnode) module.env.append_value("INCLUDES", '#') @@ -133,7 +127,7 @@ def apply_incpaths_ns3testlib(self): if not self.source: return - testdir = self.source[-1].parent.relpath_gen(self.bld.srcnode) + testdir = self.source[-1].parent.path_from(self.bld.srcnode) self.env.append_value("DEFINES", 'NS_TEST_SOURCEDIR="%s"' % (testdir,)) @@ -142,7 +136,7 @@ # the module being tested. library_name = name + "-test" library = bld.create_ns3_module(library_name, [name], test=True) - library.features.append("ns3testlib") + library.features += " ns3testlib" # Modify attributes for the test library that are different from a # normal module. @@ -154,7 +148,7 @@ bld.env.append_value('NS3_MODULES_WITH_TEST_LIBRARIES', [(library.module_name, library.name)]) # Set the include path from the build directory to modules. - relative_path_from_build_to_here = bld.path.relpath_gen(bld.bldnode) + relative_path_from_build_to_here = bld.path.path_from(bld.bldnode) include_flag = '-I' + relative_path_from_build_to_here library.env.append_value('CXXFLAGS', include_flag) library.env.append_value('CCFLAGS', include_flag) @@ -162,9 +156,9 @@ return library def create_obj(bld, *args): - warnings.warn("(in %s) Use bld.new_task_gen(...) now, instead of bld.create_obj(...)" % str(bld.path), + warnings.warn("(in %s) Use bld(...) call now, instead of bld.create_obj(...)" % str(bld.path), DeprecationWarning, stacklevel=2) - return bld.new_task_gen(*args) + return bld(*args) def ns3_python_bindings(bld): @@ -197,7 +191,7 @@ #debug = ('PYBINDGEN_DEBUG' in os.environ) debug = True # XXX - source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py').relpath_gen(bld.path), + source = [bld.srcnode.find_resource('bindings/python/ns3modulegen-modular.py').path_from(bld.path), "bindings/modulegen__%s.py" % apidefs] if bindings_dir.find_resource("modulegen_customizations.py") is not None: @@ -208,12 +202,11 @@ source.append("bindings/modulegen_local.py") module_py_name = module.replace('-', '_') - module_target_dir = bld.srcnode.find_dir("bindings/python/ns").relpath_gen(bld.path) + module_target_dir = bld.srcnode.find_dir("bindings/python/ns").path_from(bld.path) # if bindings/.py exists, it becomes the module frontend, and the C extension befomes _ if bld.path.find_resource("bindings/%s.py" % (module_py_name,)) is not None: - bld.new_task_gen( - features='copy', + bld(features='copy', source=("bindings/%s.py" % (module_py_name,)), target=('%s/%s.py' % (module_target_dir, module_py_name))) extension_name = '_%s' % (module_py_name,) @@ -240,7 +233,7 @@ if was_enabled: features.append(name) - bindgen = bld.new_task_gen(features=['command'], source=source, target=target, command=argv) + bindgen = bld(features='command', source=source, target=target, command=argv) bindgen.env['FEATURES'] = ','.join(features) bindgen.dep_vars = ['FEATURES', "GCC_RTTI_ABI_COMPLETE"] bindgen.before = 'cxx' @@ -249,7 +242,7 @@ bindgen.install_path = None # generate the extension module - pymod = bld.new_task_gen(features='cxx cxxshlib pyext') + pymod = bld(features='cxx cxxshlib pyext') pymod.source = ['bindings/ns3module.cc'] pymod.target = '%s/%s' % (module_target_dir, extension_name) pymod.name = 'ns3module_%s' % module @@ -305,10 +298,10 @@ if not_built in all_modules: all_modules.remove(not_built) - bld.add_subdirs(list(all_modules)) + bld.recurse(list(all_modules)) for module in all_modules: - modheader = bld.new_task_gen(features=['ns3moduleheader']) + modheader = bld(features='ns3moduleheader') modheader.module = module.split('/')[-1] class ns3pcfile_task(Task.Task): diff --git a/waf-1.7 b/waf-1.7 new file mode 100755 index 0000000000000000000000000000000000000000..59c7e9c070f0fa349be8a65a899aea4504201c3a GIT binary patch literal 90242 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 E3R)rTrvLx| diff --git a/waf-tools/boost.py b/waf-tools/boost.py --- a/waf-tools/boost.py +++ b/waf-tools/boost.py @@ -1,278 +1,360 @@ -#!/usr/bin/env python -# encoding: utf-8 -# -# partially based on boost.py written by Gernot Vormayr -# written by Ruediger Sonderfeld , 2008 -# modified by Bjoern Michaelsen, 2008 -# modified by Luca Fossati, 2008 -# rewritten for waf 1.5.1, Thomas Nagy, 2008 -# rewritten for waf 1.6.2, Sylvain Rouquette, 2011 - -''' -To add the boost tool to the waf file: -$ ./waf-light --tools=compat15,boost - or, if you have waf >= 1.6.2 -$ ./waf update --files=boost - -The wscript will look like: - -def options(opt): - opt.load('compiler_cxx boost') - -def configure(conf): - conf.load('compiler_cxx boost') - conf.check_boost(lib='system filesystem', mt=True, static=True) - -def build(bld): - bld(source='main.cpp', target='app', use='BOOST') -''' - -import sys -import re -from waflib import Utils, Logs -from waflib.Configure import conf -from waflib.Errors import WafError - -BOOST_LIBS = ('/usr/lib', '/usr/local/lib', - '/opt/local/lib', '/sw/lib', '/lib') -BOOST_INCLUDES = ('/usr/include', '/usr/local/include', - '/opt/local/include', '/sw/include') -BOOST_VERSION_FILE = 'boost/version.hpp' -BOOST_VERSION_CODE = ''' -#include -#include -int main() { std::cout << BOOST_LIB_VERSION << std::endl; } -''' - -# toolsets from {boost_dir}/tools/build/v2/tools/common.jam -PLATFORM = Utils.unversioned_sys_platform() -detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il' -detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang' -detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc' -BOOST_TOOLSETS = { - 'borland': 'bcb', - 'clang': detect_clang, - 'como': 'como', - 'cw': 'cw', - 'darwin': 'xgcc', - 'edg': 'edg', - 'g++': detect_mingw, - 'gcc': detect_mingw, - 'icpc': detect_intel, - 'intel': detect_intel, - 'kcc': 'kcc', - 'kylix': 'bck', - 'mipspro': 'mp', - 'mingw': 'mgw', - 'msvc': 'vc', - 'qcc': 'qcc', - 'sun': 'sw', - 'sunc++': 'sw', - 'tru64cxx': 'tru', - 'vacpp': 'xlc' -} - - -def options(opt): - opt.add_option('--boost-includes', type='string', - default='', dest='boost_includes', - help='''path to the boost directory where the includes are - e.g. /boost_1_45_0/include''') - opt.add_option('--boost-libs', type='string', - default='', dest='boost_libs', - help='''path to the directory where the boost libs are - e.g. /boost_1_45_0/stage/lib''') - opt.add_option('--boost-static', action='store_true', - default=False, dest='boost_static', - help='link static libraries') - opt.add_option('--boost-mt', action='store_true', - default=False, dest='boost_mt', - help='select multi-threaded libraries') - opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', - help='''select libraries with tags (dgsyp, d for debug), - see doc Boost, Getting Started, chapter 6.1''') - opt.add_option('--boost-toolset', type='string', - default='', dest='boost_toolset', - help='force a toolset e.g. msvc, vc90, \ - gcc, mingw, mgw45 (default: auto)') - py_version = '%d%d' % (sys.version_info[0], sys.version_info[1]) - opt.add_option('--boost-python', type='string', - default=py_version, dest='boost_python', - help='select the lib python with this version \ - (default: %s)' % py_version) - - -@conf -def __boost_get_version_file(self, dir): - try: - return self.root.find_dir(dir).find_node(BOOST_VERSION_FILE) - except: - return None - - -@conf -def boost_get_version(self, dir): - """silently retrieve the boost version number""" - re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"$', re.M) - try: - val = re_but.search(self.__boost_get_version_file(dir).read()).group(1) - except: - val = self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[dir], - execute=True, define_ret=True) - return val - - -@conf -def boost_get_includes(self, *k, **kw): - includes = k and k[0] or kw.get('includes', None) - if includes and self.__boost_get_version_file(includes): - return includes - for dir in BOOST_INCLUDES: - if self.__boost_get_version_file(dir): - return dir - if includes: - self.fatal('headers not found in %s' % includes) - else: - self.fatal('headers not found, use --boost-includes=/path/to/boost') - - -@conf -def boost_get_toolset(self, cc): - toolset = cc - if not cc: - build_platform = Utils.unversioned_sys_platform() - if build_platform in BOOST_TOOLSETS: - cc = build_platform - else: - cc = self.env.CXX_NAME - if cc in BOOST_TOOLSETS: - toolset = BOOST_TOOLSETS[cc] - return isinstance(toolset, str) and toolset or toolset(self.env) - - -@conf -def __boost_get_libs_path(self, *k, **kw): - ''' return the lib path and all the files in it ''' - if 'files' in kw: - return self.root.find_dir('.'), Utils.to_list(kw['files']) - libs = k and k[0] or kw.get('libs', None) - if libs: - path = self.root.find_dir(libs) - files = path.ant_glob('*boost_*') - if not libs or not files: - for dir in BOOST_LIBS: - try: - path = self.root.find_dir(dir) - files = path.ant_glob('*boost_*') - if files: - break - path = self.root.find_dir(dir + '64') - files = path.ant_glob('*boost_*') - if files: - break - except: - path = None - if not path: - if libs: - self.fatal('libs not found in %s' % libs) - else: - self.fatal('libs not found, \ - use --boost-includes=/path/to/boost/lib') - return path, files - - -@conf -def boost_get_libs(self, *k, **kw): - ''' - return the lib path and the required libs - according to the parameters - ''' - path, files = self.__boost_get_libs_path(**kw) - t = [] - if kw.get('mt', False): - t.append('mt') - if kw.get('abi', None): - t.append(kw['abi']) - tags = t and '(-%s)+' % '-'.join(t) or '' - toolset = '(-%s[0-9]{0,3})+' % self.boost_get_toolset(kw.get('toolset', '')) - version = '(-%s)+' % self.env.BOOST_VERSION - - def find_lib(re_lib, files): - for file in files: - if re_lib.search(file.name): - return file - return None - - def format_lib_name(name): - if name.startswith('lib'): - name = name[3:] - return name.split('.')[0] - - libs = [] - for lib in Utils.to_list(k and k[0] or kw.get('lib', None)): - py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' - # Trying libraries, from most strict match to least one - for pattern in ['boost_%s%s%s%s%s' % (lib, toolset, tags, py, version), - 'boost_%s%s%s%s' % (lib, tags, py, version), - 'boost_%s%s%s' % (lib, tags, version), - # Give up trying to find the right version - 'boost_%s%s%s%s' % (lib, toolset, tags, py), - 'boost_%s%s%s' % (lib, tags, py), - 'boost_%s%s' % (lib, tags)]: - file = find_lib(re.compile(pattern), files) - if file: - libs.append(format_lib_name(file.name)) - break - else: - self.fatal('lib %s not found in %s' % (lib, path)) - - return path.abspath(), libs - - -@conf -def check_boost(self, *k, **kw): - """ - initialize boost - - You can pass the same parameters as the command line (without "--boost-"), - but the command line has the priority. - """ - if not self.env['CXX']: - self.fatal('load a c++ compiler first, conf.load("compiler_cxx")') - - params = {'lib': k and k[0] or kw.get('lib', None)} - for key, value in self.options.__dict__.items(): - if not key.startswith('boost_'): - continue - key = key[len('boost_'):] - params[key] = value and value or kw.get(key, '') - - var = kw.get('uselib_store', 'BOOST') - - self.start_msg('Checking boost includes') - try: - self.env['INCLUDES_%s' % var] = self.boost_get_includes(**params) - self.env.BOOST_VERSION = self.boost_get_version(self.env['INCLUDES_%s' % var]) - except WafError: - self.end_msg("not found", 'YELLOW') - raise - self.end_msg(self.env.BOOST_VERSION) - if Logs.verbose: - Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var]) - - if not params['lib']: - return - self.start_msg('Checking boost libs') - try: - suffix = params.get('static', 'ST') or '' - path, libs = self.boost_get_libs(**params) - except WafError: - self.end_msg("not found", 'YELLOW') - raise - self.env['%sLIBPATH_%s' % (suffix, var)] = [path] - self.env['%sLIB_%s' % (suffix, var)] = libs - self.end_msg('ok') - if Logs.verbose: - Logs.pprint('CYAN', ' path : %s' % path) - Logs.pprint('CYAN', ' libs : %s' % libs) - +#!/usr/bin/env python +# encoding: utf-8 +# +# partially based on boost.py written by Gernot Vormayr +# written by Ruediger Sonderfeld , 2008 +# modified by Bjoern Michaelsen, 2008 +# modified by Luca Fossati, 2008 +# rewritten for waf 1.5.1, Thomas Nagy, 2008 +# rewritten for waf 1.6.2, Sylvain Rouquette, 2011 + +''' + +This is an extra tool, not bundled with the default waf binary. +To add the boost tool to the waf file: +$ ./waf-light --tools=compat15,boost + or, if you have waf >= 1.6.2 +$ ./waf update --files=boost + +When using this tool, the wscript will look like: + + def options(opt): + opt.load('compiler_cxx boost') + + def configure(conf): + conf.load('compiler_cxx boost') + conf.check_boost(lib='system filesystem') + + def build(bld): + bld(source='main.cpp', target='app', use='BOOST') + +Options are generated, in order to specify the location of boost includes/libraries. +The `check_boost` configuration function allows to specify the used boost libraries. +It can also provide default arguments to the --boost-static and --boost-mt command-line arguments. +Everything will be packaged together in a BOOST component that you can use. + +When using MSVC, a lot of compilation flags need to match your BOOST build configuration: + - you may have to add /EHsc to your CXXFLAGS or define boost::throw_exception if BOOST_NO_EXCEPTIONS is defined. + Errors: C4530 + - boost libraries will try to be smart and use the (pretty but often not useful) auto-linking feature of MSVC + So before calling `conf.check_boost` you might want to disabling by adding: + conf.env.DEFINES_BOOST += ['BOOST_ALL_NO_LIB'] + Errors: + - boost might also be compiled with /MT, which links the runtime statically. + If you have problems with redefined symbols, + self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] + self.env['CXXFLAGS_%s' % var] += ['/MD', '/EHsc'] +Passing `--boost-linkage_autodetect` might help ensuring having a correct linkage in some basic cases. + +''' + +import sys +import re +from waflib import Utils, Logs, Errors +from waflib.Configure import conf + +BOOST_LIBS = ['/usr/lib', '/usr/local/lib', '/opt/local/lib', '/sw/lib', '/lib'] +BOOST_INCLUDES = ['/usr/include', '/usr/local/include', '/opt/local/include', '/sw/include'] +BOOST_VERSION_FILE = 'boost/version.hpp' +BOOST_VERSION_CODE = ''' +#include +#include +int main() { std::cout << BOOST_LIB_VERSION << std::endl; } +''' + +# toolsets from {boost_dir}/tools/build/v2/tools/common.jam +PLATFORM = Utils.unversioned_sys_platform() +detect_intel = lambda env: (PLATFORM == 'win32') and 'iw' or 'il' +detect_clang = lambda env: (PLATFORM == 'darwin') and 'clang-darwin' or 'clang' +detect_mingw = lambda env: (re.search('MinGW', env.CXX[0])) and 'mgw' or 'gcc' +BOOST_TOOLSETS = { + 'borland': 'bcb', + 'clang': detect_clang, + 'como': 'como', + 'cw': 'cw', + 'darwin': 'xgcc', + 'edg': 'edg', + 'g++': detect_mingw, + 'gcc': detect_mingw, + 'icpc': detect_intel, + 'intel': detect_intel, + 'kcc': 'kcc', + 'kylix': 'bck', + 'mipspro': 'mp', + 'mingw': 'mgw', + 'msvc': 'vc', + 'qcc': 'qcc', + 'sun': 'sw', + 'sunc++': 'sw', + 'tru64cxx': 'tru', + 'vacpp': 'xlc' +} + + +def options(opt): + opt.add_option('--boost-includes', type='string', + default='', dest='boost_includes', + help='''path to the boost includes root (~boost root) + e.g. /path/to/boost_1_47_0''') + opt.add_option('--boost-libs', type='string', + default='', dest='boost_libs', + help='''path to the directory where the boost libs are + e.g. /path/to/boost_1_47_0/stage/lib''') + opt.add_option('--boost-static', action='store_true', + default=False, dest='boost_static', + help='link with static boost libraries (.lib/.a)') + opt.add_option('--boost-mt', action='store_true', + default=False, dest='boost_mt', + help='select multi-threaded libraries') + opt.add_option('--boost-abi', type='string', default='', dest='boost_abi', + help='''select libraries with tags (dgsyp, d for debug), + see doc Boost, Getting Started, chapter 6.1''') + opt.add_option('--boost-linkage_autodetect', action="store_true", dest='boost_linkage_autodetect', + help="auto-detect boost linkage options (don't get used to it / might break other stuff)") + opt.add_option('--boost-toolset', type='string', + default='', dest='boost_toolset', + help='force a toolset e.g. msvc, vc90, \ + gcc, mingw, mgw45 (default: auto)') + py_version = '%d%d' % (sys.version_info[0], sys.version_info[1]) + opt.add_option('--boost-python', type='string', + default=py_version, dest='boost_python', + help='select the lib python with this version \ + (default: %s)' % py_version) + + +@conf +def __boost_get_version_file(self, dir): + try: + return self.root.find_dir(dir).find_node(BOOST_VERSION_FILE) + except: + return None + + +@conf +def boost_get_version(self, dir): + """silently retrieve the boost version number""" + re_but = re.compile('^#define\\s+BOOST_LIB_VERSION\\s+"(.*)"$', re.M) + try: + val = re_but.search(self.__boost_get_version_file(dir).read()).group(1) + except: + val = self.check_cxx(fragment=BOOST_VERSION_CODE, includes=[dir], execute=False, define_ret=True) + return val + + +@conf +def boost_get_includes(self, *k, **kw): + includes = k and k[0] or kw.get('includes', None) + if includes and self.__boost_get_version_file(includes): + return includes + for dir in BOOST_INCLUDES: + if self.__boost_get_version_file(dir): + return dir + if includes: + self.fatal('headers not found in %s' % includes) + else: + self.fatal('headers not found, please provide a --boost-includes argument (see help)') + + +@conf +def boost_get_toolset(self, cc): + toolset = cc + if not cc: + build_platform = Utils.unversioned_sys_platform() + if build_platform in BOOST_TOOLSETS: + cc = build_platform + else: + cc = self.env.CXX_NAME + if cc in BOOST_TOOLSETS: + toolset = BOOST_TOOLSETS[cc] + return isinstance(toolset, str) and toolset or toolset(self.env) + + +@conf +def __boost_get_libs_path(self, *k, **kw): + ''' return the lib path and all the files in it ''' + if 'files' in kw: + return self.root.find_dir('.'), Utils.to_list(kw['files']) + libs = k and k[0] or kw.get('libs', None) + if libs: + path = self.root.find_dir(libs) + files = path.ant_glob('*boost_*') + if not libs or not files: + for dir in BOOST_LIBS: + try: + path = self.root.find_dir(dir) + files = path.ant_glob('*boost_*') + if files: + break + path = self.root.find_dir(dir + '64') + files = path.ant_glob('*boost_*') + if files: + break + except: + path = None + if not path: + if libs: + self.fatal('libs not found in %s' % libs) + else: + self.fatal('libs not found, please provide a --boost-libs argument (see help)') + + self.to_log('Found the boost path in %r with the libraries:' % path) + for x in files: + self.to_log(' %r' % x) + return path, files + +@conf +def boost_get_libs(self, *k, **kw): + ''' + return the lib path and the required libs + according to the parameters + ''' + path, files = self.__boost_get_libs_path(**kw) + t = [] + if kw.get('mt', False): + t.append('mt') + if kw.get('abi', None): + t.append(kw['abi']) + tags = t and '(-%s)+' % '-'.join(t) or '' + toolset = self.boost_get_toolset(kw.get('toolset', '')) + toolset_pat = '(-%s[0-9]{0,3})+' % toolset + version = '(-%s)+' % self.env.BOOST_VERSION + + def find_lib(re_lib, files): + for file in files: + if re_lib.search(file.name): + self.to_log('Found boost lib %s' % file) + return file + return None + + def format_lib_name(name): + if name.startswith('lib') and self.env.CC_NAME != 'msvc': + name = name[3:] + return name[:name.rfind('.')] + + libs = [] + for lib in Utils.to_list(k and k[0] or kw.get('lib', None)): + py = (lib == 'python') and '(-py%s)+' % kw['python'] or '' + # Trying libraries, from most strict match to least one + for pattern in ['boost_%s%s%s%s%s' % (lib, toolset_pat, tags, py, version), + 'boost_%s%s%s%s' % (lib, tags, py, version), + 'boost_%s%s%s' % (lib, tags, version), + # Give up trying to find the right version + 'boost_%s%s%s%s' % (lib, toolset_pat, tags, py), + 'boost_%s%s%s' % (lib, tags, py), + 'boost_%s%s' % (lib, tags)]: + self.to_log('Trying pattern %s' % pattern) + file = find_lib(re.compile(pattern), files) + if file: + libs.append(format_lib_name(file.name)) + break + else: + self.fatal('lib %s not found in %s' % (lib, path.abspath())) + + return path.abspath(), libs + + +@conf +def check_boost(self, *k, **kw): + """ + Initialize boost libraries to be used. + + Keywords: you can pass the same parameters as with the command line (without "--boost-"). + Note that the command line has the priority, and should preferably be used. + """ + if not self.env['CXX']: + self.fatal('load a c++ compiler first, conf.load("compiler_cxx")') + + params = {'lib': k and k[0] or kw.get('lib', None)} + for key, value in self.options.__dict__.items(): + if not key.startswith('boost_'): + continue + key = key[len('boost_'):] + params[key] = value and value or kw.get(key, '') + + var = kw.get('uselib_store', 'BOOST') + + self.start_msg('Checking boost includes') + self.env['INCLUDES_%s' % var] = inc = self.boost_get_includes(**params) + self.env.BOOST_VERSION = self.boost_get_version(inc) + self.end_msg(self.env.BOOST_VERSION) + if Logs.verbose: + Logs.pprint('CYAN', ' path : %s' % self.env['INCLUDES_%s' % var]) + + if not params['lib']: + return + self.start_msg('Checking boost libs') + suffix = params.get('static', None) and 'ST' or '' + path, libs = self.boost_get_libs(**params) + self.env['%sLIBPATH_%s' % (suffix, var)] = [path] + self.env['%sLIB_%s' % (suffix, var)] = libs + self.end_msg('ok') + if Logs.verbose: + Logs.pprint('CYAN', ' path : %s' % path) + Logs.pprint('CYAN', ' libs : %s' % libs) + + + def try_link(): + if 'system' in params['lib']: + self.check_cxx( + fragment="\n".join([ + '#include ', + 'int main() { boost::system::error_code c; }', + ]), + use=var, + execute=False, + ) + if 'thread' in params['lib']: + self.check_cxx( + fragment="\n".join([ + '#include ', + 'int main() { boost::thread t; }', + ]), + use=var, + execute=False, + ) + + if params.get('linkage_autodetect', False): + self.start_msg("Attempting to detect boost linkage flags") + toolset = self.boost_get_toolset(kw.get('toolset', '')) + if toolset in ['vc']: + # disable auto-linking feature, causing error LNK1181 + # because the code wants to be linked against + self.env['DEFINES_%s' % var] += ['BOOST_ALL_NO_LIB'] + + # if no dlls are present, we guess the .lib files are not stubs + has_dlls = False + for x in Utils.listdir(path): + if x.endswith(self.env.cxxshlib_PATTERN % ''): + has_dlls = True + break + if not has_dlls: + self.env['STLIBPATH_%s' % var] = [path] + self.env['STLIB_%s' % var] = libs + del self.env['LIB_%s' % var] + del self.env['LIBPATH_%s' % var] + + # we attempt to play with some known-to-work CXXFLAGS combinations + for cxxflags in (['/MD', '/EHsc'], []): + self.env.stash() + self.env["CXXFLAGS_%s" % var] += cxxflags + try: + try_link() + self.end_msg("ok: winning cxxflags combination: %s" % (self.env["CXXFLAGS_%s" % var])) + e = None + break + except Errors.ConfigurationError as exc: + self.env.revert() + e = exc + + if e is not None: + self.fatal("Could not auto-detect boost linking flags combination, you may report it to boost.py author", ex=e) + else: + self.fatal("Boost linkage flags auto-detection not implemented (needed ?) for this toolchain") + else: + self.start_msg('Checking for boost linkage') + try: + try_link() + except Errors.ConfigurationError as e: + self.fatal("Could not link against boost libraries using supplied options") + self.end_msg('ok') + diff --git a/waf-tools/cflags.py b/waf-tools/cflags.py --- a/waf-tools/cflags.py +++ b/waf-tools/cflags.py @@ -1,6 +1,4 @@ -import Logs -import Options -import Utils +from waflib import Logs, Options, Utils class CompilerTraits(object): diff --git a/waf-tools/command.py b/waf-tools/command.py --- a/waf-tools/command.py +++ b/waf-tools/command.py @@ -1,18 +1,15 @@ -import TaskGen# import feature, taskgen_method, before_method, task_gen -import Node, Task, Utils, Build +import re import subprocess -import Options + +# import feature, taskgen_method, before_method, task_gen +from waflib import TaskGen, Node, Task, Utils, Build, Options, Logs, Task +debug = Logs.debug +error = Logs.error import shellcmd #shellcmd.subprocess = pproc # the WAF version of the subprocess module is supposedly less buggy - -from Logs import debug, error shellcmd.debug = debug -import Task - -import re - arg_rx = re.compile(r"(?P\$\$)|(?P\$\{(?P\w+)(?P.*?)\})", re.M) diff --git a/waf-tools/misc.py b/waf-tools/misc.py --- a/waf-tools/misc.py +++ b/waf-tools/misc.py @@ -322,9 +322,6 @@ if self.cwd is None: cwd = None - else: - assert isinstance(cwd, CmdDirArg) - self.cwd.find_node(self.path) args = [] inputs = [] diff --git a/waf-tools/pkgconfig.py b/waf-tools/pkgconfig.py deleted file mode 100644 --- a/waf-tools/pkgconfig.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- mode: python; encoding: utf-8 -*- -# Gustavo Carneiro (gjamc) 2008 - -import Options -import Configure -import subprocess -import config_c -import sys - -def configure(conf): - pkg_config = conf.find_program('pkg-config', var='PKG_CONFIG') - if not pkg_config: return - -@Configure.conf -def pkg_check_modules(conf, uselib_name, expression, mandatory=True): - pkg_config = conf.env['PKG_CONFIG'] - if not pkg_config: - if mandatory: - conf.fatal("pkg-config is not available") - else: - return False - - if Options.options.verbose: - extra_msg = ' (%s)' % expression - else: - extra_msg = '' - - conf.start_msg('Checking for pkg-config flags for %s%s' % (uselib_name, extra_msg)) - - argv = [pkg_config, '--cflags', '--libs', expression] - cmd = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = cmd.communicate() - retval = cmd.wait() - - conf.to_log('%r: %r (exit code %i)\n%s' % (argv, out, retval, err)) - - if retval != 0: - conf.end_msg(False) - sys.stderr.write(err) - else: - if Options.options.verbose: - conf.end_msg(out) - else: - conf.end_msg(True) - - if retval == 0: - conf.parse_flags(out, uselib_name, conf.env) - conf.env[uselib_name] = True - return True - - else: - - conf.env[uselib_name] = False - if mandatory: - raise Configure.ConfigurationError('pkg-config check failed') - else: - return False - -@Configure.conf -def pkg_check_module_variable(conf, module, variable): - pkg_config = conf.env['PKG_CONFIG'] - if not pkg_config: - conf.fatal("pkg-config is not available") - - argv = [pkg_config, '--variable', variable, module] - cmd = subprocess.Popen(argv, stdout=subprocess.PIPE) - out, dummy = cmd.communicate() - retval = cmd.wait() - out = out.rstrip() # strip the trailing newline - - msg_checking = ("Checking for pkg-config variable %r in %s" % (variable, module,)) - conf.check_message_custom(msg_checking, '', out) - conf.log.write('%r: %r (exit code %i)\n' % (argv, out, retval)) - - if retval == 0: - return out - else: - raise Configure.ConfigurationError('pkg-config check failed') diff --git a/waf-tools/relocation.py b/waf-tools/relocation.py --- a/waf-tools/relocation.py +++ b/waf-tools/relocation.py @@ -64,7 +64,7 @@ try: return self.uid_ except AttributeError: - # this is not a real hot zone, but we want to avoid surprizes here + # this is not a real hot zone, but we want to avoid surprises here m = Utils.md5() up = m.update up(self.__class__.__name__.encode()) @@ -80,6 +80,6 @@ lst = self.to_incnodes(self.to_list(getattr(self, 'includes', [])) + self.env['INCLUDES']) self.includes_nodes = lst bld = self.bld - self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.srcnode) or x.abspath() for x in lst] + self.env['INCPATHS'] = [x.is_child_of(bld.srcnode) and x.path_from(bld.bldnode) or x.abspath() for x in lst] diff --git a/wscript b/wscript --- a/wscript +++ b/wscript @@ -8,25 +8,20 @@ import os.path import re import shlex +import subprocess import textwrap +from utils import read_config_file + + # WAF modules -import subprocess -import Options - -import Logs -import TaskGen - -import Task - -import Utils -import Build -import Configure -import Scripting - +from waflib import Utils, Scripting, Configure, Build, Options, TaskGen, Context, Task, Logs, Errors from waflib.Errors import WafError -from utils import read_config_file + +# local modules +import wutils + # By default, all modules will be enabled, examples will be disabled, # and tests will be disabled. @@ -52,9 +47,6 @@ } cflags.default_profile = 'debug' -# local modules -import wutils - Configure.autoconfig = 0 # the following two variables are used by the target "waf dist" @@ -214,9 +206,9 @@ dest='doxygen_no_build') # options provided in subdirectories - opt.sub_options('src') - opt.sub_options('bindings/python') - opt.sub_options('src/internet') + opt.recurse('src') + opt.recurse('bindings/python') + opt.recurse('src/internet') def _check_compilation_flag(conf, flag, mode='cxx', linkflags=None): @@ -240,7 +232,7 @@ flag_str = flag_str[:28] + "..." conf.start_msg('Checking for compilation %s support' % (flag_str,)) - env = conf.env.copy() + env = conf.env.derive() if mode == 'cc': mode = 'c' @@ -259,7 +251,7 @@ retval = conf.run_c_code(code='#include \nint main() { return 0; }\n', env=env, compile_filename=fname, features=[mode, mode+'program'], execute=False) - except Configure.ConfigurationError: + except Errors.ConfigurationError: ok = False else: ok = (retval == 0) @@ -286,7 +278,7 @@ return None def configure(conf): - conf.check_tool("relocation", ["waf-tools"]) + conf.load('relocation', tooldir=['waf-tools']) # attach some extra methods conf.check_nonfatal = types.MethodType(_check_nonfatal, conf) @@ -295,15 +287,11 @@ conf.check_optional_feature = types.MethodType(check_optional_feature, conf) conf.env['NS3_OPTIONAL_FEATURES'] = [] - conf.check_tool('compiler_c') - conf.check_tool('compiler_cxx') - conf.check_tool('cflags', ['waf-tools']) - try: - conf.check_tool('pkgconfig', ['waf-tools']) - except Configure.ConfigurationError: - pass - conf.check_tool('command', ['waf-tools']) - conf.check_tool('gnu_dirs') + conf.load('compiler_c') + conf.load('compiler_cxx') + conf.load('cflags', tooldir=['waf-tools']) + conf.load('command', tooldir=['waf-tools']) + conf.load('gnu_dirs') env = conf.env @@ -376,9 +364,9 @@ conf.env['MODULES_NOT_BUILT'] = [] - conf.sub_config('bindings/python') + conf.recurse('bindings/python') - conf.sub_config('src') + conf.recurse('src') # Set the list of enabled modules. if Options.options.enable_modules: @@ -410,7 +398,7 @@ if not conf.env['NS3_ENABLED_MODULES']: raise WafError('Exiting because the ' + not_built + ' module can not be built and it was the only one enabled.') - conf.sub_config('src/mpi') + conf.recurse('src/mpi') # for suid bits try: @@ -488,19 +476,18 @@ # These flags are used for the implicitly dependent modules. if env['ENABLE_STATIC_NS3']: if sys.platform == 'darwin': - env.STATICLIB_MARKER = '-Wl,-all_load' + env.STLIB_MARKER = '-Wl,-all_load' else: - env.STATICLIB_MARKER = '-Wl,--whole-archive,-Bstatic' + env.STLIB_MARKER = '-Wl,--whole-archive,-Bstatic' env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive' - have_gsl = conf.pkg_check_modules('GSL', 'gsl', mandatory=False) + + have_gsl = conf.check_cfg(package='gsl', args=['--cflags', '--libs'], + uselib_store='GSL', mandatory=False) conf.env['ENABLE_GSL'] = have_gsl - conf.report_optional_feature("GSL", "GNU Scientific Library (GSL)", conf.env['ENABLE_GSL'], "GSL not found") - if have_gsl: - conf.env.append_value('DEFINES', "ENABLE_GSL") # for compiling C code, copy over the CXX* flags conf.env.append_value('CCFLAGS', conf.env['CXXFLAGS']) @@ -555,7 +542,7 @@ except ValueError, ex: raise WafError(str(ex)) program_node = program_obj.path.find_or_declare(program_obj.target) - self.filename = program_node.abspath() + self.filename = program_node.get_bld().abspath() def run(self): @@ -580,7 +567,7 @@ def create_suid_program(bld, name): grp = bld.current_group bld.add_group() # this to make sure no two sudo tasks run at the same time - program = bld.new_task_gen(features=['cxx', 'cxxprogram']) + program = bld(features='cxx cxxprogram') program.is_ns3_program = True program.module_deps = list() program.name = name @@ -594,7 +581,7 @@ return program def create_ns3_program(bld, name, dependencies=('core',)): - program = bld.new_task_gen(features=['cxx', 'cxxprogram']) + program = bld(features='cxx cxxprogram') program.is_ns3_program = True program.name = name @@ -607,7 +594,7 @@ if sys.platform == 'darwin': program.env.STLIB_MARKER = '-Wl,-all_load' else: - program.env.STLIB_MARKER = '-Wl,--whole-archive,-Bstatic' + program.env.STLIB_MARKER = '-Wl,-Bstatic,--whole-archive' program.env.SHLIB_MARKER = '-Wl,-Bdynamic,--no-whole-archive' else: if program.env.DEST_BINFMT == 'elf': @@ -628,8 +615,7 @@ if dir.startswith('.') or dir == 'CVS': continue if os.path.isdir(os.path.join('examples', dir)): - bld.add_subdirs(os.path.join('examples', dir)) - + bld.recurse(os.path.join('examples', dir)) def add_scratch_programs(bld): all_modules = [mod[len("ns3-"):] for mod in bld.env['NS3_ENABLED_MODULES']] @@ -639,7 +625,7 @@ if os.path.isdir(os.path.join("scratch", filename)): obj = bld.create_ns3_program(filename, all_modules) obj.path = obj.path.find_dir('scratch').find_dir(filename) - obj.source = obj.path.ant_glob('*.cc') + obj.source = obj.path.get_bld().ant_glob('*.cc') obj.target = filename obj.name = obj.target obj.install_path = None @@ -652,7 +638,6 @@ obj.name = obj.target obj.install_path = None - def _get_all_task_gen(self): for group in self.groups: for taskgen in group: @@ -699,12 +684,12 @@ wutils.bld = bld if Options.options.no_task_lines: - import Runner + from waflib import Runner def null_printout(s): pass Runner.printout = null_printout - Options.cwd_launch = bld.path.abspath() + Options.cwd_launch = bld.path.get_bld().abspath() bld.create_ns3_program = types.MethodType(create_ns3_program, bld) bld.register_ns3_script = types.MethodType(register_ns3_script, bld) bld.create_suid_program = types.MethodType(create_suid_program, bld) @@ -713,7 +698,7 @@ bld.find_ns3_module = types.MethodType(_find_ns3_module, bld) # process subfolders from here - bld.add_subdirs('src') + bld.recurse('src') # If modules have been enabled, then set lists of enabled modules # and enabled module test libraries. @@ -747,7 +732,7 @@ bld.env.append_value('NS3_ENABLED_MODULE_TEST_LIBRARIES', testlib) add_examples_programs(bld) - add_scratch_programs(bld) + #add_scratch_programs(bld) if env['NS3_ENABLED_MODULES']: modules = env['NS3_ENABLED_MODULES'] @@ -780,7 +765,7 @@ # launch directory. launch_dir = os.path.abspath(Context.launch_dir) object_relative_path = os.path.join( - wutils.relpath(obj.path.abspath(), launch_dir), + wutils.relpath(obj.path.get_bld().abspath(), launch_dir), object_name) bld.env.append_value('NS3_RUNNABLE_PROGRAMS', object_relative_path) @@ -821,11 +806,11 @@ if script_runnable: bld.env.append_value('NS3_RUNNABLE_SCRIPTS', script) - bld.add_subdirs('bindings/python') + bld.recurse('bindings/python') # Process this subfolder here after the lists of enabled modules # and module test libraries have been set. - bld.add_subdirs('utils') + bld.recurse('utils') # Set this so that the lists will be printed at the end of this # build command. @@ -920,7 +905,6 @@ -from waflib import Context, Build class CheckContext(Context.Context): """run the equivalent of the old ns-3 unit tests using test.py""" cmd = 'check' @@ -962,7 +946,7 @@ # --enable-modules=xxx pass else: - prog = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)).abspath(env) + prog = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)).get_bld().abspath(env) # Create a header file with the introspected information. doxygen_out = open(os.path.join('doc', 'introspected-doxygen.h'), 'w') @@ -1016,7 +1000,6 @@ raise WafError(msg) -from waflib import Context, Build class Ns3ShellContext(Context.Context): """run a shell with an environment suitably modified to run locally built programs""" cmd = 'shell' @@ -1062,7 +1045,7 @@ raise SystemExit(1) return - prog = program_obj.path.find_or_declare(program_obj.target).abspath() + prog = program_obj.path.find_or_declare(program_obj.target).get_bld().abspath() if not os.path.exists(prog): Logs.error("print-introspected-doxygen has not been built yet." @@ -1089,8 +1072,6 @@ raise SystemExit(1) -from waflib import Context, Build - def _getVersion(): """update the ns3_version.js file, when building documentation""" @@ -1110,7 +1091,6 @@ bld.execute() _doxygen(bld) -from waflib import Context, Build class Ns3SphinxContext(Context.Context): """build the Sphinx documentation: manual, tutorial, models""" @@ -1131,7 +1111,6 @@ self.sphinx_build(os.path.join("doc", sphinxdir)) -from waflib import Context, Build class Ns3DocContext(Context.Context): """build all the documentation: doxygen, manual, tutorial, models""" diff --git a/wutils.py b/wutils.py --- a/wutils.py +++ b/wutils.py @@ -1,16 +1,12 @@ import os import os.path +import re import sys import subprocess import shlex # WAF modules -import Options -import Utils -import Logs -import TaskGen -import Build -import re +from waflib import Options, Utils, Logs, TaskGen, Build, Context from waflib.Errors import WafError # these are set from the main wscript file @@ -47,7 +43,7 @@ return os.path.curdir return os.path.join(*rel_list) -from waflib import Context + def find_program(program_name, env): launch_dir = os.path.abspath(Context.launch_dir) #top_dir = os.path.abspath(Options.cwd_launch)