Upgrade to WAF 1.5.4

This commit is contained in:
Gustavo J. A. M. Carneiro
2009-04-13 23:10:37 +01:00
parent 069c9f301e
commit 62add283d4
7 changed files with 95 additions and 75 deletions

0
bindings/python/waf vendored Normal file → Executable file
View File

View File

@@ -273,7 +273,7 @@ class all_ns3_headers_taskgen(TaskGen.task_gen):
def apply(self):
## get all of the ns3 headers
ns3_dir_node = Build.bld.path.find_dir("ns3")
ns3_dir_node = self.bld.path.find_dir("ns3")
all_headers_inputs = []
for filename in self.to_list(self.source):
@@ -284,7 +284,7 @@ class all_ns3_headers_taskgen(TaskGen.task_gen):
## if self.source was empty, include all ns3 headers in enabled modules
if not all_headers_inputs:
for ns3headers in Build.bld.all_task_gen:
for ns3headers in self.bld.all_task_gen:
if type(ns3headers).__name__ == 'ns3header_taskgen': # XXX: find less hackish way to compare
## skip headers not part of enabled modules
if self.env['NS3_ENABLED_MODULES']:
@@ -307,7 +307,7 @@ class all_ns3_headers_taskgen(TaskGen.task_gen):
pass
def get_modules_and_headers():
def get_modules_and_headers(bld):
"""
Gets a dict of
module_name => ([module_dep1, module_dep2, ...], [module_header1, module_header2, ...])
@@ -315,13 +315,13 @@ def get_modules_and_headers():
"""
retval = {}
for module in Build.bld.all_task_gen:
for module in bld.all_task_gen:
if not module.name.startswith('ns3-'):
continue
module_name = module.name[4:] # strip the ns3- prefix
## find the headers object for this module
headers = []
for ns3headers in Build.bld.all_task_gen:
for ns3headers in bld.all_task_gen:
if type(ns3headers).__name__ != 'ns3header_taskgen': # XXX: find less hackish way to compare
continue
if ns3headers.module != module_name:
@@ -338,8 +338,9 @@ class python_scan_task(Task.TaskBase):
"""
after = 'gen_everything_h_task'
before = 'cc cxx'
def __init__(self, curdirnode, env):
super(python_scan_task, self).__init__()
def __init__(self, curdirnode, env, bld):
self.bld = bld
super(python_scan_task, self).__init__(generator=self)
self.curdirnode = curdirnode
self.env = env
@@ -356,7 +357,7 @@ class python_scan_task(Task.TaskBase):
os.path.join(self.curdirnode.abspath(), 'ns3modulegen_generated.py'), # output file
]
scan = subprocess.Popen(argv, stdin=subprocess.PIPE)
scan.stdin.write(repr(get_modules_and_headers()))
scan.stdin.write(repr(get_modules_and_headers(self.bld)))
scan.stdin.close()
retval = scan.wait()
print "Scan finished with exit code", retval
@@ -365,7 +366,7 @@ class python_scan_task(Task.TaskBase):
# signal stop (we generated files into the source dir and WAF
# can't cope with it, so we have to force the user to restart
# WAF)
Build.bld.generator.stop = 1
self.bld.generator.stop = 1
return 0
@@ -384,7 +385,7 @@ def build(bld):
if Options.options.python_scan:
if not env['ENABLE_PYTHON_SCANNING']:
raise Utils.WafError("Cannot re-scan python bindings: (py)gccxml not available")
python_scan_task(bld.path, env)
python_scan_task(bld.path, env, bld)
return
## Get a list of scanned modules; the set of scanned modules
@@ -412,7 +413,7 @@ def build(bld):
'ns3modulegen.log',
]
argv = ['NS3_ENABLED_FEATURES=${FEATURES}', '${PYTHON}', '${SRC[0]}', '${TGT[0]}']
argv.extend(get_modules_and_headers().iterkeys())
argv.extend(get_modules_and_headers(bld).iterkeys())
for module in scanned_modules:
source.append("ns3_module_%s.py" % module)
local = "ns3_module_%s__local.py" % module
@@ -434,12 +435,8 @@ def build(bld):
bindgen.dep_vars = ['FEATURES']
bindgen.before = 'cxx'
bindgen.after = 'gen_everything_h_task'
bindgen.name = "pybindgen-command"
## we build python bindings if either we have the tools to
## generate them or if the pregenerated source file is already
## present in the source dir.
if env['ENABLE_PYTHON_BINDINGS'] \
or os.path.exists(os.path.join(bld.path.abspath(), 'ns3module.cc')):
pymod = bld.new_task_gen('cxx', 'shlib', 'pyext')
pymod.source = ['ns3module.cc', 'ns3module_helpers.cc']
pymod.includes = '.'

View File

@@ -6,7 +6,6 @@ import pproc as subprocess
import errno
# WAF modules
import Build
import Options
import Utils
import Task
@@ -66,9 +65,11 @@ class regression_test_task(Task.TaskBase):
after = 'cc cxx cc_link cxx_link'
color = 'BLUE'
def __init__(self, env, test_name, test_scripts_dir, build_traces_dir, reference_traces):
super(regression_test_task, self).__init__()
def __init__(self, bld, env, test_name, test_scripts_dir, build_traces_dir, reference_traces):
self.bld = bld
self.generator = self
self.env = env
super(regression_test_task, self).__init__(generator=self, env=env)
self.test_name = test_name
self.test_scripts_dir = test_scripts_dir
self.build_traces_dir = build_traces_dir
@@ -77,6 +78,9 @@ class regression_test_task(Task.TaskBase):
def __str__(self):
return 'regression-test (%s)\n' % self.test_name
def runnable_status(self):
return Task.RUN_ME
def run(self):
"""Run a single test"""
sys.path.insert(0, self.test_scripts_dir)
@@ -119,7 +123,7 @@ class regression_test_task(Task.TaskBase):
if Options.options.regression_generate:
# clean the target dir
try:
shutil.rmtree(trace_output_path)
shutil.rmtree(reference_traces_path)
except OSError, ex:
if ex.errno not in [errno.ENOENT]:
raise
@@ -206,13 +210,17 @@ class regression_test_collector_task(Task.TaskBase):
after = 'regression_test_task'
color = 'BLUE'
def __init__(self, test_tasks):
super(regression_test_collector_task, self).__init__()
def __init__(self, bld, test_tasks):
self.bld = bld
super(regression_test_collector_task, self).__init__(generator=self)
self.test_tasks = test_tasks
def __str__(self):
return 'regression-test-collector\n'
def runnable_status(self):
return Task.RUN_ME
def run(self):
failed_tests = [test for test in self.test_tasks if test.result is not None and test.result != 0]
skipped_tests = [test for test in self.test_tasks if test.result is None]
@@ -256,5 +264,7 @@ def run_regression(bld, reference_traces):
build_traces_dir = bld.path.find_or_declare('regression/traces').abspath(bld.env)
tasks = []
for test in tests:
tasks.append(regression_test_task(bld.env, test, test_scripts_dir, build_traces_dir, reference_traces))
regression_test_collector_task(tasks)
task = regression_test_task(bld, bld.env, test, test_scripts_dir, build_traces_dir, reference_traces)
#bld.task_manager.add_task(task)
tasks.append(task)
regression_test_collector_task(bld, tasks)

View File

@@ -9,8 +9,7 @@ import TaskGen
import Task
import Options
import Build
from Utils import md5
import Utils
all_modules = (
'core',
@@ -109,7 +108,7 @@ class ns3header_taskgen(TaskGen.task_gen):
def apply(self):
if self.module is None:
raise Utils.WafError("'module' missing on ns3headers object %s" % self)
ns3_dir_node = Build.bld.path.find_dir("ns3")
ns3_dir_node = self.bld.path.find_dir("ns3")
if self.sub_dir is not None:
ns3_dir_node = ns3_dir_node.find_dir(self.sub_dir)
for filename in self.to_list(self.source):
@@ -176,7 +175,7 @@ class gen_ns3_module_header_task(Task.Task):
return 0
def sig_explicit_deps(self):
m = md5()
m = Utils.md5()
m.update('\n'.join([node.abspath(self.env) for node in self.inputs]))
return m.digest()
@@ -185,7 +184,7 @@ class gen_ns3_module_header_task(Task.Task):
return self.uid
except AttributeError:
"this is not a real hot zone, but we want to avoid surprizes here"
m = md5()
m = Utils.md5()
m.update("ns-3-module-header-%s" % self.module)
self.uid = m.digest()
return self.uid
@@ -199,13 +198,12 @@ class ns3moduleheader_taskgen(TaskGen.task_gen):
COLOR = 'BLUE'
def __init__(self, *args, **kwargs):
super(ns3moduleheader_taskgen, self).__init__(*args, **kwargs)
self.module_name = None
def apply(self):
## get all of the ns3 headers
ns3_dir_node = Build.bld.path.find_dir("ns3")
ns3_dir_node = self.bld.path.find_dir("ns3")
all_headers_inputs = []
for ns3headers in Build.bld.all_task_gen:
for ns3headers in self.bld.all_task_gen:
if isinstance(ns3headers, ns3header_taskgen):
if ns3headers.module != self.module:
continue
@@ -215,8 +213,10 @@ class ns3moduleheader_taskgen(TaskGen.task_gen):
if node is None:
fatal("missing header file %s" % (source,))
all_headers_inputs.append(node)
if not all_headers_inputs:
raise Utils.WscriptError("error finding headers for module %s" % self.module)
assert all_headers_inputs
module_obj = Build.bld.name_to_obj("ns3-" + self.module, self.env)
module_obj = self.bld.name_to_obj("ns3-" + self.module, self.env)
assert module_obj is not None
all_headers_outputs = [ns3_dir_node.find_or_declare("%s-module.h" % self.module)]
task = self.create_task('gen_ns3_module_header', self.env)

BIN
waf vendored

Binary file not shown.

85
wscript
View File

@@ -10,6 +10,7 @@ import os.path
# WAF modules
import pproc as subprocess
import Options
import Logs
import TaskGen
import Constants
@@ -23,6 +24,7 @@ Task.algotype = Constants.JOBCONTROL # so that Task.maxjobs=1 takes effect
import Utils
import Build
import Configure
import Scripting
import cflags # override the build profiles from waf
cflags.profiles = {
@@ -133,7 +135,7 @@ def set_options(opt):
action="store_true", default=False,
dest='valgrind')
opt.add_option('--shell',
help=('Run a shell with an environment suitably modified to run locally built programs'),
help=('DEPRECATED (run ./waf shell)'),
action="store_true", default=False,
dest='shell')
opt.add_option('--enable-sudo',
@@ -161,7 +163,7 @@ def set_options(opt):
opt.sub_options('src/internet-stack')
def check_compilation_flag(conf, flag):
def _check_compilation_flag(conf, flag):
"""
Checks if the C++ compiler accepts a certain compilation flag or flags
flag: can be a string or a list of strings
@@ -186,7 +188,7 @@ def report_optional_feature(conf, name, caption, was_enabled, reason_not_enabled
def configure(conf):
# attach some extra methods
conf.check_compilation_flag = types.MethodType(check_compilation_flag, conf)
conf.check_compilation_flag = types.MethodType(_check_compilation_flag, conf)
conf.report_optional_feature = types.MethodType(report_optional_feature, conf)
conf.env['NS3_OPTIONAL_FEATURES'] = []
@@ -235,7 +237,7 @@ def configure(conf):
env.append_value('CXXDEFINES', 'RUN_SELF_TESTS')
if env['COMPILER_CXX'] == 'g++' and 'CXXFLAGS' not in os.environ:
if check_compilation_flag(conf, '-Wno-error=deprecated-declarations'):
if conf.check_compilation_flag('-Wno-error=deprecated-declarations'):
env.append_value('CXXFLAGS', '-Wno-error=deprecated-declarations')
if Options.options.build_profile == 'debug':
@@ -363,6 +365,7 @@ def add_scratch_programs(bld):
def build(bld):
wutils.bld = bld
if Options.options.no_task_lines:
import Runner
def null_printout(s):
@@ -378,21 +381,6 @@ def build(bld):
variant_env = bld.env_of_name(variant_name)
bld.all_envs['default'] = variant_env
if Options.options.shell:
run_shell()
raise SystemExit(0)
if Options.options.doxygen:
doxygen()
raise SystemExit(0)
check_shell()
if Options.options.doxygen:
doxygen()
raise SystemExit(0)
print "Entering directory `%s'" % os.path.join(bld.path.abspath(), 'build')
# process subfolders from here
bld.add_subdirs('src')
bld.add_subdirs('samples utils examples')
@@ -427,14 +415,14 @@ def build(bld):
changed = True
## remove objects that depend on modules not listed
for obj in list(Build.bld.all_task_gen):
for obj in list(bld.all_task_gen):
if hasattr(obj, 'ns3_module_dependencies'):
for dep in obj.ns3_module_dependencies:
if dep not in modules:
Build.bld.all_task_gen.remove(obj)
bld.all_task_gen.remove(obj)
break
if obj.name in env['NS3_MODULES'] and obj.name not in modules:
Build.bld.all_task_gen.remove(obj)
bld.all_task_gen.remove(obj)
## Create a single ns3 library containing all enabled modules
lib = bld.new_task_gen('cxx', 'shlib')
@@ -468,11 +456,13 @@ def build(bld):
regression.run_regression(bld, regression_traces)
def shutdown():
env = Build.bld.env
if Options.commands['check']:
_run_waf_check()
def shutdown(ctx):
bld = wutils.bld
env = bld.env
#if Options.commands['check']:
# _run_waf_check()
if Options.options.lcov_report:
lcov_report()
@@ -485,9 +475,26 @@ def shutdown():
wutils.run_python_program(Options.options.pyrun)
raise SystemExit(0)
def _run_waf_check():
if Options.options.shell:
raise Utils.WafError("Run `./waf shell' now, instead of `./waf shell'")
if Options.options.doxygen:
doxygen()
raise SystemExit(0)
check_shell(bld)
if Options.options.doxygen:
doxygen()
raise SystemExit(0)
check_context = Build.BuildContext
def check(bld):
"run the NS-3 unit tests"
Scripting.build(bld)
## generate the trace sources list docs
env = Build.bld.env
env = bld.env
proc_env = wutils.get_proc_env()
try:
program_obj = wutils.find_program('print-introspected-doxygen', env)
@@ -514,14 +521,14 @@ def _run_waf_check():
def check_shell():
def check_shell(bld):
if 'NS3_MODULE_PATH' not in os.environ:
return
env = Build.bld.env
env = bld.env
correct_modpath = os.pathsep.join(env['NS3_MODULE_PATH'])
found_modpath = os.environ['NS3_MODULE_PATH']
if found_modpath != correct_modpath:
msg = ("Detected shell (waf --shell) with incorrect configuration\n"
msg = ("Detected shell (./waf shell) with incorrect configuration\n"
"=========================================================\n"
"Possible reasons for this problem:\n"
" 1. You switched to another ns-3 tree from inside this shell\n"
@@ -533,13 +540,19 @@ def check_shell():
raise Utils.WafError(msg)
def run_shell():
shell_context = Build.BuildContext
def shell(ctx):
"""run a shell with an environment suitably modified to run locally built programs"""
#make sure we build first"
Scripting.build(ctx)
if sys.platform == 'win32':
shell = os.environ.get("COMSPEC", "cmd.exe")
else:
shell = os.environ.get("SHELL", "/bin/sh")
env = Build.bld.env
env = wutils.bld.env
wutils.run_argv([shell], {'NS3_MODULE_PATH': os.pathsep.join(env['NS3_MODULE_PATH'])})
def doxygen():
@@ -598,7 +611,7 @@ from Scripting import dist_exts, excludes, BLDDIR
import Utils
import os
def copytree(src, dst, symlinks=False, excludes=(), build_dir=None):
def _copytree(src, dst, symlinks=False, excludes=(), build_dir=None):
"""Recursively copy a directory tree using copy2().
The destination directory must not already exist.
@@ -668,7 +681,7 @@ def copytree(src, dst, symlinks=False, excludes=(), build_dir=None):
def DistDir(appname, version):
"make a distribution directory with all the sources in it"
#"make a distribution directory with all the sources in it"
import shutil
# Our temporary folder where to put our files
@@ -683,7 +696,7 @@ def DistDir(appname, version):
build_dir = getattr(Utils.g_module, BLDDIR, None)
# Copy everything into the new folder
copytree('.', TMPFOLDER, excludes=excludes, build_dir=build_dir)
_copytree('.', TMPFOLDER, excludes=excludes, build_dir=build_dir)
# TODO undocumented hook
dist_hook = getattr(Utils.g_module, 'dist_hook', None)

View File

@@ -16,6 +16,7 @@ import Build
# these are set from the main wscript file
APPNAME=None
VERSION=None
bld=None
#
# The last part of the path name to use to find the regression traces tarball.
@@ -65,7 +66,7 @@ def find_program(program_name, env):
launch_dir = os.path.abspath(Options.cwd_launch)
top_dir = os.path.abspath(Options.launch_dir)
found_programs = []
for obj in Build.bld.all_task_gen:
for obj in bld.all_task_gen:
if not getattr(obj, 'is_ns3_program', False):
continue
@@ -84,7 +85,7 @@ def find_program(program_name, env):
% (program_name, found_programs))
def get_proc_env(os_env=None):
env = Build.bld.env
env = bld.env
if sys.platform == 'linux2':
pathvar = 'LD_LIBRARY_PATH'
elif sys.platform == 'darwin':
@@ -111,7 +112,7 @@ def get_proc_env(os_env=None):
else:
proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']))
pymoddir = Build.bld.path.find_dir('bindings/python').abspath(env)
pymoddir = bld.path.find_dir('bindings/python').abspath(env)
if 'PYTHONPATH' in proc_env:
proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir] + [proc_env['PYTHONPATH']])
else:
@@ -121,7 +122,6 @@ def get_proc_env(os_env=None):
def run_argv(argv, os_env=None, cwd=None):
proc_env = get_proc_env(os_env)
#env = Build.bld.env
retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait()
if retval:
raise Utils.WafError("Command %s exited with code %i" % (argv, retval))
@@ -133,7 +133,7 @@ def get_run_program(program_string, command_template=None):
run_program(program_string, command_template).
"""
#print "get_run_program_argv(program_string=%r, command_template=%r)" % (program_string, command_template)
env = Build.bld.env
env = bld.env
if command_template in (None, '%s'):
argv = shlex.split(program_string)
@@ -187,7 +187,7 @@ def run_program(program_string, command_template=None, cwd=None):
def run_python_program(program_string):
env = Build.bld.env
env = bld.env
execvec = shlex.split(program_string)
if (Options.options.cwd_launch):
cwd = Options.options.cwd_launch