a
    JÓ@b%:  ã                   @   sp   d Z ddlZddlmZmZmZmZmZ ddl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ÚCompileErrorÚLibErrorÚ	LinkErrorÚUnknownFileError)Ú	CCompilerÚgen_preprocess_options)Ú
write_file)Únewer)Úlogc                
       s”   e Zd ZdZdZi ZdgZg d¢Zee ZdZ	dZ
dZd ZZd	Zd‡ f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‡  ZS )"ÚBCPPCompilerzConcrete class that implements an interface to the Borland C/C++
    compiler, as defined by the CCompiler abstract class.
    Zbcppz.c)z.ccz.cppz.cxxz.objz.libz.dllz%s%sz.exer   c                    sn   t ƒ  |||¡ d| _d| _d| _d | _g d¢| _g d¢| _g d¢| _g d¢| _	g | _
g d¢| _g d¢| _d S )	Nz	bcc32.exezilink32.exeztlib.exe)ú/tWMz/O2ú/qú/g0)r   z/Odr   r   )z/Tpdú/Gnr   ú/x)r   r   r   )r   r   r   z/r)ÚsuperÚ__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©Ú	__class__© úAlib/python3.9/site-packages/setuptools/_distutils/bcppcompiler.pyr   5   s    




zBCPPCompiler.__init__Nc	                 C   s˜  |   ||||||¡\}}	}}
}|p$g }| d¡ |rB| | j¡ n| | j¡ |	D ]>}z|| \}}W n ty~   Y qRY n0 tj |¡}tj |¡}|  	tj 
|¡¡ |dkr´qR|dkrz|  dd||g¡ W qR ty } zt|ƒ‚W Y d }~qRd }~0 0 qR|| jv rd}n|| jv r*d}nd}d| }z,|  | jg| |
 ||g | |g ¡ W qR ty } zt|ƒ‚W Y d }~qRd }~0 0 qR|	S )	Nz-cú.resú.rcZbrcc32z-foÚ z-Pú-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   sT    ÿÿ



ÿþþ
 zBCPPCompiler.compilec           	   
   C   s   |   ||¡\}}| j||d}|  ||¡r€|dg| }|r:z|  | jg| ¡ W qŒ ty| } zt|ƒ‚W Y d }~qŒd }~0 0 nt d|¡ d S )N)r3   z/uúskipping %s (up-to-date))	Ú_fix_object_argsÚlibrary_filenameÚ
_need_linkr0   r   r   r   r   r6   )	r   r9   Zoutput_libnamer3   r6   Útarget_langÚoutput_filenameZlib_argsr>   r"   r"   r#   Úcreate_static_lib’   s    ÿ zBCPPCompiler.create_static_libc               
   C   sê  |   ||¡\}}|  |||¡\}}}|r8t dt|ƒ¡ |d u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 u rÂd}n‚tj |¡\}}tj |¡\}}tj |d ¡}tj |d| ¡}dg}|pg D ]}| d||f ¡ q|  t||fd	| ¡ ttjj|ƒ}|g}g }|D ]>}tj tj |¡¡\}}|d
kr’| |¡ n
| |¡ q`|D ]}| dtj |¡ ¡ q¤| d¡ | |¡ | d|g¡ | d¡ |D ]4}|  |||	¡}|d u r| |¡ n
| |¡ qò| d¡ | d¡ | d|g¡ | d¡ | |¡ |
rp|
|d d…< |r€| |¡ |  tj |¡¡ z|  | jg| ¡ W n. tyÖ } zt|ƒ‚W Y d }~n
d }~0 0 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 %sr$   z/L%sz/L.ú,z,,Zimport32Zcw32mtr@   ) rA   Z_fix_lib_argsr   ÚwarnÚstrr+   r,   ÚjoinrC   r   Z
EXECUTABLEr   r   r   r   ÚsplitÚsplitextr/   r(   Zexecuter	   Úmapr-   Únormcaser)   Úfind_library_filer.   r0   r   r   r   r6   ) r   Ztarget_descr9   rE   r3   Z	librariesZlibrary_dirsZruntime_library_dirsZexport_symbolsr6   r7   r8   Z
build_temprD   Zstartup_objZld_argsZdef_fileÚheadÚtailÚmodnamer=   Ztemp_dirÚcontentsZsymZobjects2Z	resourcesÚfileÚbaseÚlr   Úlibfiler>   r"   r"   r#   Úlink«   s‚    ÿÿ
ÿ









 zBCPPCompiler.linkc           	      C   sr   |r"|d }|d |d ||f}n|d |f}|D ]:}|D ]0}t j ||  |¡¡}t j |¡r:|    S q:q2d S )NZ_dZ_bcpp)r+   r,   rJ   rB   Úexists)	r   Údirsr   r6   ZdlibZ	try_namesÚdirÚnamerW   r"   r"   r#   rO   4  s    
zBCPPCompiler.find_library_filer&   c                 C   sÆ   |d u rd}g }|D ]¬}t j t j |¡¡\}}|| jddg vrRtd||f ƒ‚|rbt j |¡}|dkr„| t j ||| ¡¡ q|dkr¦| t j ||d ¡¡ q| t j ||| j	 ¡¡ q|S )Nr&   r%   r$   z"unknown file type '%s' (from '%s'))
r+   r,   rL   rN   Úsrc_extensionsr   Úbasenamer(   rJ   Úobj_extension)r   Zsource_filenamesZ	strip_dirr3   Z	obj_namesZsrc_namerU   r=   r"   r"   r#   Úobject_filenamesN  s$    ÿÿzBCPPCompiler.object_filenamesc              
   C   sÜ   |   d ||¡\}}}t||ƒ}dg| }	|d ur>|	 d| ¡ |rN||	d d…< |r\|	 |¡ |	 |¡ | js~|d u s~t||ƒrØ|r”|  tj 	|¡¡ z|  
|	¡ W n4 tyÖ }
 zt|
ƒ t|
ƒ‚W Y d }
~
n
d }
~
0 0 d S )Nz	cpp32.exer'   r   )Z_fix_compile_argsr   r(   r)   r   r
   r.   r+   r,   r/   r0   r   Úprintr   )r   ÚsourceZoutput_filer4   r5   r7   r8   Ú_r:   Zpp_argsr>   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executablesr1   r2   r]   r_   Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZexe_extensionr   r?   rF   rX   rO   r`   rd   Ú__classcell__r"   r"   r    r#   r      sX      ý  þ
D   û
          ó
 

  ý
     úr   )rh   r+   Zdistutils.errorsr   r   r   r   r   Zdistutils.ccompilerr   r   Zdistutils.file_utilr	   Zdistutils.dep_utilr
   Ú	distutilsr   r   r"   r"   r"   r#   Ú<module>   s   