B
    0ªa¡A  ã               @   s€   d dl Z d dlZd dl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 d dlmZ ddlmZ G dd	„ d	eƒZdS )
é    N)ÚMSVCCompiler)ÚUnixCCompiler)ÚMingw32CCompiler)Úcustomize_compileré   )Úutilsc               @   sd   e Zd ZdZdZdZejejdfdd„Z	dd„ Z
dd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú	CCompilerÚ Nc             C   s„  |dkrZ|d kr<|  d¡dks,|  d¡dkr2d}n
tj ¡ }|dkrd|dkrdtd| ƒ‚n
tj ¡ }|dkr„dd	lm} | ¡ | _ntjj	|d
| _t
| jƒ t| jtƒrÞ| jjdgkrÀg | j_| jjd krÞ| jjdg | j_|  ¡ rLdtjd< dtjkr>dtjkrtj  d¡tjd< n tj  d¡r>tj  d¡tjd< d| _d| _n4t| jtƒrj| jjd | _nd | jj¡| _d| _d S )NÚntZMSYSTEMZMINGW32ZMINGW64Zmingw32Zmsvcz'Specified Compiler '%s' is unsupported.r   )Úmsvccompiler)ÚcompilerZmsvcrtz-EÚ1ZDISTUTILS_USE_SDKZMSSdkZWindowsSDKDirZVCInstallDirzcl.exez-wd4996r   ú z-Wno-deprecated-declarations)ÚgetÚ	distutilsZ	ccompilerZget_default_compilerÚ
SystemExitr	   r   Zget_msvc_compilerr   Znew_compilerr   Ú
isinstancer   Zdll_librariesZpreprocessorÚcheck_is_msvcÚosÚenvironÚcompiler_cmdÚ_cflags_no_deprecation_warningsÚjoin)Úselfr   ZosnameZcompiler_namer   © r   ú5/usr/lib/gobject-introspection/giscanner/ccompiler.pyÚ__init__+   s@    




zCCompiler.__init__c             C   sv  g }g }|   ¡ rddg}n2dg}| d¡ |sL| d¡ tjdkrL| d¡ xT|| D ]H}|   ¡ rz|dkrž| |d	 ¡ qV| d
¡r| |¡ qV| d| ¡ qVW x€|D ]x}	|   ¡ rÐ|	 dd¡}	| d|	 ¡ nF| d|	 ¡ tj |	¡r|r| d¡ | |	¡ n| d|	 ¡ | |	¡ q¨W xL|D ]D}
|
tj	krZtj
 |tj	|
 g ¡tj	|
< ntj
 |¡tj	|
< q*W d S )NÚLIBÚPATHZLD_LIBRARY_PATHz-L.z-Wl,-rpath,.Údarwinz-Wl,--no-as-neededÚmz.libz.laz-lú/ú\z	-libpath:z-Lz-rpathz-Wl,-rpath,)r   ÚappendÚsysÚplatformÚendswithÚreplacer   ÚpathÚisabsr   Úpathsepr   )r   ÚargsÚlibtoolÚ	librariesZextra_librariesZlibpathsZruntime_path_envvarZruntime_pathsÚlibraryZlibrary_pathZenvvarr   r   r   Úget_internal_link_flagsp   s@    








 z!CCompiler.get_internal_link_flagsc             C   sV   xP|D ]H}|   ¡ r*|dkrN| |d ¡ q| d¡r@| |¡ q| d| ¡ qW d S )Nr    z.libz.laz-l)r   r#   r&   )r   r+   r-   r.   r   r   r   Úget_external_link_flags«   s    

