WAF: remove the rpath options, and add --run and --shell as replacements; additionally, the new options "should" work on Mac OS X, as well as linux2 and win32.

Gustavo J. A. M. Carneiro 2007-05-23 19:20:54 +01:00
parent a28dd7dbc3
commit 8cdcda24e1
3 changed files with 99 additions and 26 deletions

View File

@ -35,6 +35,17 @@ Other waf usages include:
Run code coverage analysis (assuming the project was configured Run code coverage analysis (assuming the project was configured
with --enable-gcov) with --enable-gcov)
4. ./waf --run "program [args]"
Run a ns3 program, given its target name, with the given
arguments. This takes care of automatically modifying the the
path for finding the ns3 dynamic libraries in the environment
before running the program. Note: the "program [args]" string is
parsed using POSIX shell rules.
5. ./waf --shell
Starts a nested system shell with modified environment to run ns3 programs.
=== Extending ns-3 === === Extending ns-3 ===
To add new modules: To add new modules:

View File

@ -17,35 +17,17 @@ all_modules = [
def set_options(opt): def set_options(opt):
opt.sub_options('simulator') opt.sub_options('simulator')
rpath_default = (sys.platform == 'linux2')
opt.add_option('--enable-rpath',
help=("Link programs with rpath"),
action="store_true", dest='enable_rpath', default=rpath_default)
opt.add_option('--disable-rpath',
help=("Don't link programs with rpath"),
action="store_false", dest='enable_rpath', default=rpath_default)
def configure(conf): def configure(conf):
conf.sub_config('core') conf.sub_config('core')
conf.sub_config('simulator') conf.sub_config('simulator')
conf.env['ENABLE_RPATH'] = Params.g_options.enable_rpath
def build(bld): def build(bld):
## Add a global RPATH pointing to each module, so that programs can find the libs
## Note: this is slightly evil; we get away because our programs
## and libs are not supposed to be installed system wide.
env = bld.env_of_name('default') env = bld.env_of_name('default')
for module in all_modules: for module in all_modules:
node = bld.m_curdirnode.find_dir(module) node = bld.m_curdirnode.find_dir(module)
if sys.platform == 'win32': node_path = node.abspath(env)
os.environ["PATH"] = ';'.join([os.environ["PATH"], node.abspath(env)]) env.append_value('NS3_MODULE_PATH', node_path)
else:
if env['ENABLE_RPATH']:
env.append_value('RPATH', '-Wl,-rpath=%s' % (node.abspath(env),))
bld.add_subdirs(all_modules) bld.add_subdirs(all_modules)

92
wscript
View File

@ -1,6 +1,7 @@
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*- ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
import os import os
import sys import sys
import shlex
import Params import Params
import Object import Object
@ -90,6 +91,15 @@ def set_options(opt):
action="store_true", default=False, action="store_true", default=False,
dest='doxygen') dest='doxygen')
opt.add_option('--run',
help=('Run a locally built program'),
type="string", default='', dest='run')
opt.add_option('--shell',
help=('Run a shell with an environment suitably modified to run locally built programs'),
action="store_true", default=False,
dest='shell')
# options provided in a script in a subdirectory named "src" # options provided in a script in a subdirectory named "src"
opt.sub_options('src') opt.sub_options('src')
@ -138,20 +148,90 @@ def build(bld):
def shutdown(): def shutdown():
import UnitTest #import UnitTest
ut = UnitTest.unit_test() #ut = UnitTest.unit_test()
ut.change_to_testfile_dir = True #ut.change_to_testfile_dir = True
ut.want_to_see_test_output = True #ut.want_to_see_test_output = True
ut.want_to_see_test_error = True #ut.want_to_see_test_error = True
ut.run() #ut.run()
#ut.print_results() #ut.print_results()
if Params.g_commands['check']:
run_program('run-tests')
if Params.g_options.lcov_report: if Params.g_options.lcov_report:
lcov_report() lcov_report()
if Params.g_options.doxygen: if Params.g_options.doxygen:
doxygen() doxygen()
if Params.g_options.run:
run_program(Params.g_options.run)
elif Params.g_options.shell:
run_shell()
def _find_program(program_name):
for obj in Object.g_allobjs:
if obj.target == program_name:
return obj
raise ValueError("progam '%s' not found" % (program_name,))
def _run_argv(argv):
env = Params.g_build.env_of_name('default')
if sys.platform == 'linux2':
pathvar = 'LD_LIBRARY_PATH'
pathsep = ':'
elif sys.platform == 'darwin':
pathvar = 'DYLD_LIBRARY_PATH'
pathsep = ':'
elif sys.platform == 'win32':
pathvar = 'PATH'
pathsep = ';'
else:
Params.warning(("Don't know how to configure "
"dynamic library path for the platform '%s'") % (sys.platform,))
pathvar = None
pathsep = None
os_env = dict(os.environ)
if pathvar is not None:
if pathvar in os_env:
os_env[pathvar] = pathsep.join([os_env[pathvar]] + list(env['NS3_MODULE_PATH']))
else:
os_env[pathvar] = pathsep.join(list(env['NS3_MODULE_PATH']))
retval = subprocess.Popen(argv, env=os_env).wait()
if retval:
raise SystemExit(retval)
def run_program(program_string):
env = Params.g_build.env_of_name('default')
argv = shlex.split(program_string)
program_name = argv[0]
try:
program_obj = _find_program(program_name)
except ValueError:
Params.fatal("progam '%s' not found" % (program_name,))
try:
program_node, = program_obj.m_linktask.m_outputs
except AttributeError:
Params.fatal("%s does not appear to be a program" % (program_name,))
execvec = [program_node.abspath(env)] + argv[1:]
return _run_argv(execvec)
def run_shell():
if sys.platform == 'win32':
shell = os.environ.get("COMSPEC", "cmd.exe")
else:
shell = os.environ.get("SHELL", "/bin/sh")
_run_argv([shell])
def doxygen(): def doxygen():
doxygen_config = os.path.join('doc', 'doxygen.conf') doxygen_config = os.path.join('doc', 'doxygen.conf')