B
    Ûö›\TL  ã               @   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
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)ÚsupportFc                   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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| ƒ ¡  |  ¡ | _tjtjd d … f| _tj | j¡ dd l	}|j
| _|  ¡ |_
ddlm} |j
|_
t ¡ | _| j ¡  |  | jjd d d ¡ d S )Nr   )r   )Úsuperr   ÚsetUpÚmkdtempÚtmp_dirÚsysÚpathÚsys_pathÚappendÚsiteÚ	USER_BASEÚold_user_baseÚdistutils.commandr   r   Ztemp_cwdÚ	__enter__Ú
addCleanupÚ__exit__)Úselfr   r   )Ú	__class__© ú/lib/python3.7/distutils/tests/test_build_ext.pyr      s    



zBuildExtTestCase.setUpc                s`   t  d¡ | jd t_| jd tjd d …< dd l}| j|_ddlm	} | j|_t
t| ƒ ¡  d S )NÚxxr   é   )r   )r   Zunloadr   r   r   r   r   r   r   r   r   r   ÚtearDown)r    r   r   )r!   r"   r#   r&   /   s    
zBuildExtTestCase.tearDownc             O   s
   t ||ŽS )N)r   )r    ÚargsÚkwargsr"   r"   r#   r   :   s    zBuildExtTestCase.build_extc       	      C   sr  t  ¡ }|d k	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 d |t_X trÄ|  dt ¡ n
t| ƒjadd l}xdD ]}|  t||ƒ¡ qÜW |  | dd	¡d
¡ |  | dd¡d¡ |  | ¡  ¡ d ¡ t jrJd}|  |j |¡ |  !| "¡ |j"¡ |  !| #¡ |j#¡ d S )NzThe %r command is not foundz
xxmodule.cr$   )ÚnameÚext_moduleszAlready tested in %sr   )ÚerrorÚfooÚnewZrojé   é   é   é   é   é   z/This is a template module just for instruction.)$r   Úmissing_compiler_executableÚskipTestr   r   Úosr   Újoinr
   r   Úpackage_dirr   r	   Ú	build_libÚ
build_tempr   ÚstdoutÚverboser   Úensure_finalizedÚrunÚALREADY_TESTEDÚtypeÚ__name__r$   Ú
assertTrueÚhasattrÚassertEqualr,   r-   ZdemoZHAVE_DOCSTRINGSÚ__doc__ÚassertIsInstanceZNullZStr)	r    ÚcmdZxx_cZxx_extÚdistÚ
old_stdoutr$   ÚattrÚdocr"   r"   r#   Útest_build_ext=   sB    



zBuildExtTestCase.test_build_extc          	   C   s„   t ddiƒ}|  |¡}tj}dt_ddlm} | d¡}d|d< z| ¡  W d |t_|d krd|d= n||d< X |  t	|j
ƒd¡ d S )Nr)   r$   Zsunosr   )Ú_config_varsZPy_ENABLE_SHAREDr%   )r   r   r   ÚplatformZdistutils.sysconfigrM   Úgetr=   ZassertGreaterÚlenÚlibrary_dirs)r    rH   rG   ÚoldrM   Zold_varr"   r"   r#   Útest_solaris_enable_sharedi   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>„   s    z3BuildExtTestCase.test_user_site.<locals>.<listcomp>Úuserr%   ÚlibZinclude)r   r   r   Zuser_optionsÚassertInrV   r6   r   r7   r   Úmkdirr=   rQ   ÚrpathÚinclude_dirs)r    r   rH   rG   ZoptionsrW   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 )Nr,   ÚxxxF)Úoptionalr$   )r)   r*   T)r
   r   r   r=   ÚassertRaisesr   r   r>   )r    ÚmodulesrH   rG   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 ¡ }x$| tjj	¡D ]}|  
||j¡ qJW tjdd}x$| tjj	¡D ]}|  
||j¡ q|W |  |¡}d	|_| ¡  |  |jd
ddg¡ |  |¡}dtj	 |_| ¡  |  
d|j¡ |  
d|j¡ |  |¡}dtj	 |_| ¡  |  |jddg¡ t|ƒ}d|_| ¡  |  |jdddg¡ |  |¡}d|_| ¡  |  |jddg¡ |  |¡}d|_| ¡  |  |jddg¡ |  |¡}d |_| ¡  |  |jg ¡ |  |¡}d|_| ¡  |  |jddg¡ d S )Nr,   r]   F)r^   r$   )r)   r*   r%   )Zplat_specificzmy_lib, other_lib lastlibZmy_libZ	other_libZlastlibzmy_lib_dir%sother_lib_dirZ
my_lib_dirZother_lib_dirzone%stwoÚoneÚtwozone two,threeZthreezone,two)rb   Ú1)rc   rd   z1 2rd   Ú2)r
   r   r   Úfinalize_optionsr   Zget_python_incÚsplitr6   r   ÚpathseprX   r[   Ú	librariesrD   rQ   rZ   Zlink_objectsZdefineZundefZ	swig_opts)r    r`   rH   rG   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,   rl   )zfoo-barÚ )zfoo.barrm   zfoo.barrm   rl   )Úsourcesri   Úsomer   ro   )rd   re   Ú3)rn   ri   ro   Úmacros)rd   re   )rp   r%   rq   rp   )r   r   rf   r_   r   Zcheck_extensions_listrF   r
   rD   ri   ZassertFalserC   Zundef_macrosZdefine_macros)r    rH   rG   ZextsÚextr"   r"   r#   Útest_check_extensions_listó   s2    



