U
    A`                     @   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rjd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   %/usr/lib/python3.8/distutils/spawn.pyspawn   s    

r   c                 C   s*   t | D ]\}}d|krd| | |< q| 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    |szttj|| }W n@ tk
r } z"t	sp|} t
d| |jd f W 5 d }~X Y nX |dkrt	s|} t
d| |f d S )Nr   r   r   command %r failed: %s%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   darwinc              
   C   s|  t d|  |rd S | d }|r*tjp.tj}d }tjdkrtd krxddl	m
} |dp^datrxd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rz$|d kr|||  n||| | W nN tk
rX } z.ts(|} tjd| |jf  td W 5 d }~X Y nX tsd|} tjd|   td nzt|
d\}
}W nD tk
r } z$ts|} td| |jd f W 5 d }~X Y nX t|rts|} td| t|f nlt |rHt!|}|dkr,d S ts6|} td| |f n,t"|rZqntsd|} td| |f qd S )Nr   r   r&   )	sysconfig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/   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 reasonsr   r   z"command %r terminated by signal %dr   z1unknown error executing %r: termination status %d)#r   r   r    r   execvpexecvsysplatform_cfg_target	distutilsr'   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envr'   Z
cur_targetZmy_msgpideZstatusr%   Zexit_statusr   r   r   r   W   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rzt d}W n t	t
fk
r   t j}Y nX |sdS |t j}|D ]&}t j|| }t j|r|  S qd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splitextr3   r4   isfiler9   r:   confstrAttributeError
ValueErrordefpathr7   pathsepr    )r$   rN   _Zextpathspfr   r   r   r      s(    
r   )r   r   r   )r   r   r   )r   r   r   )N)__doc__r3   r   Zdistutils.errorsr   r   Zdistutils.debugr   r6   r   r   r   r   r4   r5   r8   r   r   r   r   r   r   <module>   s   



R