B
    ^ ÇcW:  ã               @   sx   d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZ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 )
zƒdistutils.bcppcompiler

Contains BorlandCCompiler, an implementation of the abstract CCompiler class
for the Borland C++ compiler.
é    N)ÚDistutilsExecErrorÚDistutilsPlatformErrorÚCompileErrorÚLibErrorÚ	LinkErrorÚUnknownFileError)Ú	CCompilerÚgen_preprocess_optionsÚgen_lib_options)Ú
write_file)Únewer)Úlogc            
   @   sŽ   e Zd ZdZdZi ZdgZdddgZee ZdZ	dZ
d	Zd
 ZZdZddd„Zddd„Zddd„Zd dd„Zd!dd„Zd"dd„Zd#dd„ZdS )$ÚBCPPCompilerzConcrete class that implements an interface to the Borland C/C++
    compiler, as defined by the CCompiler abstract class.
    Zbcppz.cz.ccz.cppz.cxxz.objz.libz.dllz%s%sz.exer   c             C   s„   t  | |||¡ d| _d| _d| _d | _ddddg| _ddddg| _d	d
ddg| _d	d
ddg| _	g | _
d
ddg| _d
dddg| _d S )Nz	bcc32.exezilink32.exeztlib.exez/tWMz/O2z/qz/g0z/Odz/Tpdz/Gnz/xz/r)r   Ú__init__ÚccÚlinkerÚlibZpreprocess_optionsÚcompile_optionsÚcompile_options_debugÚldflags_sharedÚldflags_shared_debugZldflags_staticÚldflags_exeÚldflags_exe_debug)ÚselfÚverboseZdry_runÚforce© r   ú'lib/python3.7/distutils/bcppcompiler.pyr   5   s    zBCPPCompiler.__init__Nc	             C   sš  |   ||||||¡\}}	}}
}|p$g }| d¡ |rB| | j¡ n| | j¡ xD|	D ]:}y|| \}}W n tk
r‚   wVY nX tj |¡}tj |¡}|  	tj 
|¡¡ |dkr¸qV|dkry|  dd||g¡ W qV tk
r } zt|ƒ‚W d d }~X Y qVX qV|| jkrd}n|| jkr,d}nd}d| }y,|  | jg| |
 ||g | |g ¡ W qV tk
r } zt|ƒ‚W d d }~X Y qVX qVW |	S )	Nz-cz.resz.rcZbrcc32z-foÚ z-Pz-o)Z_setup_compileÚappendÚextendr   r   ÚKeyErrorÚosÚpathÚnormpathÚmkpathÚdirnameÚspawnr   r   Ú_c_extensionsÚ_cpp_extensionsr   )r   ZsourcesÚ
output_dirÚmacrosÚinclude_dirsÚdebugÚextra_preargsÚextra_postargsZdependsÚobjectsÚpp_optsZbuildZcompile_optsÚobjÚsrcÚextÚmsgZ	input_optZ
output_optr   r   r   ÚcompileQ   sF    

(zBCPPCompiler.compilec       	   
   C   sŽ   |   ||¡\}}| j||d}|  ||¡r~|dg| }|r:y|  | jg| ¡ W qŠ tk
rz } zt|ƒ‚W d d }~X Y qŠX nt d|¡ d S )N)r*   z/uzskipping %s (up-to-date))	Ú_fix_object_argsÚlibrary_filenameÚ
_need_linkr'   r   r   r   r   r-   )	r   r0   Zoutput_libnamer*   r-   Útarget_langÚoutput_filenameZlib_argsr5   r   r   r   Úcreate_static_lib’   s    zBCPPCompiler.create_static_libc           
   C   sø  |   ||¡\}}|  |||¡\}}}|r8t dt|ƒ¡ |d k	rNtj ||¡}|  ||¡rè|t	j
