wutils.py
changeset 7487 82cd20da9650
parent 6953 aa8081396a16
child 7510 aabd5141cd16
equal deleted inserted replaced
7477:4764c1472bd6 7487:82cd20da9650
     1 import os
     1 import os
     2 import os.path
     2 import os.path
     3 import sys
     3 import sys
     4 import pproc as subprocess
     4 import subprocess
     5 import shlex
     5 import shlex
     6 
     6 
     7 # WAF modules
     7 # WAF modules
     8 import ccroot
       
     9 import Options
     8 import Options
    10 import Utils
     9 import Utils
    11 import Logs
    10 import Logs
    12 import TaskGen
    11 import TaskGen
    13 import Build
    12 import Build
    14 import re
    13 import re
    15 
    14 from waflib.Errors import WafError
    16 
    15 
    17 # these are set from the main wscript file
    16 # these are set from the main wscript file
    18 APPNAME=None
    17 APPNAME=None
    19 VERSION=None
    18 VERSION=None
    20 bld=None
    19 bld=None
    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