B
    ^ ÇcË9  ã               @   s’   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZmZmZmZ ddlmZ ejdkr~ddlZG d	d
„ d
e	ƒZdS )a9  distutils.unixccompiler

Contains the UnixCCompiler class, a subclass of CCompiler that handles
the "typical" Unix-style command-line C compiler:
  * macros defined with -Dname[=value]
  * macros undefined with -Uname
  * include search directories specified with -Idir
  * libraries specified with -lllib
  * library search directories specified with -Ldir
  * compile handled by 'cc' (or similar) executable with -c option:
    compiles .c to .o
  * link static library handled by 'ar' command (possibly with 'ranlib')
  * link shared library handled by 'cc -shared'
é    N)Ú	sysconfig)Únewer)Ú	CCompilerÚgen_preprocess_optionsÚgen_lib_options)ÚDistutilsExecErrorÚCompileErrorÚLibErrorÚ	LinkError)ÚlogÚdarwinc            
   @   sä   e Zd ZdZddgdgdgddgdgddgddœZejdd… d	krNd
ged
< ddddddgZdZdZ	dZ
dZdZd Z ZZeZejdkrdZd,dd„Zdd„ Zd-dd„Zd.d d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd/d*d+„ZdS )0ÚUnixCCompilerZunixNZccz-sharedZarz-cr)ÚpreprocessorÚcompilerÚcompiler_soÚcompiler_cxxÚ	linker_soÚ
linker_exeÚarchiverÚranlibé   r   r   z.cz.Cz.ccz.cxxz.cppz.mz.oz.az.soz.dylibz.tbdzlib%s%sÚcygwinz.exec          
   C   sÒ   |   d ||¡}|\}}}t||ƒ}	| j|	 }
|r>|
 d|g¡ |rN||
d d…< |r\|
 |¡ |
 |¡ | js~|d ks~t||ƒrÎ|r”|  tj	 
|¡¡ y|  |
¡ W n* tk
rÌ } zt|ƒ‚W d d }~X Y nX d S )Nz-or   )Z_fix_compile_argsr   r   ÚextendÚappendZforcer   ÚmkpathÚosÚpathÚdirnameÚspawnr   r   )ÚselfÚsourceZoutput_fileZmacrosZinclude_dirsÚextra_preargsÚextra_postargsÚ
fixed_argsÚignoreÚpp_optsZpp_argsÚmsg© r'   ú(lib/python3.7/distutils/unixccompiler.pyÚ
preprocessU   s$    




zUnixCCompiler.preprocessc       	   
   C   sp   | j }tjdkr t ||| ¡}y |  || |d|g | ¡ W n* tk
rj } zt|ƒ‚W d d }~X Y nX d S )Nr   z-o)r   ÚsysÚplatformÚ_osx_supportÚcompiler_fixupr   r   r   )	r   ÚobjÚsrcZextZcc_argsr"   r%   r   r&   r'   r'   r(   Ú_compileo   s    

zUnixCCompiler._compiler   c          
   C   s²   |   ||¡\}}| j||d}|  ||¡r¢|  tj |¡¡ |  | j|g | | j	 ¡ | j
r®y|  | j
|g ¡ W q® tk
rž } zt|ƒ‚W d d }~X Y q®X nt d|¡ d S )N)Ú
output_dirzskipping %s (up-to-date))Ú_fix_object_argsÚlibrary_filenameÚ
_need_linkr   r   r   r   r   r   Úobjectsr   r   r	   r   Údebug)r   r5   Zoutput_libnamer1   r6   Útarget_langÚoutput_filenamer&   r'   r'   r(   Úcreate_static_libz   s    zUnixCCompiler.create_static_libc          
   C   sê  |   ||¡\}}|  |||¡}|\}}}t| |||ƒ}t|ttd ƒfƒsPtdƒ‚|d k	rftj 	||¡}|  
