waf --run now takes either full path to a program or just the (flat) program name, for all C++ programs
--- a/wscript Sun Jan 18 12:14:32 2009 +0100
+++ b/wscript Sun Jan 18 19:59:46 2009 +0000
@@ -306,15 +306,16 @@
continue
if os.path.isdir(os.path.join("scratch", filename)):
obj = bld.create_ns3_program(filename, all_modules)
- obj.path = obj.path.find_dir('scratch')
- obj.find_sources_in_dirs(filename)
- obj.target = os.path.join(filename, filename)
+ obj.path = obj.path.find_dir('scratch').find_dir(filename)
+ obj.find_sources_in_dirs('.')
+ obj.target = filename
obj.name = obj.target
elif filename.endswith(".cc"):
name = filename[:-len(".cc")]
obj = bld.create_ns3_program(name, all_modules)
- obj.source = "scratch/%s" % filename
- obj.target = "scratch/%s" % name
+ obj.path = obj.path.find_dir('scratch')
+ obj.source = filename
+ obj.target = name
obj.name = obj.target
@@ -414,7 +415,7 @@
# nothing more; this greatly speeds up compilation when all you
# want to do is run a test program.
if not Options.options.compile_targets:
- Options.options.compile_targets = program_name
+ Options.options.compile_targets = os.path.basename(program_name)
--- a/wutils.py Sun Jan 18 12:14:32 2009 +0100
+++ b/wutils.py Sun Jan 18 19:59:46 2009 +0000
@@ -38,9 +38,30 @@
return cmd
+if hasattr(os.path, "relpath"):
+ relpath = os.path.relpath # since Python 2.6
+else:
+ def relpath(path, start=os.path.curdir):
+ """Return a relative version of a path"""
+
+ if not path:
+ raise ValueError("no path specified")
+
+ start_list = os.path.abspath(start).split(os.path.sep)
+ path_list = os.path.abspath(path).split(os.path.sep)
+
+ # Work out how much of the filepath is shared by start and path.
+ i = len(os.path.commonprefix([start_list, path_list]))
+
+ rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:]
+ if not rel_list:
+ return os.path.curdir
+ return os.path.join(*rel_list)
+
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:
if not getattr(obj, 'is_ns3_program', False):
@@ -51,8 +72,11 @@
or obj.path.abspath(env).startswith(launch_dir)):
continue
- found_programs.append(obj.target)
- if obj.target == program_name:
+ name1 = obj.target
+ name2 = os.path.join(relpath(obj.path.abspath(), top_dir), obj.target)
+ names = [name1, name2]
+ found_programs.extend(names)
+ if program_name in names:
return obj
raise ValueError("program '%s' not found; available programs are: %r"
% (program_name, found_programs))