B
    ^ c                 @   s   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	 dddZ
d	d
 ZdddZejdkrvddlmZ dadadddZdddZdS )zdistutils.spawn

Provides the 'spawn()' function, a front-end to various platform-
specific functions for launching another program in a sub-process.
Also provides the 'find_executable()' to search the path for a given
executable name.
    N)DistutilsPlatformErrorDistutilsExecError)DEBUG)log   c             C   sN   t | } tjdkr"t| ||d n(tjdkr<t| ||d ntdtj dS )a  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.
    posix)dry_runntz1don't know how to spawn programs on platform '%s'N)listosname_spawn_posix	_spawn_ntr   )cmdsearch_pathverboser    r    lib/python3.7/distutils/spawn.pyspawn   s    

r   c             C   s.   x(t | D ]\}}d|kr
d| | |< q
W | S )zQuote command-line arguments for DOS/Windows conventions.

    Just wraps every argument which contains blanks in double quotes, and
    returns a new argument list.
     z"%s")	enumerate)argsiargr   r   r   _nt_quote_args+   s    r   c          
   C   s   | d }t | } |r t|p|}td|g| dd    |syttj|| }W n@ tk
r } z"t	sp|} t
d| |jd f W d d }~X Y nX |dkrt	s|} t
d| |f d S )Nr   r   r   zcommand %r failed: %sz%command %r failed with exit status %d)r   find_executabler   infojoinr   spawnvP_WAITOSErrorr   r   r   )r   r   r   r   
executableZrcexcr   r   r   r   ;   s$    &r   darwin)	sysconfigc          
   C   st  t d|  |rd S | d }|r*tjp.tj}d }tjdkrtd krlt	
dpRdatrldd tdD atrtjdt}td	d |dD krd
|tf }t|ttj|d}|rtjptj}t }	|	dkrty$|d kr|||  n||| | W nN tk
rL }
 z.ts|} tjd| |
jf  td W d d }
~
X Y nX tsX|} tjd|   td nxyt|	d\}	}W nD tk
r } z$ts|} td| |jd f W d d }~X Y nX t|rts|} td| t|f nlt|r>t |}|dkr"d S ts,|} td| |f n,t!|rPqvntsZ|} td| |f qvW d S )Nr   r   r$   MACOSX_DEPLOYMENT_TARGET c             S   s   g | ]}t |qS r   )int).0xr   r   r   
<listcomp>e   s    z _spawn_posix.<locals>.<listcomp>.c             S   s   g | ]}t |qS r   )r(   )r)   r*   r   r   r   r+   k   s    zF$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure)r&   zunable to execute %r: %s
r   z(unable to execute %r for unknown reasonszcommand %r failed: %sr   z"command %r terminated by signal %dz%command %r failed with exit status %dz1unknown error executing %r: termination status %d)"r   r   r   r   execvpexecvsysplatform_cfg_targetr%   Zget_config_varsplit_cfg_target_splitenvirongetr   dictexecvpeexecveforkr!   r   stderrwritestrerror_exitwaitpidr   r   WIFSIGNALEDWTERMSIG	WIFEXITEDWEXITSTATUS
WIFSTOPPED)r   r   r   r   r"   Zexec_fnenvZ
cur_targetZmy_msgpideZstatusr#   Zexit_statusr   r   r   r   X   s    



&

r   c          	   C   s   t j| \}}tjdkr*|dkr*| d } t j| r:| S |dkrt jdd}|dkryt d}W n t	t
fk
r   t j}Y nX |sdS |t j}x*|D ]"}t j|| }t j|r|S qW dS )zTries to find 'executable' in the directories listed in 'path'.

    A string listing directories separated by 'os.pathsep'; defaults to
    os.environ['PATH'].  Returns the complete filename or None if not found.
    Zwin32z.exeNPATHCS_PATH)r   pathsplitextr/   r0   isfiler4   r5   confstrAttributeError
ValueErrordefpathr2   pathsepr   )r"   rI   _Zextpathspfr   r   r   r      s(    
r   )r   r   r   )r   r   r   )r   r   r   )N)__doc__r/   r   Zdistutils.errorsr   r   Zdistutils.debugr   Z	distutilsr   r   r   r   r0   r%   r1   r3   r   r   r   r   r   r   <module>   s   



Q