z+BuildExtTestCase.test_check_extensions_listc             C   sH   t ddgddg}td|dœƒ}|  |¡}| ¡  |  | ¡ dg¡ d S )Nr,   r]   F)r^   r$   )r)   r*   )r
   r   r   r=   rD   Zget_source_files)r    r`   rH   rG   r"   r"   r#   Útest_get_source_files#  s
    
z&BuildExtTestCase.test_get_source_filesc             C   s8   t ƒ }|  |¡}d|_| ¡  | ¡  |  |jd¡ d S )NZunix)r   r   Úcompilerr=   r>   rD   )r    rH   rG   r"   r"   r#   Útest_compiler_option*  s    
z%BuildExtTestCase.test_compiler_optionc          	   C   sP  t  ¡ }|d k	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 d t |¡ X |  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 d t |¡ X tj "|¡d }tj "|¡d }|  |d¡ d S )NzThe %r command is not foundzfoo.czvoid PyInit_foo(void) {}
r,   F)r^   r$   )r)   r*   r%   ZbuildZtemptr   Ú
EXT_SUFFIXÚbuild_pyrm   rl   éÿÿÿÿ)#r   r4   r5   r   r6   r   r7   Z
write_filer
   r   r   r	   r=   rD   rP   Zget_outputsr   r9   r:   ÚrealpathÚgetcwdÚchdirÚinplacer>   rB   Úexistsr   Úget_config_varÚendswithÚdirnameru   Úget_finalized_commandr8   Úget_ext_fullpathrg   )r    rG   r   Zc_filerr   rH   Zother_tmp_dirZold_wdZso_fileZ
ext_suffixZso_dirrx   r   Zlastdirr"   r"   r#   Útest_get_outputs5  sf    






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   r%   rm   ÚsrcZlxmlz	lxml.htmlZetreez
lxml.etreer   Ztmpdirrx   Ztwistedztwisted.runner.portmapZrunnerZportmap)r   r   r   r   r}   Zdistributionr8   Zpackagesr6   r{   r   r7   rƒ   rD   r9   r‚   )r    rr   rH   rG   ÚcurdirZwantedr   rx   r"   r"   r#   Útest_ext_fullpathw  s4    







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   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)rT   Úxr"   r"   r#   rU   ´  s    zEBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<listcomp>Ú.ry   r%   c             s   s   | ]}t |ƒV  qd S )N)Ústr)rT   Ú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   sn  t j}| ¡ t _|  tt d|¡ |d kr>t j d¡rHt jd= n
|t jd< t j | jd¡}t	|dƒ}| 
t d| ¡¡ W d Q R X t d¡}ttt| d¡dd… ƒƒ}|d	 d
k r¾d| }nd| }td|gd|f gd}td|gdœƒ}| j|_|  |¡}| j|_| j|_y8tj}	tjs(tƒ t_z| ¡  | ¡  W d |	t_X W n  t k
rh   |  !d¡ Y nX 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.   r%   é
   z	%02d%01d0z
%02d%02d00r•   z-DTARGET=%s)Zextra_compile_args)r)   r*   z*Wrong deployment target during compilation)"r6   r—   Úcopyr   ÚsetattrrO   r   r7   r   ÚopenÚwriteÚtextwrapÚdedentr   r   ÚtupleÚmaprŽ   rg   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_extrH   rG   rI   r"   r"   r#   r‰   ¹  sJ    






z/BuildExtTestCase._try_compile_deployment_target)rA   Ú
__module__Ú__qualname__r   r&   r   rL   rS   r\   ra   rk   rs   rt   rv   r„   r‡   ÚunittestZ
skipUnlessr   rN   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||Ž}d|_|S )NT)r   r   Zparallel)r    r'   r(   r   )r!   r"   r#   r   þ  s    z"ParallelBuildExtTestCase.build_ext)rA   r¥   r¦   r   r¨   r"   r"   )r!   r#   r©   ü  s   r©   c              C   s,   t  ¡ } |  t  t¡¡ |  t  t¡¡ | S )N)r§   Z	TestSuiteZaddTestZ	makeSuiter   r©   )Zsuiter"   r"   r#   Ú
test_suite  s    rª   Ú__main__)!r   r6   Ú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§   Ztestr   r?   ZTestCaser   r©   rª   rA   Zrun_unittestr"   r"   r"   r#   Ú<module>   s,      e