||¡rÚ|| j | d|g }|	rœdg|d d…< |
r¬|
|d d…< |rº| |¡ |  tj |¡¡ yÞ|tjkrè| jd d … }n| jd d … }|dkrv| jrvd}tj |d ¡dkrDd}xd|| krB|d7 }q(W tj || ¡d	kr`d}nd}| j| ||| < tjd
kršt ||¡}ddg| }|  || ¡ W n, tk
rÖ } zt|ƒ‚W d d }~X Y nX nt d|¡ d S )Nz%'output_dir' must be a string or Nonez-oz-gr   zc++Úenvé   ú=Z	ld_so_aixr   z-archZx86_64zskipping %s (up-to-date))r2   Z_fix_lib_argsr   Ú
isinstanceÚstrÚtypeÚ	TypeErrorr   r   Újoinr4   r5   r   r   r   r   Z
EXECUTABLEr   r   r   Úbasenamer*   r+   r,   r-   r   r   r
   r   r6   )r   Ztarget_descr5   r8   r1   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr6   r!   r"   Z
build_tempr7   r#   Zlib_optsZld_argsZlinkerÚiÚoffsetr&   r'   r'   r(   Úlink”   sP    


zUnixCCompiler.linkc             C   s   d| S )Nz-Lr'   )r   Údirr'   r'   r(   Úlibrary_dir_option×   s    z UnixCCompiler.library_dir_optionc             C   s   d|kpd|kS )NZgcczg++r'   )r   Zcompiler_namer'   r'   r(   Ú_is_gccÚ   s    zUnixCCompiler._is_gccc             C   sÂ   t j t d¡ ¡ d ¡}tjd d… dkr4d| S tjd d… dkrNd| S tjd d	… d
kr‚|  |¡rvdd| gS dd| gS |  |¡r¶t d¡dks¤tjdkr¬d| S d| S nd| S d S )NZCCr   r   r   z-Lé   Zfreebsdz-Wl,-rpath=é   zhp-uxz-Wl,+sz+sZGNULDZyesZwin32z-Wl,-Rz-Wl,--disable-new-dtags,-Rz-R)	r   r   rB   r   Úget_config_varÚsplitr*   r+   rH   )r   rF   r   r'   r'   r(   Úruntime_library_dir_optionÝ   s    


z(UnixCCompiler.runtime_library_dir_optionc             C   s   d| S )Nz-lr'   )r   Úlibr'   r'   r(   Úlibrary_option  s    zUnixCCompiler.library_optionc             C   s’  | j |dd}| j |dd}| j |dd}| j |dd}tjdkrpt d¡}t d|¡}	|	d krfd	}
n
|	 d
¡}
x|D ]}tj	 
||¡}tj	 
||¡}tj	 
||¡}tj	 
||¡}tjdkrD| d¡sä| d¡rD| d¡sDtj	 
|
|d
d … |¡}tj	 
|
|d
d … |¡}tj	 
|
|d
d … |¡}tj	 
|
|d
d … |¡}tj	 |¡rV|S tj	 |¡rh|S tj	 |¡rz|S tj	 |¡rx|S qxW d S )NÚshared)Zlib_typeÚdylibÚ
xcode_stubÚstaticr   ZCFLAGSz-isysroot\s*(\S+)ú/r;   z/System/z/usr/z/usr/local/)r3   r*   r+   r   rK   ÚreÚsearchÚgroupr   r   rA   Ú
startswithÚexists)r   ÚdirsrN   r6   Zshared_fZdylib_fZxcode_stub_fZstatic_fZcflagsÚmZsysrootrF   rP   rQ   rS   rR   r'   r'   r(   Úfind_library_file
  s>    



zUnixCCompiler.find_library_file)NNNNN)Nr   N)
NNNNNr   NNNN)r   )Ú__name__Ú
__module__Ú__qualname__Zcompiler_typeZexecutablesr*   r+   Zsrc_extensionsZobj_extensionZstatic_lib_extensionZshared_lib_extensionZdylib_lib_extensionZxcode_stub_lib_extensionZstatic_lib_formatZshared_lib_formatZdylib_lib_formatZxcode_stub_lib_formatZexe_extensionr)   r0   r9   rE   rG   rH   rM   rO   r\   r'   r'   r'   r(   r   -   sD   

 

   
?*r   )Ú__doc__r   r*   rU   Z	distutilsr   Zdistutils.dep_utilr   Zdistutils.ccompilerr   r   r   Zdistutils.errorsr   r   r	   r
   r   r+   r,   r   r'   r'   r'   r(   Ú<module>   s   
