1 import os |
1 import os |
2 import os.path |
2 import os.path |
3 import Params |
|
4 import Object |
|
5 import sys |
3 import sys |
6 import pproc as subprocess |
4 import pproc as subprocess |
7 import shlex |
5 import shlex |
|
6 |
|
7 # WAF modules |
8 import ccroot |
8 import ccroot |
|
9 import Options |
|
10 import Utils |
|
11 import Logs |
|
12 import TaskGen |
|
13 import Build |
|
14 |
9 |
15 |
10 # these are set from the main wscript file |
16 # these are set from the main wscript file |
11 APPNAME=None |
17 APPNAME=None |
12 VERSION=None |
18 VERSION=None |
|
19 |
13 # |
20 # |
14 # The last part of the path name to use to find the regression traces tarball. |
21 # The last part of the path name to use to find the regression traces tarball. |
15 # path will be APPNAME + '-' + VERSION + REGRESSION_SUFFIX + TRACEBALL_SUFFIX, |
22 # path will be APPNAME + '-' + VERSION + REGRESSION_SUFFIX + TRACEBALL_SUFFIX, |
16 # e.g., ns-3-dev-ref-traces.tar.bz2 |
23 # e.g., ns-3-dev-ref-traces.tar.bz2 |
17 # |
24 # |
18 TRACEBALL_SUFFIX = ".tar.bz2" |
25 TRACEBALL_SUFFIX = ".tar.bz2" |
19 |
26 |
20 |
27 |
21 |
28 |
22 def get_command_template(*arguments): |
29 def get_command_template(*arguments): |
23 if Params.g_options.valgrind: |
30 if Options.options.valgrind: |
24 if Params.g_options.command_template: |
31 if Options.options.command_template: |
25 Params.fatal("Options --command-template and --valgrind are conflicting") |
32 raise Utils.WafError("Options --command-template and --valgrind are conflicting") |
26 cmd = "valgrind --leak-check=full %s" |
33 cmd = "valgrind --leak-check=full %s" |
27 else: |
34 else: |
28 cmd = Params.g_options.command_template or '%s' |
35 cmd = Options.options.command_template or '%s' |
29 for arg in arguments: |
36 for arg in arguments: |
30 cmd = cmd + " " + arg |
37 cmd = cmd + " " + arg |
31 return cmd |
38 return cmd |
32 |
39 |
33 |
40 |
34 |
41 |
35 def find_program(program_name, env): |
42 def find_program(program_name, env): |
36 launch_dir = os.path.abspath(Params.g_cwd_launch) |
43 launch_dir = os.path.abspath(Options.cwd_launch) |
37 found_programs = [] |
44 found_programs = [] |
38 for obj in Object.g_allobjs: |
45 for obj in Build.bld.all_task_gen: |
39 if not getattr(obj, 'is_ns3_program', False): |
46 if not getattr(obj, 'is_ns3_program', False): |
40 continue |
47 continue |
41 |
48 |
42 ## filter out programs not in the subtree starting at the launch dir |
49 ## filter out programs not in the subtree starting at the launch dir |
43 if not (obj.path.abspath().startswith(launch_dir) |
50 if not (obj.path.abspath().startswith(launch_dir) |
76 if pathvar in proc_env: |
83 if pathvar in proc_env: |
77 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) |
84 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) |
78 else: |
85 else: |
79 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) |
86 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) |
80 |
87 |
81 pymoddir = Params.g_build.m_curdirnode.find_dir('bindings/python').abspath(env) |
88 pymoddir = Build.bld.path.find_dir('bindings/python').abspath(env) |
82 if 'PYTHONPATH' in proc_env: |
89 if 'PYTHONPATH' in proc_env: |
83 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir] + [proc_env['PYTHONPATH']]) |
90 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir] + [proc_env['PYTHONPATH']]) |
84 else: |
91 else: |
85 proc_env['PYTHONPATH'] = pymoddir |
92 proc_env['PYTHONPATH'] = pymoddir |
86 |
93 |
87 return proc_env |
94 return proc_env |
88 |
95 |
89 def run_argv(argv, os_env=None): |
96 def run_argv(argv, os_env=None): |
90 proc_env = get_proc_env(os_env) |
97 proc_env = get_proc_env(os_env) |
91 #env = Params.g_build.env_of_name('default') |
98 #env = Build.bld.env |
92 retval = subprocess.Popen(argv, env=proc_env).wait() |
99 retval = subprocess.Popen(argv, env=proc_env).wait() |
93 if retval: |
100 if retval: |
94 Params.fatal("Command %s exited with code %i" % (argv, retval)) |
101 raise Utils.WafError("Command %s exited with code %i" % (argv, retval)) |
95 return retval |
102 return retval |
96 |
103 |
97 def get_run_program(program_string, command_template=None): |
104 def get_run_program(program_string, command_template=None): |
98 """ |
105 """ |
99 Return the program name and argv of the process that would be executed by |
106 Return the program name and argv of the process that would be executed by |
100 run_program(program_string, command_template). |
107 run_program(program_string, command_template). |
101 """ |
108 """ |
102 #print "get_run_program_argv(program_string=%r, command_template=%r)" % (program_string, command_template) |
109 #print "get_run_program_argv(program_string=%r, command_template=%r)" % (program_string, command_template) |
103 env = Params.g_build.env_of_name('default') |
110 env = Build.bld.env |
104 |
111 |
105 if command_template in (None, '%s'): |
112 if command_template in (None, '%s'): |
106 argv = shlex.split(program_string) |
113 argv = shlex.split(program_string) |
107 program_name = argv[0] |
114 program_name = argv[0] |
108 |
115 |
109 try: |
116 try: |
110 program_obj = find_program(program_name, env) |
117 program_obj = find_program(program_name, env) |
111 except ValueError, ex: |
118 except ValueError, ex: |
112 Params.fatal(str(ex)) |
119 raise Utils.WafError(str(ex)) |
113 |
120 |
114 try: |
121 program_node = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)) |
115 program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
122 #try: |
116 except AttributeError: |
123 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
117 Params.fatal("%s does not appear to be a program" % (program_name,)) |
124 #except AttributeError: |
|
125 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
118 |
126 |
119 execvec = [program_node.abspath(env)] + argv[1:] |
127 execvec = [program_node.abspath(env)] + argv[1:] |
120 |
128 |
121 else: |
129 else: |
122 |
130 |
123 program_name = program_string |
131 program_name = program_string |
124 try: |
132 try: |
125 program_obj = find_program(program_name, env) |
133 program_obj = find_program(program_name, env) |
126 except ValueError, ex: |
134 except ValueError, ex: |
127 Params.fatal(str(ex)) |
135 raise Utils.WafError(str(ex)) |
128 try: |
136 |
129 program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
137 program_node = program_obj.path.find_or_declare(ccroot.get_target_name(program_obj)) |
130 except AttributeError: |
138 #try: |
131 Params.fatal("%s does not appear to be a program" % (program_name,)) |
139 # program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
|
140 #except AttributeError: |
|
141 # raise Utils.WafError("%s does not appear to be a program" % (program_name,)) |
132 |
142 |
133 execvec = shlex.split(command_template % (program_node.abspath(env),)) |
143 execvec = shlex.split(command_template % (program_node.abspath(env),)) |
134 return program_name, execvec |
144 return program_name, execvec |
135 |
145 |
136 def run_program(program_string, command_template=None): |
146 def run_program(program_string, command_template=None): |
140 full path to the program. Else, program_string is interpreted as |
150 full path to the program. Else, program_string is interpreted as |
141 a shell command with first name being the program name. |
151 a shell command with first name being the program name. |
142 """ |
152 """ |
143 dummy_program_name, execvec = get_run_program(program_string, command_template) |
153 dummy_program_name, execvec = get_run_program(program_string, command_template) |
144 former_cwd = os.getcwd() |
154 former_cwd = os.getcwd() |
145 if (Params.g_options.cwd_launch): |
155 if (Options.options.cwd_launch): |
146 os.chdir(Params.g_options.cwd_launch) |
156 os.chdir(Options.options.cwd_launch) |
147 else: |
157 else: |
148 os.chdir(Params.g_cwd_launch) |
158 os.chdir(Options.cwd_launch) |
149 try: |
159 try: |
150 retval = run_argv(execvec) |
160 retval = run_argv(execvec) |
151 finally: |
161 finally: |
152 os.chdir(former_cwd) |
162 os.chdir(former_cwd) |
153 |
163 |
154 return retval |
164 return retval |
155 |
165 |
156 |
166 |
157 |
167 |
158 def run_python_program(program_string): |
168 def run_python_program(program_string): |
159 env = Params.g_build.env_of_name('default') |
169 env = Build.bld.env |
160 execvec = shlex.split(program_string) |
170 execvec = shlex.split(program_string) |
161 |
171 |
162 former_cwd = os.getcwd() |
172 former_cwd = os.getcwd() |
163 if (Params.g_options.cwd_launch): |
173 if (Options.options.cwd_launch): |
164 os.chdir(Params.g_options.cwd_launch) |
174 os.chdir(Options.options.cwd_launch) |
165 else: |
175 else: |
166 os.chdir(Params.g_cwd_launch) |
176 os.chdir(Options.cwd_launch) |
167 try: |
177 try: |
168 retval = run_argv([env['PYTHON']] + execvec) |
178 retval = run_argv([env['PYTHON']] + execvec) |
169 finally: |
179 finally: |
170 os.chdir(former_cwd) |
180 os.chdir(former_cwd) |
171 |
181 |