Esempio n. 1
0
def spawn(cmd, search_path=1, verbose=0, dry_run=0, env=None):
    """Run another program, specified as a command list 'cmd', in a new process.

    'cmd' is just the argument list for the new process, ie.
    cmd[0] is the program to run and cmd[1:] are the rest of its arguments.
    There is no way to run a program with a name different from that of its
    executable.

    If 'search_path' is true (the default), the system's executable
    search path will be used to find the program; otherwise, cmd[0]
    must be the exact path to the executable.  If 'dry_run' is true,
    the command will not actually be run.

    Raise DistutilsExecError if running the program fails in any way; just
    return on success.
    """
    # cmd is documented as a list, but just in case some code passes a tuple
    # in, protect our %-formatting code against horrible death
    cmd = list(cmd)

    log.info(subprocess.list2cmdline(cmd))
    if dry_run:
        return

    if search_path:
        executable = find_executable(cmd[0])
        if executable is not None:
            cmd[0] = executable

    env = env if env is not None else dict(os.environ)

    if sys.platform == 'darwin':
        from distutils.util import MACOSX_VERSION_VAR, get_macosx_target_ver

        macosx_target_ver = get_macosx_target_ver()
        if macosx_target_ver:
            env[MACOSX_VERSION_VAR] = macosx_target_ver

    try:
        proc = subprocess.Popen(cmd, env=env)
        proc.wait()
        exitcode = proc.returncode
    except OSError as exc:
        if not DEBUG:
            cmd = cmd[0]
        raise DistutilsExecError("command %r failed: %s" %
                                 (cmd, exc.args[-1])) from exc

    if exitcode:
        if not DEBUG:
            cmd = cmd[0]
        raise DistutilsExecError("command %r failed with exit code %s" %
                                 (cmd, exitcode))
Esempio n. 2
0
 def runtime_library_dir_option(self, dir):
     # XXX Hackish, at the very least.  See Python bug #445902:
     # http://sourceforge.net/tracker/index.php
     #   ?func=detail&aid=445902&group_id=5470&atid=105470
     # Linkers on different platforms need different options to
     # specify that directories need to be added to the list of
     # directories searched for dependencies when a dynamic library
     # is sought.  GCC on GNU systems (Linux, FreeBSD, ...) has to
     # be told to pass the -R option through to the linker, whereas
     # other compilers and gcc on other systems just know this.
     # Other compilers may need something slightly different.  At
     # this time, there's no way to determine this information from
     # the configuration data stored in the Python installation, so
     # we use this hack.
     compiler = os.path.basename(
         shlex.split(sysconfig.get_config_var("CC"))[0])
     if sys.platform[:6] == "darwin":
         from distutils.util import get_macosx_target_ver, split_version
         macosx_target_ver = get_macosx_target_ver()
         if macosx_target_ver and split_version(macosx_target_ver) >= [
                 10, 5
         ]:
             return "-Wl,-rpath," + dir
         else:  # no support for -rpath on earlier macOS versions
             return "-L" + dir
     elif sys.platform[:7] == "freebsd":
         return "-Wl,-rpath=" + dir
     elif sys.platform[:5] == "hp-ux":
         if self._is_gcc(compiler):
             return ["-Wl,+s", "-L" + dir]
         return ["+s", "-L" + dir]
     else:
         if self._is_gcc(compiler):
             # gcc on non-GNU systems does not need -Wl, but can
             # use it anyway.  Since distutils has always passed in
             # -Wl whenever gcc was used in the past it is probably
             # safest to keep doing so.
             if sysconfig.get_config_var("GNULD") == "yes":
                 # GNU ld needs an extra option to get a RUNPATH
                 # instead of just an RPATH.
                 return "-Wl,--enable-new-dtags,-R" + dir
             else:
                 return "-Wl,-R" + dir
         else:
             # No idea how --enable-new-dtags would be passed on to
             # ld if this system was using GNU ld.  Don't know if a
             # system like this even exists.
             return "-R" + dir
Esempio n. 3
0
    def runtime_library_dir_option(self, dir):
        # XXX Hackish, at the very least.  See Python bug #445902:
        # http://sourceforge.net/tracker/index.php
        #   ?func=detail&aid=445902&group_id=5470&atid=105470
        # Linkers on different platforms need different options to
        # specify that directories need to be added to the list of
        # directories searched for dependencies when a dynamic library
        # is sought.  GCC on GNU systems (Linux, FreeBSD, ...) has to
        # be told to pass the -R option through to the linker, whereas
        # other compilers and gcc on other systems just know this.
        # Other compilers may need something slightly different.  At
        # this time, there's no way to determine this information from
        # the configuration data stored in the Python installation, so
        # we use this hack.
        if sys.platform[:6] == "darwin":
            from distutils.util import get_macosx_target_ver, split_version

            macosx_target_ver = get_macosx_target_ver()
            if macosx_target_ver and split_version(macosx_target_ver) >= [
                    10, 5
            ]:
                return "-Wl,-rpath," + dir
            else:  # no support for -rpath on earlier macOS versions
                return "-L" + dir
        elif sys.platform[:7] == "freebsd":
            return "-Wl,-rpath=" + dir
        elif sys.platform[:5] == "hp-ux":
            return [
                "-Wl,+s" if self._is_gcc() else "+s",
                "-L" + dir,
            ]

        # For all compilers, `-Wl` is the presumed way to
        # pass a compiler option to the linker and `-R` is
        # the way to pass an RPATH.
        if sysconfig.get_config_var("GNULD") == "yes":
            # GNU ld needs an extra option to get a RUNPATH
            # instead of just an RPATH.
            return "-Wl,--enable-new-dtags,-R" + dir
        else:
            return "-Wl,-R" + dir