wutils.py
changeset 3866 9e946fee902c
child 3933 3c149230e98a
equal deleted inserted replaced
3865:6647bcafbf3f 3866:9e946fee902c
       
     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