o
    NZŽhX  ã                   @   sh  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZmZm Z  d d	l!m"Z" d dl#Z$d dl%Z%d dl&Z&d d
l'm(Z( ddl)m*Z+ e& ,¡ dd„ ƒZ-e j.dd„ ƒZ/e j.dd„ ƒZ0e&j1 2d¡G dd„ deƒƒZ3G dd„ de3ƒZ4dS )é    N)Ú	sysconfig©Ú	build_ext)ÚDistribution)ÚCompileErrorÚDistutilsPlatformErrorÚDistutilsSetupErrorÚUnknownFileError)Ú	Extension)Úmissing_compiler_executable)ÚTempdirManagerÚcopy_xxmodule_cÚfixup_build_ext)ÚStringIO)Úsupporté   )Úpy39c                 c   s˜    | j }| ¡ |_t |j¡|_ddlm} tj	}| ¡ t_	tj	|_	|j d V  W d   ƒ n1 s3w   Y  |t_	||_	t
jdkrJt d¡ d S d S )Nr   r   Úcygwinr   )ÚinstanceÚmkdtempÚtmp_dirÚpathÚPathÚtmp_pathZdistutils.commandr   ÚsiteÚ	USER_BASEÚsysÚplatformÚtimeÚsleep)ÚrequestÚselfr   Zorig_user_base© r"   úY/var/www/auris/lib/python3.10/site-packages/setuptools/_distutils/tests/test_build_ext.pyÚuser_site_dir$   s    €

ÿ
ÿr$   c              
   c   sœ    t  | ¡> t| |ƒ }t  |¡ d V  W d   ƒ n1 s w   Y  W d   ƒ n1 s/w   Y  W d   ƒ d S W d   ƒ d S 1 sGw   Y  d S ©N)Úimport_helperZCleanImportÚextension_redirectÚDirsOnSysPath)Únamer   Únew_pathr"   r"   r#   Úsafe_extension_import=   s   €ÿ€ÿÿ"ÿr+   c                 c   s     t  ¡ dkrtj dkr|V  dS t |¡ tj | ¡}W d  ƒ n1 s'w   Y  tj	 
|j¡}tjdd}tj	 |tj	 
|¡¡}t |j|¡ |V  dS )zÁ
    Tests will fail to tear down an extension module if it's been imported.

    Before importing, copy the file to a temporary directory that won't
    be cleaned up. Yield the new path.
    ÚWindowsr   NZdeleteme)Úprefix)r   Úsystemr   r&   r(   Ú	importlibÚutilÚ	find_specÚosr   ÚbasenameÚoriginÚtempfiler   ÚjoinÚshutilÚcopy)Úmodr   ÚspecÚfilenameZ	trash_dirÚdestr"   r"   r#   r'   E   s   €ÿ
r'   c                   @   sø   e Zd Zdd„ Zej ddg¡dd„ ƒZedd„ ƒZ	d	d
„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zej d¡ej d ¡d!d"„ ƒƒZej d¡ej d ¡d#d$„ ƒƒZej d¡ej d ¡d%d&„ ƒƒZd'd(„ Zd)S )*ÚTestBuildExtc                 O   s   t |i |¤ŽS r%   r   )r!   ÚargsÚkwargsr"   r"   r#   r   \   s   zTestBuildExt.build_extÚcopy_soFc                 C   sz  t ƒ  t| jƒ tj | jd¡}td|gƒ}tjdkrW|s+td|gdgdgdgd}n,tjdkrWdd	„ t	 
d
¡D ƒ}t|dd„ d}t |d d¡ td|gdgdgdgd}td|gdœƒ}| j|_|  |¡}t|ƒ | j|_| j|_tj}tjs~tƒ t_z| ¡  | ¡  W |t_n|t_w td| jƒ |  |¡ W d   ƒ n1 s¦w   Y  tjdkr¹|r»t d¡ d S d S d S )Nz
xxmodule.cÚxxÚwin32ú/usr/libÚz)Úlibrary_dirsÚ	librariesZruntime_library_dirsÚlinuxc                 S   s   h | ]}t j |¡’qS r"   )r2   r   Úrealpath)Ú.0r)   r"   r"   r#   Ú	<setcomp>o   s    ÿz.TestBuildExt.test_build_ext.<locals>.<setcomp>z/usr/lib*/libz.so*c                 S   s   t | ƒS r%   )Úlen)Zlib_pathr"   r"   r#   Ú<lambda>r   s    z-TestBuildExt.test_build_ext.<locals>.<lambda>)Úkeyéÿÿÿÿz/tmp/libxx_z.soú/tmpZxx_z©r)   Zext_modules)r   r   r   r2   r   r6   r
   r   r   ÚglobÚiglobÚsortedr7   Úcopyfiler   Úpackage_dirr   r   Ú	build_libÚ