krŽd}|	r~| jd d … }q´| jd d … }n&d}|	r¦| jd d … }n| jd d … }|d krÂd}n†tj |¡\}}tj |¡\}}tj |d ¡}tj |d| ¡}dg}x&|pg D ]}| d||f ¡ qW |  t||fd	| ¡ ttjj|ƒ}|g}g }xF|D ]>}tj tj |¡¡\}}|d
kr˜| |¡ n
| |¡ qfW x$|D ]}| dtj |¡ ¡ q®W | d¡ | |¡ | d|g¡ | d¡ x<|D ]4}|  |||	¡}|d kr(| |¡ n
| |¡ q W | d¡ | d¡ | d|g¡ | d¡ | |¡ |
r€|
|d d…< |r| |¡ |  tj |¡¡ y|  | jg| ¡ W n, tk
rä } zt|ƒ‚W d d }~X Y nX nt d|¡ d S )Nz7I don't know what to do with 'runtime_library_dirs': %sZc0w32Zc0d32r   r   z%s.defZEXPORTSz  %s=_%sz
writing %sz.resz/L%sz/L.ú,z,,Zimport32Zcw32mtzskipping %s (up-to-date)) r7   Z_fix_lib_argsr   ÚwarnÚstrr"   r#   Újoinr9   r   Z
EXECUTABLEr   r   r   r   ÚsplitÚsplitextr&   r   Zexecuter   Úmapr$   Únormcaser    Úfind_library_filer%   r'   r   r   r   r-   ) r   Ztarget_descr0   r;   r*   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr-   r.   r/   Z
build_tempr:   Zstartup_objZld_argsZdef_fileÚheadÚtailÚmodnamer4   Ztemp_dirÚcontentsZsymZobjects2Z	resourcesÚfileÚbaseÚlr   Úlibfiler5   r   r   r   Úlink«   s|    















zBCPPCompiler.linkc       	      C   sv   |r"|d }|d |d ||f}n|d |f}xB|D ]6}x0|D ](}t j ||  |¡¡}t j |¡r>|S q>W q4W d S d S )NZ_dZ_bcpp)r"   r#   r@   r8   Úexists)	r   Údirsr   r-   ZdlibZ	try_namesÚdirÚnamerM   r   r   r   rE   4  s    


zBCPPCompiler.find_library_filer   c             C   sÊ   |d krd}g }x´|D ]¬}t j t j |¡¡\}}|| jddg krTtd||f ƒ‚|rdt j |¡}|dkr†| t j ||| ¡¡ q|dkr¨| t j ||d ¡¡ q| t j ||| j	 ¡¡ qW |S )Nr   z.rcz.resz"unknown file type '%s' (from '%s'))
r"   r#   rB   rD   Úsrc_extensionsr   Úbasenamer   r@   Úobj_extension)r   Zsource_filenamesZ	strip_dirr*   Z	obj_namesZsrc_namerK   r4   r   r   r   Úobject_filenamesN  s"     
zBCPPCompiler.object_filenamesc          
   C   sÚ   |   d ||¡\}}}t||ƒ}dg| }	|d k	r>|	 d| ¡ |rN||	d d…< |r\|	 |¡ |	 |¡ | js~|d ks~t||ƒrÖ|r”|  tj 	|¡¡ y|  
|	¡ W n2 tk
rÔ }
 zt|
ƒ t|
ƒ‚W d d }
~
X Y nX d S )Nz	cpp32.exez-or   )Z_fix_compile_argsr	   r   r    r   r   r%   r"   r#   r&   r'   r   Úprintr   )r   ÚsourceZoutput_filer+   r,   r.   r/   Ú_r1   Zpp_argsr5   r   r   r   Ú
preprocessi  s$    	



zBCPPCompiler.preprocess)r   r   r   )NNNr   NNN)Nr   N)
NNNNNr   NNNN)r   )r   r   )NNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zcompiler_typeZexecutablesr(   r)   rS   rU   Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZexe_extensionr   r6   r<   rN   rE   rV   rZ   r   r   r   r   r      sJ   
  
 
B  
         
|
 
    r   )r^   r"   Zdistutils.errorsr   r   r   r   r   r   Zdistutils.ccompilerr   r	   r
   Zdistutils.file_utilr   Zdistutils.dep_utilr   Z	distutilsr   r   r   r   r   r   Ú<module>   s   
 