3
;p_.:                 @   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 )
zdistutils.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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 j| ||| 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verbosedry_runforce r   J/tmp/pip-install-ofl94hr3/setuptools/setuptools/_distutils/bcppcompiler.pyr   5   s    zBCPPCompiler.__init__Nc	             C   s  | j ||||||\}}	}}
}|p$g }|jd |rB|j| j n|j| j xD|	D ]:}y|| \}}W n tk
r   wVY nX tjj|}tjj|}| j	tjj
| |dkrqV|dkry| jdd||g W qV tk
r } zt|W Y d d }~X qVX qV|| jkrd}n|| jkr,d}nd}d| }y,| j| jg| |
 ||g | |g  W qV tk
r } zt|W Y d d }~X 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   sources
output_dirmacrosinclude_dirsdebugextra_preargsextra_postargsdependsobjectspp_optsbuildZcompile_optsobjsrcextmsgZ	input_optZ
output_optr   r   r   compileQ   sF    

(zBCPPCompiler.compilec       	      C   s   | j ||\}}| j||d}| j||r~|dg| }|r:y| j| jg|  W q tk
rz } zt|W Y d d }~X qX ntj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   r1   Zoutput_libnamer*   r-   target_langoutput_filenameZlib_argsr7   r   r   r   create_static_lib   s    zBCPPCompiler.create_static_libc              C   s  | j ||\}}| j|||\}}}|r8tjdt| |d k	rNtjj||}| j||r|t	j
krd}|	r~| jd d  }q| jd d  }n&d}|	r| jd d  }n| jd d  }|d krd}ntjj|\}}tjj|\}}tjj|d }tjj|d| }dg}x&|pg D ]}|jd||f  qW | jt||fd	|  ttjj|}|g}g }xF|D ]>}tjjtjj|\}}|d
kr|j| n
|j| qfW x$|D ]}|jdtjj|  qW |jd |j| |jd|g |jd x<|D ]4}| j|||	}|d kr(|j| n
|j| q W |jd |jd |jd|g |jd |j| |
r|
|d d< |r|j| | jtjj| y| j| jg|  W n, tk
r } zt|W Y d d }~X nX ntj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)) r9   Z_fix_lib_argsr   warnstrr!   r"   joinr;   r   Z
EXECUTABLEr   r   r   r   splitsplitextr%   r   executer	   mapr#   normcaser   find_library_filer$   r&   r   r   r   r-   ) r   Ztarget_descr1   r=   r*   	librarieslibrary_dirsruntime_library_dirsexport_symbolsr-   r.   r/   
build_tempr<   Zstartup_objZld_argsZdef_fileheadtailmodnamer6   temp_dircontentssymZobjects2	resourcesfilebaselr   libfiler7   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j|| j|}t jj|r>|S q>W q4W d S d S )NZ_dZ_bcpp)r!   r"   rB   r:   exists)	r   dirsr   r-   ZdlibZ	try_namesdirnamerX   r   r   r   rH   4  s    


zBCPPCompiler.find_library_filer   c             C   s   |d krd}g }x|D ]}t jjt jj|\}}|| jddg krTtd||f |rdt jj|}|dkr|jt jj|||  q|dkr|jt jj||d  q|jt jj||| j	  qW |S )Nr   z.rcz.resz"unknown file type '%s' (from '%s'))
r!   r"   rD   rG   src_extensionsr   basenamer   rB   obj_extension)r   Zsource_filenamesZ	strip_dirr*   Z	obj_namessrc_namerV   r6   r   r   r   object_filenamesN  s"     
zBCPPCompiler.object_filenamesc             C   s   | j d ||\}}}t||}dg| }	|d k	r>|	jd|  |rN||	d d< |r\|	j| |	j| | js~|d ks~t||r|r| jtjj	| y| j
|	 W n2 tk
r }
 zt|
 t|
W Y d d }
~
X 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/   _r2   Zpp_argsr7   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__compiler_typeZexecutablesr'   r(   r^   r`   Zstatic_lib_extensionshared_lib_extensionZstatic_lib_formatZshared_lib_formatZexe_extensionr   r8   r>   rY   rH   rb   rf   r   r   r   r   r      sJ   
  
 
B  
         
|
 
    r   )rj   r!   distutils.errorsr   r   r   r   r   distutils.ccompilerr   r   distutils.file_utilr	   distutils.dep_utilr
   	distutilsr   r   r   r   r   r   <module>   s   