build_tempÚstdoutr   Úverboser   Úensure_finalizedÚrunr+   Ú_test_xxÚunlink)r!   r@   Zxx_cZxx_extZlibz_soÚdistÚcmdÚ
old_stdoutr"   r"   r#   Útest_build_ext_   sZ   

û
ÿû

ÿÿzTestBuildExt.test_build_extc                 C   s  dd l }dD ]	}t||ƒsJ ‚q| dd¡dksJ ‚| dd¡dks$J ‚| ¡  ¡ d u s.J ‚tjr:d	}|j|ks:J ‚t| 	¡ |j	ƒsDJ ‚t| 
¡ |j
ƒsNJ ‚tjd
krŠtjdd|jgdd}dd l}| |¡ dd„ | d¡D ƒ}| s„| |¡ d|vr€d|vs‚J ‚d S d|v sŒJ ‚d S d S )Nr   )ÚerrorÚfooÚnewZrojé   é   é   é   é   é   z/This is a template module just for instruction.rG   Úreadelfz-dT)Úuniversal_newlinesc                 S   s@   g | ]}d |v sd|v r|  ¡ d dd…   d¡D ]}|‘qqS )ZRPATHZRUNPATHre   r   rN   ú:)Úsplit)rI   ÚlineÚrpathr"   r"   r#   Ú
<listcomp>ª   s    ÿýz)TestBuildExt._test_xx.<locals>.<listcomp>Ú
rC   z
/usr/lib64rO   )rA   Úhasattrrc   rd   Údemor   ZHAVE_DOCSTRINGSÚ__doc__Ú
isinstanceZNullÚStrr   r   Ú
subprocessÚcheck_outputÚ__file__Úpprintrn   )r@   rA   ÚattrÚdocZ
so_headersr{   Zrpathsr"   r"   r#   r\   “   s4   
ÿ
þ
ízTestBuildExt._test_xxc              	   C   s¢   t ddiƒ}|  |¡}tj}dt_ddlm} | d¡}d|d< z| ¡  W |t_|d u r1|d= n||d< n|t_|d u rA|d= w ||d< w t|j	ƒdksOJ ‚d S )Nr)   rA   Úsunosr   )Ú_config_varsÚPy_ENABLE_SHAREDT)
r   r   r   r   Údistutils.sysconfigr   ÚgetrZ   rK   rE   )r!   r^   r_   Úoldr   Zold_varr"   r"   r#   Útest_solaris_enable_shared¹   s$   



üz'TestBuildExt.test_solaris_enable_sharedc                 C   sª   dd l }tddiƒ}|  |¡}dd„ |jD ƒ}d|v sJ ‚d|_tj |jd¡}tj |jd	¡}t 	|¡ t 	|¡ | 
¡  ||jv sEJ ‚||jv sLJ ‚||jv sSJ ‚d S )
Nr   r)   rA   c                 S   s   g | ]\}}}|‘qS r"   r"   )rI   r)   ZshortÚlabelr"   r"   r#   rq   Ö   s    z/TestBuildExt.test_user_site.<locals>.<listcomp>ÚuserTÚlibÚinclude)r   r   r   Zuser_optionsr†   r2   r   r6   r   ÚmkdirrZ   rE   rp   Úinclude_dirs)r!   r   r^   r_   Úoptionsr‡   Zinclr"   r"   r#   Útest_user_siteÏ   s   


