o
    JAf]Q  ã                   @   sü   d dl Z d dlZd dlm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mZmZmZ d dlZd d	lmZ d d
lmZ d dlmZ daG dd„ deeejƒZ G dd„ de ƒZ!dd„ Z"e#dkr|e $e#¡ dS dS )é    N)ÚStringIO)ÚDistribution©Ú	build_ext)Ú	sysconfig)ÚTempdirManagerÚLoggingSilencerÚcopy_xxmodule_cÚfixup_build_ext)Ú	Extension)ÚCompileErrorÚDistutilsPlatformErrorÚDistutilsSetupErrorÚUnknownFileError)Úsupport)Ú	os_helper)Úassert_python_okFc                       sÞ   e Zd Z‡ fdd„Z‡ f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dd„ Ze ejdkd¡dd „ ƒZe ejdkd¡d!d"„ ƒZe ejdkd¡d#d$„ ƒZd%d&„ Z‡  ZS )'ÚBuildExtTestCasec                    s|   t t| ƒ ¡  |  ¡ | _dd l}|j| _|  ¡ |_ddlm	} |j|_t
tjƒ| _t | j¡}| ¡  |  |jd d d ¡ d S ©Nr   r   )Úsuperr   ÚsetUpÚmkdtempÚtmp_dirÚsiteÚ	USER_BASEÚold_user_baseÚdistutils.commandr   Údictr   Ú_config_varsÚold_config_varsr   Ú
change_cwdÚ	__enter__Ú
addCleanupÚ__exit__)Úselfr   r   r    ©Ú	__class__© ú5/usr/lib/python3.10/distutils/tests/test_build_ext.pyr      s   

zBuildExtTestCase.setUpc                    sN   dd l }| j|_ddlm} | j|_tj ¡  tj | j	¡ t
t| ƒ ¡  d S r   )r   r   r   r   r   r   r   ÚclearÚupdater   r   r   ÚtearDown)r$   r   r   r%   r'   r(   r+   /   s   
zBuildExtTestCase.tearDownc                 O   s   t |i |¤ŽS ©Nr   )r$   ÚargsÚkwargsr'   r'   r(   r   8   s   zBuildExtTestCase.build_extc                 C   sö   t  ¡ }|d ur|  d| ¡ t| jƒ tj | jd¡}td|gƒ}t	d|gdœƒ}| j|_
|  |¡}t|ƒ | j|_| j|_tj}t jsItƒ t_z| ¡  | ¡  W |t_n|t_w tre|  dt ¡ nt| ƒjat d| j›d¡}td|ƒ d S )	NúThe %r command is not foundz
xxmodule.cÚxx©ÚnameZext_moduleszAlready tested in %sz
            tmp_dir = ai  

            import sys
            import unittest
            from test import support

            sys.path.insert(0, tmp_dir)
            import xx

            class Tests(unittest.TestCase):
                def test_xx(self):
                    for attr in ('error', 'foo', 'new', 'roj'):
                        self.assertTrue(hasattr(xx, attr))

                    self.assertEqual(xx.foo(2, 5), 7)
                    self.assertEqual(xx.foo(13,15), 28)
                    self.assertEqual(xx.new().demo(), None)
                    if support.HAVE_DOCSTRINGS:
                        doc = 'This is a template module just for instruction.'
                        self.assertEqual(xx.__doc__, doc)
                    self.assertIsInstance(xx.Null(), xx.Null)
                    self.assertIsInstance(xx.Str(), xx.Str)


            unittest.main()
        z-c)r   Úmissing_compiler_executableÚskipTestr	   r   ÚosÚpathÚjoinr   r   Úpackage_dirr   r
   Ú	build_libÚ
