a
    åze™P  ã                   @   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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 )é    N)ÚStringIO)ÚDistribution©Ú	build_ext)Ú	sysconfig)ÚTempdirManagerÚLoggingSilencerÚcopy_xxmodule_cÚfixup_build_ext)Ú	Extension)ÚCompileErrorÚDistutilsPlatformErrorÚDistutilsSetupErrorÚUnknownFileError)Úsupport)Ú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                    sp   t t| ƒ ¡  |  ¡ | _dd l}|j| _|  ¡ |_ddlm	} |j|_t
 | j¡}| ¡  |  |jd d d ¡ d S ©Nr   r   )Úsuperr   ÚsetUpÚmkdtempÚtmp_dirÚsiteÚ	USER_BASEÚold_user_baseÚdistutils.commandr   r   Ú
change_cwdÚ	__enter__Ú
addCleanupÚ__exit__)Úselfr   r   r   ©Ú	__class__© ú4/usr/lib/python3.9/distutils/tests/test_build_ext.pyr      s    

zBuildExtTestCase.setUpc                    s6   dd l }| j|_ddlm} | j|_tt| ƒ ¡  d S r   )r   r   r   r   r   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   4   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s’tƒ t_z| ¡  | ¡  W |t_n|t_0 trÊ|  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_ext7   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 rb|d= qŒ||d< n |t_|d u r‚|d= n||d< 0 |  t	|j
ƒd¡ d S )Nr,   r*   Zsunosr   )Ú_config_varsZPy_ENABLE_SHAREDé   )r   r   r5   ÚplatformZdistutils.sysconfigrD   Úgetr8   ZassertGreaterÚlenÚlibrary_dirs)r    r@   r?   ÚoldrD   Zold_varr#   r#   r$   Útest_solaris_enable_sharedr   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   r,   r*   c                 S   s   g | ]\}}}|‘qS r#   r#   )Ú.0r,   ZshortZlabler#   r#   r$   Ú
<listcomp>   ó    z3BuildExtTestCase.test_user_site.<locals>.<listcomp>ÚuserrE   ÚlibZinclude)r   r   r   Zuser_optionsÚassertInrO   r/   r0   r1   r   Úmkdirr8   rI   ÚrpathÚinclude_dirs)r    r   r@   r?   ÚoptionsrP   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optionalr*   r+   T)r   r   r   r8   ÚassertRaisesr   r   r9   ©r    Úmodulesr@   r?   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¡ qHtjdd}| tjj	¡D ]}|  
||j¡ qv|  |¡}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 )NrW   rX   FrY   r*   r+   rE   )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)r^   r_   Zthreezone,two)r^   Ú1)r_   r`   z1 2r`   Ú2)r   r   r   Úfinalize_optionsr   Zget_python_incÚsplitr/   r0   ÚpathseprQ   rT   Ú	librariesÚassertEqualrI   rS   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&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 )NrW   )ÚbarrW   ri   )zfoo-barÚ )úfoo.barrj   rk   rj   ri   )Úsourcesre   Úsomer   rm   )r`   ra   Ú3)rl   re   rm   Úmacros)r`   ra   )rn   rE   ro   rn   )r   r   rb   rZ   r   Zcheck_extensions_listZassertIsInstancer   rf   re   ZassertFalseÚhasattrZundef_macrosZdefine_macros)r    r@   r?   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 )NrW   rX   FrY   r*   r+   )r   r   r   r8   rf   Zget_source_filesr[   r#   r#   r$   Útest_get_source_files,  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 )NrW   ZaaaFrY   u   fÃ¶Ã¶Zuuur*   r+   r   zfoo(_d)?\..*rE   u   fÃ¶Ã¶(_d)?\..*Z
PyInit_fooZPyInitU_f_gkaa)	r   r   r   r8   ZassertRegexZget_ext_filenamer,   rf   Zget_export_symbolsr[   r#   r#   r$   Útest_unicode_module_names3  s    þ
z*BuildExtTestCase.test_unicode_module_namesc                 C   s8   t ƒ }|  |¡}d|_| ¡  | ¡  |  |jd¡ d S )NZunix)r   r   Úcompilerr8   r9   rf   )r    r@   r?   r#   r#   r$   Útest_compiler_option@  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 |¡ 0 |  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 |¡ 0 tj "|¡d }tj "|¡d }|  |d¡ d S )Nr)   zfoo.czvoid PyInit_foo(void) {}
rW   FrY   r*   r+   rE   ZbuildZtemptr   Ú
EXT_SUFFIXÚbuild_pyrj   ri   éÿÿÿÿ)#r   r-   r.   r   r/   r0   r1   Z
write_filer   r   r   r
   r8   rf   rH   Zget_outputsr   r3   r4   ÚrealpathÚgetcwdÚchdirÚinplacer9   Z
