waf --run now takes either full path to a program or just the (flat) program name, for all C++ programs
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Sun, 18 Jan 2009 19:59:46 +0000
changeset 4108 92bae583f934
parent 4107 c0e44280dc27
child 4109 1a251c8ad317
waf --run now takes either full path to a program or just the (flat) program name, for all C++ programs
wscript
wutils.py
--- 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))