diff --git a/regression.py b/regression.py index d6ae741a6..653731cc5 100644 --- a/regression.py +++ b/regression.py @@ -159,13 +159,13 @@ class regression_test_task(Task.TaskBase): script = os.path.abspath(os.path.join('..', *os.path.split(program))) argv = [self.env['PYTHON'], script] + arguments try: - wutils.run_argv(argv, cwd=trace_output_path) + wutils.run_argv(argv, self.env, cwd=trace_output_path) except Utils.WafError, ex: print >> sys.stderr, ex return 1 else: try: - wutils.run_program(program, + wutils.run_program(program, self.env, command_template=wutils.get_command_template(self.env, arguments), cwd=trace_output_path) except Utils.WafError, ex: @@ -191,13 +191,13 @@ class regression_test_task(Task.TaskBase): script = os.path.abspath(os.path.join('..', *os.path.split(program))) argv = [self.env['PYTHON'], script] + arguments try: - retval = wutils.run_argv(argv, cwd=trace_output_path) + retval = wutils.run_argv(argv, self.env, cwd=trace_output_path) except Utils.WafError, ex: print >> sys.stderr, ex return 1 else: try: - retval = wutils.run_program(program, + retval = wutils.run_program(program, self.env, command_template=wutils.get_command_template(self.env, arguments), cwd=trace_output_path) except Utils.WafError, ex: diff --git a/wscript b/wscript index ea8d1c49d..17b4b38e7 100644 --- a/wscript +++ b/wscript @@ -470,11 +470,11 @@ def shutdown(ctx): lcov_report() if Options.options.run: - wutils.run_program(Options.options.run, wutils.get_command_template(env)) + wutils.run_program(Options.options.run, env, wutils.get_command_template(env)) raise SystemExit(0) if Options.options.pyrun: - wutils.run_python_program(Options.options.pyrun) + wutils.run_python_program(Options.options.pyrun, env) raise SystemExit(0) if Options.options.shell: @@ -516,7 +516,7 @@ def check(bld): if env['ENABLE_PYTHON_BINDINGS']: print "-- Running NS-3 Python bindings unit tests..." - wutils.run_argv([env['PYTHON'], os.path.join("utils", "python-unit-tests.py")], proc_env) + wutils.run_argv([env['PYTHON'], self.env, os.path.join("utils", "python-unit-tests.py")], proc_env) else: print "-- Skipping NS-3 Python bindings unit tests: Python bindings not enabled." @@ -555,7 +555,7 @@ def shell(ctx): shell = os.environ.get("SHELL", "/bin/sh") env = wutils.bld.env - wutils.run_argv([shell], {'NS3_MODULE_PATH': os.pathsep.join(env['NS3_MODULE_PATH'])}) + wutils.run_argv([shell], env, {'NS3_MODULE_PATH': os.pathsep.join(env['NS3_MODULE_PATH'])}) def doxygen(): if not os.path.exists('doc/introspected-doxygen.h'): diff --git a/wutils.py b/wutils.py index 38a6307b1..d82fe305d 100644 --- a/wutils.py +++ b/wutils.py @@ -11,6 +11,7 @@ import Utils import Logs import TaskGen import Build +import re # these are set from the main wscript file @@ -28,14 +29,7 @@ TRACEBALL_SUFFIX = ".tar.bz2" def get_command_template(env, arguments=()): - if Options.options.valgrind: - if Options.options.command_template: - raise Utils.WafError("Options --command-template and --valgrind are conflicting") - if not env['VALGRIND']: - raise Utils.WafError("valgrind is not installed") - cmd = env['VALGRIND'] + " --leak-check=full --error-exitcode=1 %s" - else: - cmd = Options.options.command_template or '%s' + cmd = Options.options.command_template or '%s' for arg in arguments: cmd = cmd + " " + arg return cmd @@ -120,9 +114,29 @@ def get_proc_env(os_env=None): return proc_env -def run_argv(argv, os_env=None, cwd=None): +def run_argv(argv, env, os_env=None, cwd=None): proc_env = get_proc_env(os_env) - retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() + if Options.options.valgrind: + if Options.options.command_template: + raise Utils.WafError("Options --command-template and --valgrind are conflicting") + if not env['VALGRIND']: + raise Utils.WafError("valgrind is not installed") + argv = [env['VALGRIND'], "--leak-check=full", "--error-exitcode=1"] + argv + proc = subprocess.Popen(argv, env=proc_env, cwd=cwd, stderr=subprocess.PIPE) + reg = re.compile ('definitely lost: ([^ ]+) bytes') + error = False + for line in proc.stderr: + sys.stderr.write(line) + result = reg.search(line) + if result is None: + continue + if result.group(1) != "0": + error = True + retval = proc.wait() + if retval == 0 and error: + retval = 1 + else: + retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() if retval: raise Utils.WafError("Command %s exited with code %i" % (argv, retval)) return retval @@ -169,7 +183,7 @@ def get_run_program(program_string, command_template=None): execvec = shlex.split(command_template % (program_node.abspath(env),)) return program_name, execvec -def run_program(program_string, command_template=None, cwd=None): +def run_program(program_string, env, command_template=None, cwd=None): """ if command_template is not None, then program_string == program name and argv is given by command_template with %s replaced by the @@ -182,17 +196,17 @@ def run_program(program_string, command_template=None, cwd=None): cwd = Options.options.cwd_launch else: cwd = Options.cwd_launch - return run_argv(execvec, cwd=cwd) + return run_argv(execvec, env, cwd=cwd) -def run_python_program(program_string): +def run_python_program(program_string, env): env = bld.env execvec = shlex.split(program_string) if (Options.options.cwd_launch): cwd = Options.options.cwd_launch else: cwd = Options.cwd_launch - return run_argv([env['PYTHON']] + execvec, cwd=cwd) + return run_argv([env['PYTHON']] + execvec, env, cwd=cwd)