zTestBuildExt.test_user_sitec                 C   s¦   t ddgddg}td|dœƒ}|  |¡}| ¡  t ttf¡ | ¡  W d   ƒ n1 s/w   Y  t ddgddg}td|dœƒ}|  |¡}| ¡  | ¡  d S )Nrc   ÚxxxF©ÚoptionalrA   rP   T)	r
   r   r   rZ   ÚpytestÚraisesr	   r   r[   ©r!   Úmodulesr^   r_   r"   r"   r#   Útest_optional_extensionë   s   

ÿ
z$TestBuildExt.test_optional_extensionc                 C   sö  t ddgddg}td|dœƒ}|  |¡}| ¡  t ¡ }| tjj	¡D ]	}||j
v s-J ‚q$tjdd}| tjj	¡D ]	}||j
v sDJ ‚q;|  |¡}d	|_| ¡  |jg d
¢ksZJ ‚|  |¡}dtj	› d|_| ¡  d|jv srJ ‚d|jv syJ ‚|  |¡}dtj	› d|_| ¡  |jddgks“J ‚t|ƒ}d|_| ¡  |jg d¢ks§J ‚|  |¡}d|_| ¡  |jddgks¼J ‚|  |¡}d|_| ¡  |jddgksÑJ ‚|  |¡}d |_| ¡  |jg ksäJ ‚|  |¡}d|_| ¡  |jddgksùJ ‚d S )Nrc   r   FrŽ   rA   rP   T)Zplat_specificzmy_lib, other_lib lastlib)Zmy_libZ	other_libZlastlibZ
my_lib_dirZother_lib_dirÚoneÚtwozone two,three)r•   r–   Úthreezone,two)r•   Ú1)r–   r˜   z1 2r˜   Ú2)r
   r   r   Úfinalize_optionsr   Zget_python_incrn   r2   r   ÚpathseprŠ   rF   rE   rp   Zlink_objectsZdefineZundefZ	swig_opts)r!   r“   r^   r_   Z
py_includeÚpZplat_py_includer"   r"   r#   Útest_finalize_optionsû   sV   







z"TestBuildExt.test_finalize_optionsc                 C   sä  t ƒ }|  |¡}| ¡  t t¡ | d¡ W d   ƒ n1 s!w   Y  ddg}t t¡ | |¡ W d   ƒ n1 s?w   Y  dg}t t¡ | |¡ W d   ƒ n1 s\w   Y  dg}t t¡ | |¡ W d   ƒ n1 syw   Y  ddgdddœfg}| |¡ |d	 }t|tƒs˜J ‚|j	dksŸJ ‚t
|d
ƒr¦J ‚ddgddddgdœfg}t t¡ | |¡ W d   ƒ n1 sÈw   Y  ddg|d	 d d< | |¡ |d	 jdgksæJ ‚|d	 jdgksðJ ‚d S )Nrc   )Úbarrc   rž   )zfoo-barÚ )úfoo.barrŸ   r    rŸ   rž   )ÚsourcesrF   Úsomer   r¢   )r˜   r™   Ú3)r¡   rF   r¢   Úmacros)r˜   r™   )r£   r   r¤   r£   )r   r   rš   r   r‘   r   Zcheck_extensions_listrv   r
   rF   rs   Zundef_macrosZdefine_macros)r!   r^   r_   ÚextsÚextr"   r"   r#   Útest_check_extensions_listC  sN   
ÿÿÿÿ
üþÿÿ
z'TestBuildExt.test_check_extensions_listc                 C   sH   t ddgddg}td|dœƒ}|  |¡}| ¡  | ¡ dgks"J ‚d S )Nrc   r   FrŽ   rA   rP   )r
   r   r   rZ   Zget_source_filesr’   r"   r"   r#   Útest_get_source_files  s
   
z"TestBuildExt.test_get_source_filesc                 C   s¬   t ddgddt ddgddg}td|dœƒ}|  |¡}| ¡  t d	| |d
 j¡¡s.J ‚t d| |d j¡¡s<J ‚| |d
 ¡dgksHJ ‚| |d ¡dgksTJ ‚d S )Nrc   ÚaaaFrŽ   u   fÃ¶Ã¶ÚuuurA   rP   zfoo(_d)?\..*r   u   fÃ¶Ã¶(_d)?\..*r   Ú