assertTrueÚexistsr   Úget_config_varÚendswithÚdirnameru   Úget_finalized_commandr2   Úget_ext_fullpathrc   )r    r?   r   Zc_filerq   r@   Zother_tmp_dirZold_wdZso_fileZ
ext_suffixZso_dirrx   r0   Zlastdirr#   r#   r$   Útest_get_outputsK  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 )Nrw   rE   rj   ÚsrcZlxmlz	lxml.htmlZetreez
lxml.etreer   Ztmpdirrx   Ztwistedztwisted.runner.portmapZrunnerZportmap)r   r   r   r   r}   Zdistributionr2   Zpackagesr/   r{   r0   r1   rƒ   rf   r3   r‚   )r    rq   r@   r?   ÚcurdirZwantedr0   rx   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)rZ   r   r‰   rŠ   r#   r#   r$   Útest_deployment_target_too_low»  s    ÿz/BuildExtTestCase.test_deployment_target_too_lowc                 C   sV   t  d¡}|rRdd„ | d¡D ƒ}|d  d7  < d dd„ |D ƒ¡}|  d	|¡ d S )
NÚMACOSX_DEPLOYMENT_TARGETc                 S   s   g | ]}t |ƒ‘qS r#   )Úint)rL   Úxr#   r#   r$   rM   Ê  rN   zEBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<listcomp>Ú.ry   rE   c                 s   s   | ]}t |ƒV  qd S r&   )Ústr)rL   Úir#   r#   r$   Ú	<genexpr>Ì  rN   zDBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<genexpr>ú<)r   r   rc   r1   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¡rHt jd= n
|t jd< t j | jd¡}t	|dƒ$}| 
t d| ¡¡ W d   ƒ n1 sŒ0    Y  t d¡}ttt| d¡dd… ƒƒ}|d d… d	k rÖd
| }nt|ƒdkrìd| }nd| }td|gd|f gd}td|gdœƒ}| j|_|  |¡}| j|_| j|_z>tj}	tjsVtƒ t_z| ¡  |  ¡  W |	t_n|	t_0 W n t!yš   |  "d¡ Y n0 d S )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_argsr+   z*Wrong deployment target during compilation)#r/   r˜   Úcopyr   ÚsetattrrG   r0   r1   r   ÚopenÚwriter=   r>   r   r   ÚtupleÚmapr   rc   rH   r   r   r2   r   r3   r4   r5   r6   r   r7   r   r8   r9   r   Zfail)
r    ÚoperatorÚtargetZorig_environZdeptarget_cÚfpZdeptarget_extr@   r?   rA   r#   r#   r$   r‰   Ï  sT    




ö&



ýþ

z/BuildExtTestCase._try_compile_deployment_target)r<   Ú
__module__Ú__qualname__r   r%   r   rC   rK   rV   r]   rh   rr   rs   rt   rv   r„   r‡   ÚunittestZ
skipUnlessr5   rF   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)r<   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__)#r5   r/   Úior   r=   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.support.script_helperr   r:   ZTestCaser   r©   rª   r<   Zrun_unittestr#   r#   r#   r$   Ú<module>   s2   þ    