B
    18™\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   Útemp_cwdÚ	__enter__Ú
addCleanupÚ__exit__)Úselfr   r   )Ú	__class__© úb/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/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   Ú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demoÚHAVE_DOCSTRINGSÚ__doc__ÚassertIsInstanceZNullÚ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%   Úsunosr   )Ú_config_varsÚPy_ENABLE_SHAREDr&   )r   r   r   ÚplatformÚdistutils.sysconfigrR   Úgetr?   ÚassertGreaterÚlenÚlibrary_dirs)r!   rL   rK   ÚoldrR   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+   ÚshortZlabler#   r#   r$   ú
<listcomp>„   s    z3BuildExtTestCase.test_user_site.<locals>.<listcomp>Úuserr&   ÚlibÚinclude)r   r   r   Úuser_optionsÚassertInr_   r8   r   r9   r   Úmkdirr?   rY   ÚrpathÚinclude_dirs)r!   r   rL   rK   Úoptionsr`   Ú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!   ÚmodulesrL   rK   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.   rj   F)rk   r%   )r+   r,   r&   )Ú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,threeÚthreezone,two)rp   Ú1)rq   rs   z1 2rs   Ú2)r
   r   r   Úfinalize_optionsr   Úget_python_incÚsplitr8   r   Úpathseprc   rf   Ú	librariesrF   rY   re   Zlink_objectsZdefineZundefÚ	swig_opts)r!   rm   rL   rK   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.   r}   )zfoo-barÚ )zfoo.barr~   zfoo.barr~   r}   )Úsourcesry   Úsomer   r€   )rs   rt   Ú3)r   ry   r€   Úmacros)rs   rt   )r   r&   r‚   r   )r   r   ru   rl   r   Zcheck_extensions_listrI   r
   rF   ry   ÚassertFalserE   Úundef_macrosÚdefine_macros)r!   rL   rK   Ú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.   rj   F)rk   r%   )r+   r,   )r
   r   r   r?   rF   Úget_source_files)r!   rm   rL   rK   r#   r#   r$   Útest_get_source_files#  s
    
z&BuildExtTestCase.test_get_source_filesc             C   s8   t ƒ }|  |¡}d|_| ¡  | ¡  |  |jd¡ d S )NÚunix)r   r   Úcompilerr?   r@   rF   )r!   rL   rK   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)rk   r%   )r+   r,   r&   ÚbuildZtemptr   Ú
EXT_SUFFIXÚbuild_pyr~   r}   éÿÿÿÿ)#r   r6   r7   r   r8   r   r9   Ú
write_filer
   r   r   r	   r?   rF   rX   Úget_outputsr   r;   r<   ÚrealpathÚgetcwdÚchdirÚinplacer@   rD   Úexistsr   Úget_config_varÚendswithÚdirnamerŒ   Úget_finalized_commandr:   Úget_ext_fullpathrw   )r!   rK   r   Zc_filer‡   rL   Zother_tmp_dirZold_wdZso_fileZ
ext_suffixZso_dirr   r   Ú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 )Nr   r&   r~   ÚsrcZlxmlz	lxml.htmlÚetreez
lxml.etreer   Útmpdirr   Ztwistedztwisted.runner.portmapÚrunnerZportmap)r   r™   r   r   r—   Údistributionr:   Úpackagesr8   r•   r   r9   r   rF   r;   rœ   )r!   r‡   rL   rK   ÚcurdirÚwantedr   r   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)rl   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)r\   Úxr#   r#   r$   r^   ´  s    zEBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<listcomp>Ú.r‘   r&   c             s   s   | ]}t |ƒV  qd S )N)Ústr)r\   Úir#   r#   r$   ú	<genexpr>¶  s    zDBuildExtTestCase.test_deployment_target_higher_ok.<locals>.<genexpr>ú<)r   r™   rw   r9   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   r0   r&   é
   z	%02d%01d0z
%02d%02d00r¶   z-DTARGET=%s)Úextra_compile_args)r+   r,   z*Wrong deployment target during compilation)"r8   r¸   Úcopyr   ÚsetattrrV   r   r9   r   ÚopenÚwriteÚtextwrapÚdedentr   r™   ÚtupleÚmapr¯   rw   r
   r   r:   r   r;   r<   r   r=   r   r>   r   r?   r@   r   Úfail)
r!   ÚoperatorÚtargetZorig_environZdeptarget_cÚfpZdeptarget_extrL   rK   rM   r#   r#   r$   rª   ¹  sJ    






z/BuildExtTestCase._try_compile_deployment_target)rC   Ú
__module__Ú__qualname__r   r(   r   rP   r[   ri   rn   r|   rˆ   rŠ   r   rŸ   r¨   ÚunittestÚ
skipUnlessr   rT   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   Úparallel)r!   r)   r*   r   )r"   r#   r$   r   þ  s    z"ParallelBuildExtTestCase.build_ext)rC   rÈ   rÉ   r   rÌ   r#   r#   )r"   r$   rÍ   ü  s   rÍ   c              C   s,   t  ¡ } |  t  t¡¡ |  t  t¡¡ | S )N)rÊ   Ú	TestSuiteÚaddTestÚ	makeSuiter   rÍ   )Úsuiter#   r#   r$   Ú
test_suite  s    rÓ   Ú__main__)!r   r8   Úior   rÀ   Údistutils.corer   Zdistutils.command.build_extr   Ú	distutilsr   Zdistutils.tests.supportr   r   r   r	   Údistutils.extensionr
   Zdistutils.errorsr   r   r   r   rÊ   Útestr   rA   ÚTestCaser   rÍ   rÓ   rC   Úrun_unittestr#   r#   r#   r$   Ú<module>   s,      e