PyInit_fooÚPyInitU_f_1gaa)	r
   r   r   rZ   ÚreÚsearchZget_ext_filenamer)   Úget_export_symbolsr’   r"   r"   r#   Útest_unicode_module_names†  s   þ
z&TestBuildExt.test_unicode_module_namesc                 C   sl   t ddgƒt ddgƒg}td|dœƒ}|  |¡}| ¡  | |d ¡dgks(J ‚| |d	 ¡d
gks4J ‚d S )Nzfoo.__init__r©   u   fÃ¶Ã¶.__init__rª   rA   rP   r   r«   r   r¬   )r
   r   r   rZ   r¯   r’   r"   r"   r#   Útest_export_symbols__init__“  s   

þ
z(TestBuildExt.test_export_symbols__init__c                 C   s8   t ƒ }|  |¡}d|_| ¡  | ¡  |jdksJ ‚d S )NÚunix)r   r   ÚcompilerrZ   r[   )r!   r^   r_   r"   r"   r#   Útest_compiler_option   s   
z!TestBuildExt.test_compiler_optionc              	   C   sF  t ƒ  |  ¡ }tj |d¡}|  |d¡ td|gdd}td|gdœƒ}|  |¡}t	|ƒ | 
¡  t| ¡ ƒdks;J ‚tj | jd	¡|_tj | jd
¡|_tj |  ¡ ¡}t ¡ }t |¡ zd|_| ¡  | ¡ d }W t |¡ nt |¡ w tj |¡sJ ‚t d¡}	| |	¡sJ ‚tj |¡}
|
|ks™J ‚d|_d |_| ¡  | ¡ d }tj |¡s±J ‚| |	¡s¸J ‚tj |¡}
|
|jksÅJ ‚| d¡}ddi|_| d¡}tj |¡d }||jksãJ ‚d|_tj |  ¡ ¡}t ¡ }t |¡ z| d¡}W t |¡ nt |¡ w tj |¡d }tj |¡d }|dks!J ‚d S )Nzfoo.czvoid PyInit_foo(void) {}
rc   FrŽ   rA   rP   r   ÚbuildZtemptTr   Ú
EXT_SUFFIXÚbuild_pyrŸ   rž   rN   )r   r   r2   r   r6   Ú
write_filer
   r   r   r   rZ   rK   Zget_outputsr   rV   rW   rH   ÚgetcwdÚchdirÚinplacer[   Úexistsr   Úget_config_varÚendswithÚdirnamer³   Úget_finalized_commandrU   Úget_ext_fullpathrn   )r!   r   Zc_filer¦   r^   r_   Zother_tmp_dirZold_wdZso_fileZ
ext_suffixZso_dirr·   r   Zlastdirr"   r"   r#   Útest_get_outputs«  s`   






zTestBuildExt.test_get_outputsc                 C   s.  t  d¡}tƒ }|  |¡}d|_ddi|j_ddg|j_t 	¡ }tj
 |ddd| ¡}| d¡}||ks6J ‚d	|_tj
 |d
¡|_tj
 |d
dd| ¡}| d¡}||ksWJ ‚| d¡}i |_ddg|j_| d¡}tj
 |d
ddd| ¡}||ks|J ‚d|_| d¡}tj
 |ddd| ¡}||ks•J ‚d S )Nr¶   TrŸ   ÚsrcZlxmlz	lxml.htmlÚetreez
lxml.etreeFZtmpdirr·   Ztwistedztwisted.runner.portmapÚrunnerZportmap)r   r½   r   r   r»   ÚdistributionrU   Úpackagesr2   r¹   r   r6   rÁ   rV   rÀ   )r!   r¦   r^   r_   ÚcurdirÚwantedr   r·   r"   r"   r#   Útest_ext_fullpathê  s2   






