3 \3�@shddlZddlZddlmZddlmZddlmZddlm Z ddd�Z Gd d �d e�Z d d d �Z dS)�N)�Command)�DistutilsExecError)�customize_compiler)�logz.cz.cxx)�czc++c @s�eZdZdZd>d?d@dAdBdCdDdEdFg Zdd�Zdd�Zdd�Zd d!�Zd"d#�Z d$d%�Z d&d'�Z d(d)�Z d*d+�Z dGd-d.�ZdHd/d0�ZdId1d2�ZdJd3d4�ZdKd5d6�ZdLd8d9�Zdddgfd:d;�ZdMd � r�����)�LANG_EXT�open�write�close)r&�body�headers�lang�filename�file�headerr'r'r(�_gen_temp_sourcefileks       zconfig._gen_temp_sourcefilecCs<|j|||�}d}|jj||g�|jj|||d�||fS)Nz _configtest.i)r!)rCr%�extendr Z preprocess)r&r=r>r!r?�src�outr'r'r(� _preprocessxs zconfig._preprocesscCs\|j|||�}|jr"t|d|�|jj|g�\}|jj||g�|jj|g|d�||fS)Nzcompiling '%s':)r!)rCr$� dump_filer Zobject_filenamesr%rD�compile)r&r=r>r!r?rE�objr'r'r(�_compileszconfig._compilec Csr|j||||�\}}tjjtjj|��d} |jj|g| |||d�|jjdk r\| |jj} |jj | �||| fS)Nr)r"r#Z target_lang) rKr-�path�splitext�basenamer Zlink_executableZ exe_extensionr%�append) r&r=r>r!r"r#r?rErJ�progr'r'r(�_link�s    z config._linkc GsX|s|j}g|_tjddj|��x0|D](}ytj|�Wq(tk rNYq(Xq(WdS)Nz removing: %s� )r%r�info�joinr-�remove�OSError)r&� filenamesr@r'r'r(�_clean�s z config._cleanrc CsRddlm}|j�d}y|j||||�Wn|k rDd}YnX|j�|S)Nr)� CompileErrorTF)r4rYr5rGrX)r&r=r>r!r?rY�okr'r'r(�try_cpp�s  zconfig.try_cppc Csx|j�|j||||�\}}t|t�r0tj|�}t|�}d} x&|j�} | dkrPP|j| �r>d} Pq>W|j �|j �| S)NF�T) r5rGr*r+�rerIr:�readline�searchr<rX) r&�patternr=r>r!r?rErFrA�match�liner'r'r(� search_cpp�s    zconfig.search_cppc Csdddlm}|j�y|j||||�d}Wn|k rDd}YnXtj|rRdpTd�|j�|S)Nr)rYTFzsuccess!zfailure.)r4rYr5rKrrSrX)r&r=r>r!r?rYrZr'r'r(� try_compile�s  zconfig.try_compilec Cspddlm}m}|j�y|j||||||�d} Wn||fk rPd} YnXtj| r^dp`d�|j�| S)Nr)rY� LinkErrorTFzsuccess!zfailure.)r4rYrer5rQrrSrX) r&r=r>r!r"r#r?rYrerZr'r'r(�try_link�s   zconfig.try_linkc Cs�ddlm}m}|j�y.|j||||||�\} } } |j| g�d} Wn||tfk rdd} YnXtj| rrdptd�|j �| S)Nr)rYreTFzsuccess!zfailure.) r4rYrer5rQZspawnrrrSrX) r&r=r>r!r"r#r?rYrerErJZexerZr'r'r(�try_run�s   zconfig.try_runrc Cst|j�g}|r|jd|�|jd�|r<|jd|�n|jd|�|jd�dj|�d}|j|||||�S)Nz int %s ();z int main () {z %s();z %s;�}r7)r5rOrTrf) r&�funcr>r!r"r#ZdeclZcallr=r'r'r(� check_funcs   zconfig.check_funccCs |j�|jd|||g||�S)Nzint main (void) { })r5rf)r&Zlibraryr#r>r!Zother_librariesr'r'r(� check_lib6s  zconfig.check_libcCs|jd|g|d�S)Nz /* No body */)r=r>r!)r[)r&rBr!r#r?r'r'r(� check_headerDs zconfig.check_header)rNr )r Nr )r r r)rrr)rrr)rrr)rrr)rNr)rNr)NNNr)NNNr)NNr)NNNNr)NNNNr)NNNNrr)NNr)�__name__� __module__� __qualname__Z descriptionZ user_optionsr)r/r0r5rCrGrKrQrXr[rcrdrfrgrjrkrlr'r'r'r(rsT         rc CsJ|dkrtjd|�n tj|�t|�}ztj|j��Wd|j�XdS)Nz%s)rrSr:�readr<)r@�headrAr'r'r(rHNs rH)N) r-r]Zdistutils.corerZdistutils.errorsrZdistutils.sysconfigrZ distutilsrr9rrHr'r'r'r(� s     ;