build_tempÚsysÚstdoutÚverboser   Úensure_finalizedÚrunÚALREADY_TESTEDÚtypeÚ__name__ÚtextwrapÚdedentr   )r$   ÚcmdZxx_cZxx_extÚdistÚ
old_stdoutÚcoder'   r'   r(   Útest_build_ext;   s4   




ÿzBuildExtTestCase.test_build_extc              	   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¡ d S )Nr2   r0   Zsunosr   )r   ZPy_ENABLE_SHAREDé   )r   r   r;   ÚplatformZdistutils.sysconfigr   Úgetr>   ZassertGreaterÚlenÚlibrary_dirs)r$   rF   rE   Úoldr   Zold_varr'   r'   r(   Útest_solaris_enable_sharedv   s$   



üz+BuildExtTestCase.test_solaris_enable_sharedc                 C   sª   dd l }tddiƒ}|  |¡}dd„ |jD ƒ}|  d|¡ d|_tj |j	d¡}tj |j	d	¡}t 
|¡ t 
|¡ | ¡  |  ||j¡ |  ||j¡ |  ||j¡ d S )
Nr   r2   r0   c                 S   s   g | ]\}}}|‘qS r'   r'   )Ú.0r2   ZshortZlabler'   r'   r(   Ú
<listcomp>‘   s    z3BuildExtTestCase.test_user_site.<locals>.<listcomp>ÚuserrJ   ÚlibZinclude)r   r   r   Zuser_optionsÚassertInrS   r5   r6   r7   r   Úmkdirr>   rN   ÚrpathÚinclude_dirs)r$   r   rF   rE   ÚoptionsrT   Zinclr'   r'   r(   Útest_user_site‹   s    
ÿ

zBuildExtTestCase.test_user_sitec                 C   s‚   t ddgddg}td|dœƒ}|  |¡}| ¡  |  ttf|j¡ t ddgddg}td|dœƒ}|  |¡}| ¡  | ¡  d S )NÚfooÚxxxF©Zoptionalr0   r1   T)r   r   r   r>   ÚassertRaisesr   r   r?   ©r$   ÚmodulesrF   rE   r'   r'   r(   Útest_optional_extension§   s   

ÿ
z(BuildExtTestCase.test_optional_extensionc                 C   sî  t ddgddg}td|dœƒ}|  |¡}| ¡  t ¡ }| tjj	¡D ]	}|  
||j¡ q$tjdd}| tjj	¡D ]	}|  
||j¡ q;|  |¡}d	|_| ¡  |  |jg d
¢¡ |  |¡}dtj	 |_| ¡  |  
d|j¡ |  
d|j¡ |  |¡}dtj	 |_| ¡  |  |jddg¡ t|ƒ}d|_| ¡  |  |jg d¢¡ |  |¡}d|_| ¡  |  |jddg¡ |  |¡}d|_| ¡  |  |jddg¡ |  |¡}d |_| ¡  |  |jg ¡ |  |¡}d|_| ¡  |  |jddg¡ d S )Nr[   r\   Fr]   r0   r1   rJ   )Zplat_specificzmy_lib, other_lib lastlib)Zmy_libZ	other_libZlastlibzmy_lib_dir%sother_lib_dirZ
my_lib_dirZother_lib_dirzone%stwoÚoneÚtwozone two,three)rb   rc   Zthreezone,two)rb   Ú1)rc   rd   z1 2rd   Ú2)r   r   r   Úfinalize_optionsr   Zget_python_incÚsplitr5   r6   ÚpathseprU   rX   Ú	librariesÚassertEqualrN   rW   Zlink_objectsZdefineZundefZ	swig_opts)r$   r`   rF   rE   Z
py_includeÚpZplat_py_includer'   r'   r(   Útest_finalize_options¸   sV   







z&BuildExtTestCase.test_finalize_optionsc                 C   s0  t ƒ }|  |¡}| ¡  |  t|jd¡ ddg}|  t|j|¡ dg}|  t|j|¡ dg}|  t|j|¡ ddgdddœfg}| |¡ |d	 }|  |t¡ |  |j	d¡ |  
t|d
ƒ¡ ddgddddgdœfg}|  t|j|¡ ddg|d	 d d< | |¡ |  |d	 jdg¡ |  |d	 jdg¡ d S )Nr[   )Úbarr[   rm   )zfoo-barÚ )úfoo.barrn   ro   rn   rm   )Úsourcesri   Úsomer   rq   )rd   re   Ú3)rp   ri   rq   Úmacros)rd   re   )rr   rJ   rs   rr   )r   r   rf   r^   r   Zcheck_extensions_listZassertIsInstancer   rj   ri   ZassertFalseÚhasattrZundef_macrosZdefine_macros)r$   rF   rE   ZextsÚextr'   r'   r(   Útest_check_extensions_list   s8   
ÿ
ÿ

ÿ
z+BuildExtTestCase.test_check_extensions_listc                 C   sH   t ddgddg}td|dœƒ}|  |¡}| ¡  |  | ¡ dg¡ d S )Nr[   r\   Fr]   r0   r1   )r   r   r   r>   rj   Zget_source_filesr_   r'   r'   r(   Útest_get_source_files0  s
   
z&BuildExtTestCase.test_get_source_filesc                 C   s¤   t ddgddt ddgddg}td|dœƒ}|  |¡}| ¡  |  | |d	 j¡d
¡ |  | |d j¡d¡ |  | |d	 ¡dg¡ |  | |d ¡dg¡ d S )Nr[   ZaaaFr]   u   fÃ¶Ã¶Zuuur0   r1   r   zfoo(_d)?\..*rJ   u   fÃ¶Ã¶(_d)?\..*Z
PyInit_fooZPyInitU_f_gkaa)	r   r   r   r>   ZassertRegexZget_ext_filenamer2   rj   Zget_export_symbolsr_   r'   r'   r(   Útest_unicode_module_names7  s   þ
z*BuildExtTestCase.test_unicode_module_namesc                 C   s8   t ƒ }|  |¡}d|_| ¡  | ¡  |  |jd¡ d S )NZunix)r   r   Úcompilerr>   r?   rj   )r$   rF   rE   r'   r'   r(   Útest_compiler_optionD  s   
z%BuildExtTestCase.test_compiler_optionc              	   C   sd  t  ¡ }|d ur|  d| ¡ |  ¡ }tj |d¡}|  |d¡ td|gdd}t	d|gdœƒ}|  
|¡}t|ƒ | ¡  |  t| ¡ ƒd	¡ tj | jd
¡|_tj | jd¡|_tj |  ¡ ¡}t ¡ }t |¡ zd	|_| ¡  | ¡ d }W t |¡ nt |¡ w |  tj |¡¡ t d¡}	|  | |	¡¡ tj |¡}
|  |
|¡ d|_d |_| ¡  | ¡ d }|  tj |¡¡ |  | |	¡¡ tj |¡}
|  |
|j¡ | d¡}ddi|_ | !d¡}tj "|¡d }|  ||j¡ d	|_tj |  ¡ ¡}t ¡ }t |¡ z| !d¡}W t |¡ nt |¡ w tj "|¡d }tj "|¡d }|  |d¡ d S )Nr/   zfoo.czvoid PyInit_foo(void) {}
r[   Fr]   r0   r1   rJ   ZbuildZtemptr   Ú
EXT_SUFFIXÚbuild_pyrn   rm   éÿÿÿÿ)#r   r3   r4   r   r5   r6   r7   Z
write_filer   r   r   r
   r>   rj   rM   Zget_outputsr   r9   r:   ÚrealpathÚgetcwdÚchdirÚinplacer?   Z
assertTrueÚexistsr   Úget_config_varÚendswithÚdirnamery   Úget_finalized_commandr8   Úget_ext_fullpathrg   )r$   rE   r   Zc_fileru   rF   Zother_tmp_dirZold_wdZso_fileZ
ext_suffixZso_dirr|   r6   Zlastdirr'   r'   r(   Útest_get_outputsO  sh   ÿ






z!BuildExtTestCase.test_get_outputsc                 C   s.  t  d¡}tƒ }|  |¡}d|_ddi|j_ddg|j_t 	¡ }tj
 |ddd| ¡}| d¡}|  ||¡ d	|_tj
 |d
¡|_tj
 |d
dd| ¡}| d¡}|  ||¡ | d¡}i |_ddg|j_| d¡}tj
 |d
ddd| ¡}|  ||¡ d|_| d¡}tj
 |ddd| ¡}|  ||¡ d S )Nr{   rJ   rn   ÚsrcZlxmlz	lxml.htmlZetreez
lxml.etreer   Ztmpdirr|   Ztwistedztwisted.runner.portmapZrunnerZportmap)r   rƒ   r   r   r   Zdistributionr8   Zpackagesr5   r   r6   r7   r‡   rj   r9   r†   )r$   ru   rF   rE   ÚcurdirZwantedr6   r|   r'   r'   r(   Útest_ext_fullpath‘  s6   





ÿ
z"BuildExtTestCase.test_ext_fullpathÚdarwinztest only relevant for MacOSXc                 C   s   |   dd ¡ d S )Nz==)Ú_try_compile_deployment_target©r$   r'   r'   r(   Útest_deployment_target_default¸  s   z/BuildExtTestCase.test_deployment_target_defaultc                 C   s   |   t| jdd¡ d S )Nú>z10.1)r^   r   r   rŽ   r'   r'   r(   Útest_deployment_target_too_low¿  s   ÿz/BuildExtTestCase.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)rQ   Úxr'   r'   r(   rR   Î  s    zEBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<listcomp>Ú.r}   rJ   c                 s   s    | ]}t |ƒV  qd S r,   )Ústr)rQ   Úir'   r'   r(   Ú	<genexpr>Ð  s   € zDBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<genexpr>ú<)r   rƒ   rg   r7   r   )r$   Ú	deptargetr'   r'   r(   Ú test_deployment_target_higher_okÆ  s   
ûz1BuildExtTestCase.test_deployment_target_higher_okc           
      C   sš  t j}| ¡ t _|  tt d|¡ |d u rt j d¡rt jd= n|t jd< t j | jd¡}t	|dƒ}| 
t d| ¡¡ W d   ƒ n1 sFw   Y  t d¡}ttt| d¡dd… ƒƒ}|d d… d	k rkd
| }nt|ƒdkrvd| }nd| }td|gd|f 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 )NÚenvironr’   zdeptargetmodule.cÚwzî                #include <AvailabilityMacros.h>

                int dummy;

                #if TARGET %s MAC_OS_X_VERSION_MIN_REQUIRED
                #else
                #error "Unexpected target"
                #endif

            r•   r   é   )é
   rŸ   z	%02d%01d0z
%02d%02d00z%02d0000rš   z-DTARGET=%s)Zextra_compile_argsr1   z*Wrong deployment target during compilation)#r5   rœ   Úcopyr"   ÚsetattrrL   r6   r7   r   ÚopenÚwriterC   rD   r   rƒ   ÚtupleÚmapr“   rg   rM   r   r   r8   r   r9   r:   r;   r<   r   r=   r   r>   r?   r   Zfail)
r$   ÚoperatorÚtargetZorig_environZdeptarget_cÚfpZdeptarget_extrF   rE   rG   r'   r'   r(   r   Ó  sZ   
€



öÿ



ýþ

ÿz/BuildExtTestCase._try_compile_deployment_target)rB   Ú
__module__Ú__qualname__r   r+   r   rI   rP   rZ   ra   rl   rv   rw   rx   rz   rˆ   r‹   ÚunittestZ
skipUnlessr;   rK   r   r‘   r›   r   Ú__classcell__r'   r'   r%   r(   r      s,    	;H0B'


r   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚParallelBuildExtTestCasec                    s   t ƒ j|i |¤Ž}d|_|S )NT)r   r   Zparallel)r$   r-   r.   r   r%   r'   r(   r     s   z"ParallelBuildExtTestCase.build_ext)rB   r©   rª   r   r¬   r'   r'   r%   r(   r­     s    r­   c                  C   s,   t  ¡ } |  t  t¡¡ |  t  t¡¡ | S r,   )r«   Z	TestSuiteZaddTestZ	makeSuiter   r­   )Zsuiter'   r'   r(   Ú
test_suite"  s   r®   Ú__main__)%r;   r5   Úior   rC   Zdistutils.corer   Zdistutils.command.build_extr   Z	distutilsr   Zdistutils.tests.supportr   r   r	   r
   Zdistutils.extensionr   Zdistutils.errorsr   r   r   r   r«   Útestr   Ztest.supportr   Ztest.support.script_helperr   r@   ZTestCaser   r­   r®   rB   Zrun_unittestr'   r'   r'   r(   Ú<module>   s8    þ    ÿ