|
1 import os |
|
2 import os.path |
|
3 import Params |
|
4 import Object |
|
5 import sys |
|
6 import pproc as subprocess |
|
7 import shlex |
|
8 import ccroot |
|
9 |
|
10 # these are set from the main wscript file |
|
11 APPNAME=None |
|
12 VERSION=None |
|
13 # |
|
14 # 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, |
|
16 # e.g., ns-3-dev-ref-traces.tar.bz2 |
|
17 # |
|
18 TRACEBALL_SUFFIX = ".tar.bz2" |
|
19 |
|
20 |
|
21 |
|
22 def get_command_template(*arguments): |
|
23 if Params.g_options.valgrind: |
|
24 if Params.g_options.command_template: |
|
25 Params.fatal("Options --command-template and --valgrind are conflicting") |
|
26 cmd = "valgrind --leak-check=full %s" |
|
27 else: |
|
28 cmd = Params.g_options.command_template or '%s' |
|
29 for arg in arguments: |
|
30 cmd = cmd + " " + arg |
|
31 return cmd |
|
32 |
|
33 |
|
34 |
|
35 def find_program(program_name, env): |
|
36 launch_dir = os.path.abspath(Params.g_cwd_launch) |
|
37 found_programs = [] |
|
38 for obj in Object.g_allobjs: |
|
39 if not getattr(obj, 'is_ns3_program', False): |
|
40 continue |
|
41 |
|
42 ## filter out programs not in the subtree starting at the launch dir |
|
43 if not (obj.path.abspath().startswith(launch_dir) |
|
44 or obj.path.abspath(env).startswith(launch_dir)): |
|
45 continue |
|
46 |
|
47 found_programs.append(obj.target) |
|
48 if obj.target == program_name: |
|
49 return obj |
|
50 raise ValueError("program '%s' not found; available programs are: %r" |
|
51 % (program_name, found_programs)) |
|
52 |
|
53 def get_proc_env(os_env=None): |
|
54 env = Params.g_build.env_of_name('default') |
|
55 if sys.platform == 'linux2': |
|
56 pathvar = 'LD_LIBRARY_PATH' |
|
57 elif sys.platform == 'darwin': |
|
58 pathvar = 'DYLD_LIBRARY_PATH' |
|
59 elif sys.platform == 'win32': |
|
60 pathvar = 'PATH' |
|
61 elif sys.platform == 'cygwin': |
|
62 pathvar = 'PATH' |
|
63 elif sys.platform.startswith('freebsd'): |
|
64 pathvar = 'LD_LIBRARY_PATH' |
|
65 else: |
|
66 Params.warning(("Don't know how to configure " |
|
67 "dynamic library path for the platform %r;" |
|
68 " assuming it's LD_LIBRARY_PATH.") % (sys.platform,)) |
|
69 pathvar = 'LD_LIBRARY_PATH' |
|
70 |
|
71 proc_env = dict(os.environ) |
|
72 if os_env is not None: |
|
73 proc_env.update(os_env) |
|
74 |
|
75 if pathvar is not None: |
|
76 if pathvar in proc_env: |
|
77 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH']) + [proc_env[pathvar]]) |
|
78 else: |
|
79 proc_env[pathvar] = os.pathsep.join(list(env['NS3_MODULE_PATH'])) |
|
80 |
|
81 pymoddir = Params.g_build.m_curdirnode.find_dir('bindings/python').abspath(env) |
|
82 if 'PYTHONPATH' in proc_env: |
|
83 proc_env['PYTHONPATH'] = os.pathsep.join([pymoddir] + [proc_env['PYTHONPATH']]) |
|
84 else: |
|
85 proc_env['PYTHONPATH'] = pymoddir |
|
86 |
|
87 return proc_env |
|
88 |
|
89 def run_argv(argv, os_env=None): |
|
90 proc_env = get_proc_env(os_env) |
|
91 #env = Params.g_build.env_of_name('default') |
|
92 retval = subprocess.Popen(argv, env=proc_env).wait() |
|
93 if retval: |
|
94 Params.fatal("Command %s exited with code %i" % (argv, retval)) |
|
95 return retval |
|
96 |
|
97 def run_program(program_string, command_template=None): |
|
98 """ |
|
99 if command_template is not None, then program_string == program |
|
100 name and argv is given by command_template with %s replaced by the |
|
101 full path to the program. Else, program_string is interpreted as |
|
102 a shell command with first name being the program name. |
|
103 """ |
|
104 env = Params.g_build.env_of_name('default') |
|
105 |
|
106 if command_template in (None, '%s'): |
|
107 argv = shlex.split(program_string) |
|
108 program_name = argv[0] |
|
109 |
|
110 try: |
|
111 program_obj = find_program(program_name, env) |
|
112 except ValueError, ex: |
|
113 Params.fatal(str(ex)) |
|
114 |
|
115 try: |
|
116 program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
|
117 except AttributeError: |
|
118 Params.fatal("%s does not appear to be a program" % (program_name,)) |
|
119 |
|
120 execvec = [program_node.abspath(env)] + argv[1:] |
|
121 |
|
122 else: |
|
123 |
|
124 program_name = program_string |
|
125 try: |
|
126 program_obj = find_program(program_name, env) |
|
127 except ValueError, ex: |
|
128 Params.fatal(str(ex)) |
|
129 try: |
|
130 program_node = program_obj.path.find_build(ccroot.get_target_name(program_obj)) |
|
131 except AttributeError: |
|
132 Params.fatal("%s does not appear to be a program" % (program_name,)) |
|
133 |
|
134 execvec = shlex.split(command_template % (program_node.abspath(env),)) |
|
135 |
|
136 former_cwd = os.getcwd() |
|
137 if (Params.g_options.cwd_launch): |
|
138 os.chdir(Params.g_options.cwd_launch) |
|
139 else: |
|
140 os.chdir(Params.g_cwd_launch) |
|
141 try: |
|
142 retval = run_argv(execvec) |
|
143 finally: |
|
144 os.chdir(former_cwd) |
|
145 |
|
146 return retval |
|
147 |
|
148 |
|
149 |
|
150 def run_python_program(program_string): |
|
151 env = Params.g_build.env_of_name('default') |
|
152 execvec = shlex.split(program_string) |
|
153 |
|
154 former_cwd = os.getcwd() |
|
155 if (Params.g_options.cwd_launch): |
|
156 os.chdir(Params.g_options.cwd_launch) |
|
157 else: |
|
158 os.chdir(Params.g_cwd_launch) |
|
159 try: |
|
160 retval = run_argv([env['PYTHON']] + execvec) |
|
161 finally: |
|
162 os.chdir(former_cwd) |
|
163 |
|
164 return retval |
|
165 |
|
166 |