diff --git a/wscript b/wscript index 2ce333f5d..e34a46242 100644 --- a/wscript +++ b/wscript @@ -306,15 +306,16 @@ def add_scratch_programs(bld): 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 @@ def build(bld): # 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) diff --git a/wutils.py b/wutils.py index 1b0413692..698900305 100644 --- a/wutils.py +++ b/wutils.py @@ -38,9 +38,30 @@ def get_command_template(*arguments): 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 @@ def find_program(program_name, env): 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))