zTestBuildExt.test_ext_fullpathzplatform.system() != "Darwin"Zsave_envc                 C   s   |   dd ¡ d S )Nz==)Ú_try_compile_deployment_target©r!   r"   r"   r#   Útest_deployment_target_default  s   z+TestBuildExt.test_deployment_target_defaultc                 C   s<   t  t¡ |  dd¡ W d   ƒ d S 1 sw   Y  d S )Nú>z10.1)r   r‘   r   rË   rÌ   r"   r"   r#   Útest_deployment_target_too_low  s   "ÿz+TestBuildExt.test_deployment_target_too_lowc                 C   sZ   t  d¡}|r+dd„ | d¡D ƒ}|d  d7  < d dd„ |D ƒ¡}|  d	|¡ d S d S )
NÚMACOSX_DEPLOYMENT_TARGETc                 S   s   g | ]}t |ƒ‘qS r"   )Úint)rI   Úxr"   r"   r#   rq   (  s    zATestBuildExt.test_deployment_target_higher_ok.<locals>.<listcomp>Ú.rN   r   c                 s   s    | ]}t |ƒV  qd S r%   )Ústr)rI   Úir"   r"   r#   Ú	<genexpr>*  s   € z@TestBuildExt.test_deployment_target_higher_ok.<locals>.<genexpr>ú<)r   r½   rn   r6   rË   )r!   Ú	deptargetr"   r"   r#   Ú test_deployment_target_higher_ok  s   
ûz-TestBuildExt.test_deployment_target_higher_okc                 C   sR  |d u rt j d¡rt jd= n|t jd< tj dt d|› d¡i| j¡ t	 
d¡}ttt| d¡dd… ƒƒ}|d d… dk rCd	}nt|ƒdkrLd
}nd}|j|Ž }td| jd gd|› gd}td|gdœƒ}| j|_|  |¡}| j|_| j|_ztj}tjs†tƒ t_z| ¡  | ¡  W |t_W d S |t_w  ty¨   |   d¡ Y d S w )NrÐ   zdeptargetmodule.czt                    #include <AvailabilityMacros.h>

                    int dummy;

                    #if TARGET z˜ MAC_OS_X_VERSION_MIN_REQUIRED
                    #else
                    #error "Unexpected target"
                    #endif

                    rÓ   r   re   )é
   rÚ   z{:02}{:01}0z{:02}{:02}00z	{:02}0000rØ   z	-DTARGET=)Zextra_compile_argsrP   z*Wrong deployment target during compilation)!r2   Úenvironr‚   Újaracor   rµ   ÚtextwrapÚdedentr   r   r½   ÚtupleÚmaprÑ   rn   rK   Úformatr
   r   r   rU   r   rV   rW   r   rX   r   rY   r   rZ   r[   r   Zfail)r!   ÚoperatorÚtargetÚtmplZdeptarget_extr^   r_   r`   r"   r"   r#   rË   -  sR   €
ûÿò



ý

ÿz+TestBuildExt._try_compile_deployment_targetN)Ú__name__Ú
__module__Ú__qualname__r   r   ÚmarkZparametrizera   Ústaticmethodr\   r„   rŒ   r”   r   r§   r¨   r°   r±   r´   rÂ   rÊ   ZskipifÚusefixturesrÍ   rÏ   rÙ   rË   r"   r"   r"   r#   r=   Z   s6    
3
%H<?
%




r=   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚTestParallelBuildExtc                    s   t ƒ j|i |¤Ž}d|_|S )NT)Úsuperr   Zparallel)r!   r>   r?   r   ©Ú	__class__r"   r#   r   q  s   zTestParallelBuildExt.build_ext)rå   ræ   rç   r   Ú__classcell__r"   r"   rí   r#   rë   p  s    rë   )5Ú
contextlibrQ   r/   Zos.pathr2   r   r­   r7   r   rx   r   r5   rÝ   r   Ú	distutilsr   Zdistutils.command.build_extr   Zdistutils.corer   Zdistutils.errorsr   r   r   r	   Zdistutils.extensionr
   Zdistutils.testsr   Zdistutils.tests.supportr   r   r   Úior   Zjaraco.pathrÜ   r   r   Útestr   Úcompatr   r&   Zfixturer$   Úcontextmanagerr+   r'   rè   rê   r=   rë   r"   r"   r"   r#   Ú<module>   sN    



    