z!CCompiler.get_external_link_flagsc       	      C   sz   dg}|   |¡\}}}dg}| |¡ | |¡ |  ¡ r`| d¡ | d¡ | d¡ | d¡ | jj|||||d d S )Nz-CÚ.)Z_USE_DECLSPECS_FOR_SALN)Z_CRT_SECURE_NO_WARNINGSN)Z_CRT_NONSTDC_NO_WARNINGSN)ZSAL_NO_ATTRIBUTE_DECLARATIONSN)ÚsourceZoutput_fileÚmacrosÚinclude_dirsÚextra_postargs)Ú_set_cpp_optionsÚextendr   r#   r   Ú
preprocess)	r   r2   ÚoutputZcpp_optionsr5   Úinclude_pathsr3   Zpostargsr4   r   r   r   r8   »   s    





zCCompiler.preprocessc             C   s>  g }g }d  |¡}| tjd| tj¡¡}|  |¡\}	}
}x|D ]}| |¡ q@W t| jtƒrætj	 
d¡}|ræxvtt |¡ƒD ]d\}}| d¡r~| d¡}|dkrÀ|d|… ||d d … f}n|dd … d f}||
kr~|
 |¡ q~W | jd	krþ|sþ| d
¡ | | j¡ | |	¡ | |¡ | jj||
||tj tj¡dS )Nr	   r   ZCFLAGSz-Dú=éÿÿÿÿé   r   Zgccz-Wall)Zsourcesr3   r4   r5   Z
output_dir)r   Úrfindr   Úsepr6   r#   r   r   r   r   r   Ú	enumerateÚshlexÚsplitÚ
startswithÚfindr   r   r7   Úcompiler(   Úabspath)r   Zpkg_config_cflagsZcpp_includesr2   Zinit_sectionsr5   ÚincludesZ
source_strZ
tmpdir_idxr:   r3   Z
extra_argsZincludeZcflagsÚiZcflagZstridxZmacrosetr   r   r   rE   Ô   s:    







zCCompiler.compilec             C   s  g }g }|   ¡ r^tj d¡}| d¡}| d¡ | d¡ tjjdk r\dd„ |D ƒ|d d …< nºt	 
|¡}|r¤tjdkr| t	 tj d	d
¡¡¡ | |¡ | d¡ | tj dd¡dg¡ tj| jdgtjd}| ¡ \}}	x8| d¡ ¡ D ]&}
|
 d¡rî|
tdƒd …  tj¡}qîW g }g }xÒ|D ]È}d}d| d| d| d| d| g}xˆ|D ]~}|rjP | d¡r‚|dd … }xT|D ]J}|r˜P tj ||¡}tj |¡rŠ|   ¡ rˆtjdd\}}t |¡ d| g}tj||g | tjd}t|dƒh}x`|  ¡  ¡ D ]P}
d|
kr|
 ¡ }x6|D ].}| d¡r2| |d d … d! ¡ d"}P q2W qW W d Q R X | ¡  t !|¡ nLtj||g tjd}| ¡ \}}	x(| d¡ ¡ D ]}
| |
¡ d"}P qºW qŠW q\W |s(| |¡ q(W t|ƒd#krt"d$d% |¡ ƒ‚|S )&Nr   ú;zdumpbin.exez-symbolsé   c             S   s   g | ]}|d kr|‘qS )r    r   )Ú.0Úlibr   r   r   ú
<listcomp>  s    z2CCompiler.resolve_windows_libs.<locals>.<listcomp>r
   ZSHELLzsh.exez--mode=executeZDLLTOOLzdlltool.exez
--identifyz-print-search-dirs)ÚstdoutÚasciizlibraries: Fzlib%s.dll.azlib%s.az%s.dll.az%s.az%s.libr;   r   zg-ir-win32-resolve-lib-)Úprefixz-out:ÚrZ__IMPORT_DESCRIPTOR_é   z.dllTr   z4ERROR: can't resolve libraries to shared libraries: z, )#r   r   r   r   rB   r#   r$   Úversion_infoÚmajorr   Zget_libtool_commandÚnameZwhichr7   Ú
subprocessÚPopenr   ÚPIPEZcommunicateÚdecodeÚ
splitlinesrC   Úlenr*   r(   r   ÚexistsÚtempfileZmkstempÚcloseZcallÚopenÚreadÚunlinkr   )r   r-   Úoptionsr+   Z	libsearchZlibpathr,   ÚprocÚoÚeÚlineZshlibsZnot_resolvedrL   ÚfoundZ
candidatesÚlÚcZimplibZtmp_fdZtmp_filenameZoutput_flagZtmp_fileobjZline_tokensÚitemr   r   r   Úresolve_windows_libsý   s    
	
















zCCompiler.resolve_windows_libsc             C   s   t | jtƒrdS dS d S )NTF)r   r   r   )r   r   r   r   r   e  s    zCCompiler.check_is_msvcc             C   sè   g }g }g }xÐ|D ]È}t  |¡}| d¡rB| |tdƒd … ¡ q| d¡r¤|tdƒd … }| d¡}|dkrx|}	d }
n|d |… }	||d d … }
| |	|
f¡ q| d¡rÈ| |tdƒd … f¡ q|dkr| |¡ qW |||fS )Nz-Iz-Dr;   r<   r   z-U)z-g3z-ggdb3z-gstabs3z-gcoff3z-gxcoff3z-gvms3)r   Zcflag_real_include_pathrC   r#   r[   rD   )r   rb   rG   r3   Zother_optionsrd   ZoptionZmacroZmacro_indexZ
macro_nameZmacro_valuer   r   r   r6   l  s*    





zCCompiler._set_cpp_options)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   rU   r   r/   r0   r8   rE   rk   r   r6   r   r   r   r   r   %   s   B;)hr   )r   rA   rV   r]   r$   r   Zdistutils.msvccompilerr   Zdistutils.unixccompilerr   Zdistutils.cygwinccompilerr   Zdistutils.sysconfigr   r	   r   Úobjectr   r   r   r   r   Ú<module>   s   