U
    e                     @   s  d Z ddlmZ dZddlZddlZejdk rLddlmZ	 G dd de
ZnddlZd4d
dZedZedZedZedZedZeekrd	Znejedd d Zedejdd	Zedd ejdd	 ZedejdeZedZedZedZedZdd Zdd Zdd Zd5d d!Z d"d# Z!d$d% Z"d6d'd(Z#d7d)d*Z$d8d,d-Z%d.d/ Z&d0d1 Z'e(d2kre'ej)d3d  dS )9z
Compile a Python script into an executable that embeds CPython.
Requires CPython to be built as a shared library ('libpythonX.Y').

Basic usage:

    python -m Cython.Build.BuildExecutable [ARGS] somefile.py
    )absolute_importTN)   	   )	sysconfigc                   @   s"   e Zd Zedd ZeejZdS )r   c                 C   s   | dkst t S )Ninclude)AssertionError
_sysconfigget_python_inc)name r   @/tmp/pip-unpacked-wheel-7k3cqui1/Cython/Build/BuildExecutable.pyget_path   s    zsysconfig.get_pathN)__name__
__module____qualname__staticmethodr   r   get_config_varr   r   r   r   r      s   
r    c                 C   s   t | p|S N)r   r   )r
   defaultr   r   r   r       s    r   r   LIBDIRLIBPLLIBRARY	LDLIBRARYr   CCCFLAGS LINKCCLINKFORSHAREDLIBSSYSLIBSEXEc                 G   s$   t r |r| | } tj| d  d S )N
)DEBUGsysstderrwrite)msgargsr   r   r   _debug7   s    r)   c                   C   s|   t dt t dt t dt t dt t dt t dt t dt t dt t d	t	 t d
t
 t dt t dt d S )Nz
INCDIR: %szLIBDIR1: %szLIBDIR2: %sz	PYLIB: %szPYLIB_DYN: %szCC: %sz
CFLAGS: %sz
LINKCC: %szLINKFORSHARED: %szLIBS: %szSYSLIBS: %szEXE_EXT: %s)r)   INCDIRLIBDIR1LIBDIR2PYLIB	PYLIB_DYNr   r   r   r   r   r    EXE_EXTr   r   r   r   dump_config>   s    










r0   c                 C   sr   g }d }t | D ]N\}}|dr.|| n,|dkrB|| n|}| |d d  }  qh|}qtd||| fS )N-)z-Xz--directive   zno input file provided)	enumerate
startswithappend
ValueError)r(   cy_argsZlast_argiarg
input_filer   r   r   _parse_argsM   s    
r;   c                 C   sN   |rd | } t|  ntd |  dd l}|j| |d}|rJt| d S )Nr   r   shell)joinr)   
subprocesscallr$   exit)cmdr=   r?   
returncoder   r   r   runcmd`   s    

rD   c                 C   s\   t td| t | d dt dt gtr,dt p8tjtt	g t
  t  t   d S )N-o.oz-Lz-l)rD   r   r/   r+   r,   r.   ospathr>   r-   r   splitr    r   basenamer   r   r   clinkn   s     rL   c                 C   s,   t tdd| d | d dt gt   d S )Nz-crE   rF   z.cz-I)rD   r   r*   r   rI   rJ   r   r   r   ccompilet   s    rM   r   c                 C   sd   ddl m}m}m} |t|p dd| g \}}td|j|  |||}|j	dkr`t
d d S )N   )VersionCmdLineMainr   z--embedzUsing Cython %s to compile %sr   r2   )ZCompilerrO   rP   rQ   parse_command_linelistr)   versioncompileZ
num_errorsr$   rA   )r:   optionsrO   rP   rQ   sourcesresultr   r   r   	cycompilex   s    
rY   c                 C   s"   t tj| gt| dd d S )NFr<   )rD   rG   rH   abspathrS   )program_namer(   r   r   r   	exec_file   s    r\   Fc                 C   s   t j| d }|t }|s<t j|t j| kr<td|s~t j|r~t j| r~t j| t j|kr~td| |S t	| | t
| t| |S )zi
    Build an executable program from a Cython module.

    Returns the name of the executable file.
    r   z?Input and output file names are the same, refusing to overwritez'File is up to date, not regenerating %s)rG   rH   splitextr/   rZ   r6   existsgetmtimer)   rY   rM   rL   )r:   Zcompiler_argsforcerK   Zexe_filer   r   r   build   s    

ra   c                 C   s   t | \}} t||  dS )z
    Build an executable program from a Cython module and run it.

    Arguments after the module name will be passed verbatimly to the program.
    N)_buildr\   )r(   r[   r   r   r   build_and_run   s    rc   c                 C   s    t | \}}} t||}|| fS r   )r;   ra   )r(   r:   r7   r[   r   r   r   rb      s    
rb   __main__r2   )r   )T)r   )r   )r   F)*__doc__
__future__r   r#   r$   rG   version_info	distutilsr   r   objectr   r   r*   r+   r,   r-   r.   rH   r]   environgetr   r   r   r   r   r    r/   r)   r0   r;   rD   rL   rM   rY   r\   ra   rc   rb   r   argvr   r   r   r   <module>   sJ   	






	



