46 rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:] |
45 rel_list = [os.path.pardir] * (len(start_list)-i) + path_list[i:] |
47 if not rel_list: |
46 if not rel_list: |
48 return os.path.curdir |
47 return os.path.curdir |
49 return os.path.join(*rel_list) |
48 return os.path.join(*rel_list) |
50 |
49 |
51 |
50 from waflib import Context |
52 def find_program(program_name, env): |
51 def find_program(program_name, env): |
53 launch_dir = os.path.abspath(Options.cwd_launch) |
52 launch_dir = os.path.abspath(Context.launch_dir) |
54 top_dir = os.path.abspath(Options.launch_dir) |
53 #top_dir = os.path.abspath(Options.cwd_launch) |
55 found_programs = [] |
54 found_programs = [] |
56 for obj in bld.all_task_gen: |
55 for obj in bld.all_task_gen: |
57 if not getattr(obj, 'is_ns3_program', False): |
56 if not getattr(obj, 'is_ns3_program', False): |
58 continue |
57 continue |
59 |
58 |
61 if not (obj.path.abspath().startswith(launch_dir) |
60 if not (obj.path.abspath().startswith(launch_dir) |
62 or obj.path.abspath(env).startswith(launch_dir)): |
61 or obj.path.abspath(env).startswith(launch_dir)): |
63 continue |
62 continue |
64 |
63 |
65 name1 = obj.target |
64 name1 = obj.target |
66 name2 = os.path.join(relpath(obj.path.abspath(), top_dir), obj.target) |
65 name2 = os.path.join(relpath(obj.path.abspath(), launch_dir), obj.target) |
67 names = [name1, name2] |
66 names = [name1, name2] |
68 found_programs.extend(names) |
67 found_programs.extend(names) |
69 if program_name in names: |
68 if program_name in names: |
70 return obj |
69 return obj |
71 raise ValueError("program '%s' not found; available programs are: %r" |
70 raise ValueError("program '%s' not found; available programs are: %r" |
97 if pathvar in proc_env: |
96 if pathvar in proc_env: |
98 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) |
97 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) |
99 else: |
98 else: |
100 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) |
99 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) |
101 |
100 |
102 pymoddir = bld.path.find_dir('bindings/python').abspath(env) |
101 pymoddir = bld.path.find_dir('bindings/python').get_bld().abspath() |
103 pyvizdir = bld.path.find_dir('src/visualizer').abspath() |
102 pyvizdir = bld.path.find_dir('src/visualizer').abspath() |
104 if 'PYTHONPATH' in proc_env: |
103 if 'PYTHONPATH' in proc_env: |
105 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir] + [proc_env['PYTHONPATH']]) |
104 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir] + [proc_env['PYTHONPATH']]) |
106 else: |
105 else: |
107 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir]) |
106 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir, pyvizdir]) |
115 |
114 |
116 def run_argv(argv, env, os_env=None, cwd=None, force_no_valgrind=False): |
115 def run_argv(argv, env, os_env=None, cwd=None, force_no_valgrind=False): |
117 proc_env = get_proc_env(os_env) |
116 proc_env = get_proc_env(os_env) |
118 if Options.options.valgrind and not force_no_valgrind: |
117 if Options.options.valgrind and not force_no_valgrind: |
119 if Options.options.command_template: |
118 if Options.options.command_template: |
120 raise Utils.WafError("Options --command-template and --valgrind are conflicting") |
119 raise WafError("Options --command-template and --valgrind are conflicting") |
121 if not env['VALGRIND']: |
120 if not env['VALGRIND']: |
122 raise Utils.WafError("valgrind is not installed") |
121 raise WafError("valgrind is not installed") |
123 argv = [env['VALGRIND'], "--leak-check=full", "--show-reachable=yes", "--error-exitcode=1"] + argv |
122 argv = [env['VALGRIND'], "--leak-check=full", "--show-reachable=yes", "--error-exitcode=1"] + argv |
124 proc = subprocess.Popen(argv, env=proc_env, cwd=cwd, stderr=subprocess.PIPE) |
123 proc = subprocess.Popen(argv, env=proc_env, cwd=cwd, stderr=subprocess.PIPE) |
125 error = False |
124 error = False |
126 for line in proc.stderr: |
125 for line in proc.stderr: |
127 sys.stderr.write(line) |
126 sys.stderr.write(line) |
137 retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() |
136 retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() |
138 else: |
137 else: |
139 try: |
138 try: |
140 retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() |
139 retval = subprocess.Popen(argv, env=proc_env, cwd=cwd).wait() |
141 except WindowsError, ex: |
140 except WindowsError, ex: |
142 raise Utils.WafError("Command %s raised exception %s" % (argv, ex)) |
141 raise WafError("Command %s raised exception %s" % (argv, ex)) |
143 if retval: |
142 if retval: |
144 signame = None |
143 signame = None |
145 if retval < 0: # signal? |
144 if retval < 0: # signal? |
146 import signal |
145 import signal |
147 for name, val in vars(signal).iteritems(): |
146 for name, val in vars(signal).iteritems(): |
148 if len(name) > 3 and name[:3] == 'SIG' and name[3] != '_': |
147 if len(name) > 3 and name[:3] == 'SIG' and name[3] != '_': |
149 if val == -retval: |
148 if val == -retval: |
150 signame = name |
149 signame = name |
151 break |
150 break |
152 if signame: |
151 if signame: |
153 raise Utils.WafError("Command %s terminated with signal %s." |
152 raise WafError("Command %s terminated with signal %s." |
154 " Run it under a debugger to get more information " |
153 " Run it under a debugger to get more information " |
155 "(./waf --run <program> --command-template=\"gdb --args %%s <args>\")." % (argv, signame)) |
154 "(./waf --run <program> --command-template=\"gdb --args %%s <args>\")." % (argv, signame)) |
156 else: |
155 else: |
157 raise Utils.WafError("Command %s exited with code %i" % (argv, retval)) |
156 raise WafError("Command %s exited with code %i" % (argv, retval)) |
158 return retval |
157 return retval |
159 |
158 |
160 def get_run_program(program_string, command_template=None): |
159 def get_run_program(program_string, command_template=None): |
161 """ |
160 """ |
162 Return the program name and argv of the process that would be executed by |
161 Return the program name and argv of the process that would be executed by |
171 program_name = argv[0] |
170 program_name = argv[0] |
172 |
171 |
173 try: |
172 try: |
174 program_obj = find_program(program_name, env) |
173 program_obj = find_program(program_name, env) |
175 except ValueError, ex: |
174 except ValueError, ex: |
176 raise Utils.WafError(str(ex)) |
175 raise WafError(str(ex)) |
177 |
176 |
178 program_node = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)) |
177 program_node = program_obj.path.find_or_declare(program_obj.target) |
179 #try: |
178 #try: |
180 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
179 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
181 #except AttributeError: |
180 #except AttributeError: |
182 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
181 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
183 |
182 |
184 execvec = [program_node.abspath(env)] + argv[1:] |
183 execvec = [program_node.abspath()] + argv[1:] |
185 |
184 |
186 else: |
185 else: |
187 |
186 |
188 program_name = program_string |
187 program_name = program_string |
189 try: |
188 try: |
190 program_obj = find_program(program_name, env) |
189 program_obj = find_program(program_name, env) |
191 except ValueError, ex: |
190 except ValueError, ex: |
192 raise Utils.WafError(str(ex)) |
191 raise WafError(str(ex)) |
193 |
192 |
194 program_node = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)) |
193 program_node = program_obj.path.find_or_declare(program_obj.target) |
195 #try: |
194 #try: |
196 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
195 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
197 #except AttributeError: |
196 #except AttributeError: |
198 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
197 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
199 |
198 |