a �DOg.:�@spdZddlZddlmZmZmZmZmZddlm Z m Z ddl m Z ddl mZddlmZGdd �d e �ZdS) 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�eZdZdZdZiZdgZgd�ZeeZdZ dZ dZ dZ Z d Zdd d �Zddd�Zddd�Zddd�Zddd�Zd dd�Zd!dd�Zd S)"� BCPPCompilerzConcrete class that implements an interface to the Borland C/C++ compiler, as defined by the CCompiler abstract class. Zbcppz.c)z.ccz.cppz.cxxz.objz.libz.dllz%s%sz.exercCsnt�||||�d|_d|_d|_d|_gd�|_gd�|_gd�|_gd�|_ g|_ gd�|_ gd�|_ dS) Nz bcc32.exez ilink32.exeztlib.exe)�/tWMz/O2�/q�/g0)r z/Odrr)z/Tpd�/Gnr�/x)rrr)rrrz/r) r�__init__�cc�linker�libZpreprocess_options�compile_options�compile_options_debug�ldflags_shared�ldflags_shared_debugZldflags_static� ldflags_exe�ldflags_exe_debug)�self�verbose�dry_run�force�r �./usr/lib64/python3.9/distutils/bcppcompiler.pyr5s     zBCPPCompiler.__init__Nc  Cs�|�||||||�\}} }} } |p$g} | �d�|rB| �|j�n | �|j�| D�]>} z| | \}}Wnty~YqRYn0tj�|�}tj�| �} |� tj� | ��|dkr�qR|dk�rz|� dd| |g�WqRt �y}zt |��WYd}~qRd}~00qR||jv�rd}n||jv�r*d}nd}d| }z,|� |jg| | ||g||g�WqRt �y�}zt |��WYd}~qRd}~00qR| S) Nz-c�.res�.rcZbrcc32z-fo�z-P�-o)Z_setup_compile�append�extendrr�KeyError�os�path�normpath�mkpath�dirname�spawnrr� _c_extensions�_cpp_extensionsr)rZsources� output_dir�macros� include_dirs�debug� extra_preargs�extra_postargsZdepends�objects�pp_optsZbuildZ compile_opts�obj�src�ext�msgZ input_optZ output_optr r r!�compileQsT ��           ���  zBCPPCompiler.compilec Cs�|�||�\}}|j||d�}|�||�r�|dg|}|r:z|�|jg|�Wq�ty|}zt|��WYd}~q�d}~00n t�d|�dS)N)r1z/u�skipping %s (up-to-date)) �_fix_object_args�library_filename� _need_linkr.rrrr r4) rr7Zoutput_libnamer1r4� target_lang�output_filenameZlib_argsr<r r r!�create_static_lib�s �   zBCPPCompiler.create_static_libc Cs�|�||�\}}|�|||�\}}}|r8t�dt|��|durNtj�||�}|�||��r�|t j kr�d}| r~|j dd�}q�|j dd�}n&d}| r�|j dd�}n|jdd�}|dur�d}n�tj�|�\}}tj�|�\}}tj�|d�}tj�|d|�}dg}|�pgD]}|�d||f��q|�t||fd |�ttjj|�}|g}g}|D]>}tj�tj�|��\}}|d k�r�|�|�n |�|��q`|D]}|�d tj�|���q�|�d �|�|�|�d |g�|�d�|D]4}|�||| �}|du�r|�|�n |�|��q�|�d�|�d�|�d |g�|�d �|�|�| �rp| |dd�<| �r�|�| �|�tj�|��z|�|jg|�Wn.t�y�}zt|��WYd}~n d}~00n t�d|�dS)Nz7I don't know what to do with 'runtime_library_dirs': %sZc0w32Zc0d32r$rz%s.defZEXPORTSz %s=_%sz writing %sr"z/L%sz/L.�,z,,Zimport32Zcw32mtr>) r?Z _fix_lib_argsr �warn�strr)r*�joinrArZ EXECUTABLErrrr�split�splitextr-r&Zexecuter �mapr+�normcaser'�find_library_filer,r.rrrr4) rZ target_descr7rCr1Z librariesZ library_dirsZruntime_library_dirsZexport_symbolsr4r5r6Z build_temprBZ startup_objZld_argsZdef_file�head�tail�modnamer;Ztemp_dir�contentsZsymZobjects2Z resources�file�base�lr�libfiler<r r r!�link�s� ��  �              zBCPPCompiler.linkc Csr|r"|d}|d|d||f}n |d|f}|D]:}|D]0}tj�||�|��}tj�|�r:|Sq:q2dS)NZ_dZ_bcpp)r)r*rHr@�exists) r�dirsrr4ZdlibZ try_names�dir�namerUr r r!rM4s   zBCPPCompiler.find_library_filer$cCs�|dur d}g}|D]�}tj�tj�|��\}}||jddgvrRtd||f��|rbtj�|�}|dkr�|�tj�|||��q|dkr�|�tj�||d��q|�tj�|||j ��q|S)Nr$r#r"z"unknown file type '%s' (from '%s')) r)r*rJrL�src_extensionsr�basenamer&rH� obj_extension)rZsource_filenamesZ strip_dirr1Z obj_namesZsrc_namerSr;r r r!�object_filenamesNs$ �  �zBCPPCompiler.object_filenamesc Cs�|�d||�\}}}t||�}dg|} |dur>| �d|�|rN|| dd�<|r\| �|�| �|�|js~|dus~t||�r�|r�|�tj� |��z|� | �Wn4t y�} zt | �t | ��WYd} ~ n d} ~ 00dS)Nz cpp32.exer%r)Z_fix_compile_argsrr&r'rr r,r)r*r-r.r�printr) r�sourceZ output_filer2r3r5r6�_r8Zpp_argsr<r r r!� preprocessis& �     zBCPPCompiler.preprocess)rrr)NNNrNNN)NrN) NNNNNrNNNN)r)rr$)NNNNN)�__name__� __module__� __qualname__�__doc__Z compiler_typeZ executablesr/r0r[r]Zstatic_lib_extensionZshared_lib_extensionZstatic_lib_formatZshared_lib_formatZ exe_extensionrr=rDrVrMr^rbr r r r!r sX� � D� �  � �r )rfr)Zdistutils.errorsrrrrrZdistutils.ccompilerrrZdistutils.file_utilr Zdistutils.dep_utilr Z distutilsr r r r r r!�s