o
    c.:                     @   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g d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.
    bcppz.c)z.ccz.cppz.cxxz.objz.libz.dllz%s%sz.exer   c                 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)r   __init__cclinkerlibpreprocess_optionscompile_optionscompile_options_debugldflags_sharedldflags_shared_debugldflags_staticldflags_exeldflags_exe_debug)selfverbosedry_runforce r#   O/opt/certbot/lib/python3.10/site-packages/setuptools/_distutils/bcppcompiler.pyr   5   s   




zBCPPCompiler.__init__Nc	                 C   sn  |  ||||||\}}	}}
}|pg }|d |r!|| j n|| j |	D ]}z|| \}}W n	 ty<   Y q)w tj|}tj|}| 	tj
| |dkrWq)|dkrxz| dd||g W n tyv } zt|d }~ww q)|| jv rd}n
|| jv rd}nd}d| }z| | jg| |
 ||g | |g  W q) ty } zt|d }~ww |	S )	Nz-c.res.rcbrcc32z-fo z-P-o)_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buildcompile_optsobjsrcextmsg	input_opt
output_optr#   r#   r$   compileQ   s^   



zBCPPCompiler.compilec           	   
   C   s   |  ||\}}| j||d}| ||r;|dg| }|r	 z| | jg|  W d S  ty: } zt|d }~ww td| d S )N)r7   z/uskipping %s (up-to-date))	_fix_object_argslibrary_filename
_need_linkr3   r   r   r   r   r:   )	r   r>   output_libnamer7   r:   target_langoutput_filenamelib_argsrE   r#   r#   r$   create_static_lib   s   zBCPPCompiler.create_static_libc               
   C   s  |  ||\}}| |||\}}}|rtdt| |d ur'tj||}| ||ra|t	j
krGd}|	r?| jd d  }n| jd d  }nd}|	rS| jd d  }n| jd d  }|d u rad}n?tj|\}}tj|\}}tj|d }tj|d| }dg}|pg D ]}|d||f  q| t||fd	|  ttjj|}|g}g }|D ]}tjtj|\}}|d
kr|| q|| q|D ]}|dtj|  q|d || |d|g |d |D ]}| |||	}|d u r|| q|| q|d |d |d|g |d || |
r2|
|d d< |r:|| | tj| z| | jg|  W d S  ty` } zt|d }~ww td| d S )Nz7I don't know what to do with 'runtime_library_dirs': %sc0w32c0d32r(   r   z%s.defEXPORTSz  %s=_%sz
writing %sr%   z/L%sz/L.,z,,import32cw32mtrI   ) rJ   _fix_lib_argsr   warnstrr.   r/   joinrL   r   
EXECUTABLEr   r   r   r   splitsplitextr2   r+   executer	   mapr0   normcaser,   find_library_filer1   r3   r   r   r   r:   ) r   target_descr>   rO   r7   	librarieslibrary_dirsruntime_library_dirsexport_symbolsr:   r;   r<   
build_temprN   startup_objld_argsdef_fileheadtailmodnamerD   temp_dircontentssymobjects2	resourcesfilebaselr   libfilerE   r#   r#   r$   link   s   









zBCPPCompiler.linkc           	      C   sr   |r|d }|d |d ||f}n|d |f}|D ]}|D ]}t j|| |}t j|r5|    S qqd S )N_d_bcpp)r.   r/   r[   rK   exists)	r   dirsr   r:   dlib	try_namesdirnamerw   r#   r#   r$   rb   4  s   
zBCPPCompiler.find_library_filer(   c                 C   s   |d u rd}g }|D ]V}t jt j|\}}|| jddg vr)td||f |r1t j|}|dkrB|t j|||  q
|dkrS|t j||d  q
|t j||| j	  q
|S )Nr(   r&   r%   z"unknown file type '%s' (from '%s'))
r.   r/   r^   ra   src_extensionsr   basenamer+   r[   obj_extension)r   source_filenames	strip_dirr7   	obj_namessrc_nameru   rD   r#   r#   r$   object_filenamesN  s$   zBCPPCompiler.object_filenamesc              
   C   s   |  d ||\}}}t||}dg| }	|d ur|	d|  |r'||	d d< |r.|	| |	| | js?|d u s?t||rg|rJ| tj	| z| 
|	 W d S  tyf }
 zt|
 t|
d }
~
ww d S )Nz	cpp32.exer)   r   )_fix_compile_argsr   r+   r,   r"   r
   r1   r.   r/   r2   r3   r   printr   )r   sourceoutput_filer8   r9   r;   r<   _r?   pp_argsrE   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_typeexecutablesr4   r5   r   r   static_lib_extensionshared_lib_extensionstatic_lib_formatshared_lib_formatexe_extensionr   rH   rQ   rx   rb   r   r   r#   r#   r#   r$   r      sZ    

D

 


r   )r   r.   distutils.errorsr   r   r   r   r   distutils.ccompilerr   r   distutils.file_utilr	   distutils.dep_utilr
   	distutilsr   r   r#   r#   r#   r$   <module>   s    