a :êdg™Pã@sìddlZddlZddlmZddlZddlmZddlmZddl m Z ddl m Z m Z mZmZddlmZddlmZmZmZmZddlZdd lmZdd lmZd aGd d „d e e ejƒZGdd„deƒZdd„Z e!dkrèe "e!¡dS)éN)ÚStringIO)Ú Distribution©Ú build_ext)Ú sysconfig)ÚTempdirManagerÚLoggingSilencerÚcopy_xxmodule_cÚfixup_build_ext)Ú Extension)Ú CompileErrorÚDistutilsPlatformErrorÚDistutilsSetupErrorÚUnknownFileError)Úsupport)Úassert_python_okFcsÞeZdZ‡fdd„Z‡fdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Ze ejdkd¡dd „ƒZe ejdkd¡d!d"„ƒZe ejdkd¡d#d$„ƒZd%d&„Z‡ZS)'ÚBuildExtTestCasecsptt|ƒ ¡| ¡|_ddl}|j|_| ¡|_ddlm }|j|_t   |j¡}|  ¡|  |jddd¡dS©Nrr)ÚsuperrÚsetUpÚmkdtempÚtmp_dirÚsiteÚ USER_BASEÚ old_user_baseÚdistutils.commandrrÚ change_cwdÚ __enter__Ú addCleanupÚ__exit__)Úselfrrr©Ú __class__©ú:/usr/local/lib/python3.9/distutils/tests/test_build_ext.pyrs    zBuildExtTestCase.setUpcs6ddl}|j|_ddlm}|j|_tt|ƒ ¡dSr)rrrrrrrÚtearDown)r rrr!r#r$r%-s  zBuildExtTestCase.tearDowncOst|i|¤ŽS©Nr)r ÚargsÚkwargsr#r#r$r4szBuildExtTestCase.build_extcCsöt ¡}|dur| d|¡t|jƒtj |jd¡}td|gƒ}t d|gdœƒ}|j|_ |  |¡}t |ƒ|j|_ |j|_tj}tjs’tƒt_z| ¡| ¡W|t_n|t_0trÊ| dt¡n t|ƒjat d|j›d¡}td|ƒdS) NúThe %r command is not foundz xxmodule.cÚxx©ÚnameZ ext_moduleszAlready 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_dirrr Ú build_libÚ build_tempÚsysÚstdoutÚverboserÚensure_finalizedÚrunÚALREADY_TESTEDÚtypeÚ__name__ÚtextwrapÚdedentr)r ÚcmdZxx_cZxx_extÚdistÚ old_stdoutÚcoder#r#r$Útest_build_ext7s0     zBuildExtTestCase.test_build_extc Cs¢tddiƒ}| |¡}tj}dt_ddlm}| d¡}d|d<z*| ¡W|t_|durb|d=qŒ||d<n |t_|dur‚|d=n||d<0| t |j ƒd¡dS)Nr,r*Zsunosr)Ú _config_varsZPy_ENABLE_SHAREDé) rrr5ÚplatformZdistutils.sysconfigrDÚgetr8Z assertGreaterÚlenÚ library_dirs)r r@r?ÚoldrDZold_varr#r#r$Útest_solaris_enable_sharedrs$      ü z+BuildExtTestCase.test_solaris_enable_sharedcCsªddl}tddiƒ}| |¡}dd„|jDƒ}| d|¡d|_tj |j d¡}tj |j d ¡}t  |¡t  |¡|  ¡| ||j ¡| ||j ¡| ||j¡dS) Nrr,r*cSsg|]\}}}|‘qSr#r#)Ú.0r,ZshortZlabler#r#r$Ú óz3BuildExtTestCase.test_user_site..ÚuserrEÚlibZinclude)rrrZ user_optionsÚassertInrOr/r0r1rÚmkdirr8rIÚrpathÚ include_dirs)r rr@r?ÚoptionsrPZinclr#r#r$Útest_user_site‡s   ÿ   zBuildExtTestCase.test_user_sitecCs‚tddgddg}td|dœƒ}| |¡}| ¡| ttf|j¡tddgddg}td|dœƒ}| |¡}| ¡| ¡dS)NÚfooÚxxxF©Zoptionalr*r+T)r rrr8Ú assertRaisesrr r9©r Úmodulesr@r?r#r#r$Útest_optional_extension£s  ÿ z(BuildExtTestCase.test_optional_extensioncCsîtddgddg}td|dœƒ}| |¡}| ¡t ¡}| tjj ¡D]}|  ||j ¡qHtjdd}| tjj ¡D]}|  ||j ¡qv| |¡}d |_ | ¡|  |j gd ¢¡| |¡}d tj |_| ¡|  d |j¡|  d |j¡| |¡}dtj |_| ¡|  |jddg¡t|ƒ}d|_| ¡|  |jgd¢¡| |¡}d|_| ¡|  |jddg¡| |¡}d|_| ¡|  |jddg¡| |¡}d|_| ¡|  |jg¡| |¡}d|_| ¡|  |jddg¡dS)NrWrXFrYr*r+rE)Z plat_specificzmy_lib, other_lib lastlib)Zmy_libZ other_libZlastlibzmy_lib_dir%sother_lib_dirZ my_lib_dirZ other_lib_dirzone%stwoÚoneÚtwoz one two,three)r^r_Zthreezone,two)r^Ú1)r_r`z1 2r`Ú2)r rrÚfinalize_optionsrZget_python_incÚsplitr/r0ÚpathseprQrTÚ librariesÚ assertEqualrIrSZ link_objectsZdefineZundefZ swig_opts)r r\r@r?Z py_includeÚpZplat_py_includer#r#r$Útest_finalize_options´sV           z&BuildExtTestCase.test_finalize_optionscCs0tƒ}| |¡}| ¡| t|jd¡ddg}| t|j|¡dg}| t|j|¡dg}| t|j|¡ddgdddœfg}| |¡|d }| |t¡| |j d¡|  t |d ƒ¡ddgddd dgd œfg}| t|j|¡d dg|d dd<| |¡| |d j dg¡| |d j d g¡dS)NrW)ÚbarrWri)zfoo-barÚ)úfoo.barrjrkrjri)ÚsourcesreÚsomerrm)r`raÚ3)rlrermÚmacros)r`ra)rnrErorn)rrrbrZrZcheck_extensions_listZassertIsInstancer rfreZ assertFalseÚhasattrZ undef_macrosZ define_macros)r r@r?ZextsÚextr#r#r$Útest_check_extensions_listüs8 ÿÿ   ÿ  z+BuildExtTestCase.test_check_extensions_listcCsHtddgddg}td|dœƒ}| |¡}| ¡| | ¡dg¡dS)NrWrXFrYr*r+)r rrr8rfZget_source_filesr[r#r#r$Útest_get_source_files,s  z&BuildExtTestCase.test_get_source_filescCs¤tddgddtddgddg}td|dœƒ}| |¡}| ¡| | |d j¡d ¡| | |d j¡d ¡| | |d ¡d g¡| | |d ¡dg¡dS)NrWZaaaFrYufööZuuur*r+rz foo(_d)?\..*rEuföö(_d)?\..*Z PyInit_fooZPyInitU_f_gkaa) r rrr8Z assertRegexZget_ext_filenamer,rfZget_export_symbolsr[r#r#r$Útest_unicode_module_names3sþ z*BuildExtTestCase.test_unicode_module_namescCs8tƒ}| |¡}d|_| ¡| ¡| |jd¡dS)NZunix)rrÚcompilerr8r9rf)r r@r?r#r#r$Útest_compiler_option@s  z%BuildExtTestCase.test_compiler_optionc Csdt ¡}|dur| d|¡| ¡}tj |d¡}| |d¡td|gdd}t d|gdœƒ}|  |¡}t |ƒ|  ¡|  t| ¡ƒd ¡tj |jd ¡|_tj |jd ¡|_tj | ¡¡}t ¡}t |¡z(d |_| ¡| ¡d }Wt |¡n t |¡0| tj |¡¡t d ¡} | | | ¡¡tj |¡} |  | |¡d |_d|_| ¡| ¡d }| tj |¡¡| | | ¡¡tj |¡} |  | |j¡| d¡} ddi| _ | !d¡} tj "| ¡d } |  | |j¡d |_tj | ¡¡}t ¡}t |¡z| !d¡} Wt |¡n t |¡0tj "| ¡d } tj "| ¡d} |  | d¡dS)Nr)zfoo.czvoid PyInit_foo(void) {} rWFrYr*r+rEZbuildZtemptrÚ EXT_SUFFIXÚbuild_pyrjriéÿÿÿÿ)#rr-r.rr/r0r1Z write_filer rrr r8rfrHZ get_outputsrr3r4ÚrealpathÚgetcwdÚchdirÚinplacer9Z assertTrueÚexistsrÚget_config_varÚendswithÚdirnameruÚget_finalized_commandr2Úget_ext_fullpathrc)r r?rZc_filerqr@Z other_tmp_dirZold_wdZso_fileZ ext_suffixZso_dirrxr0Zlastdirr#r#r$Útest_get_outputsKsh ÿ            z!BuildExtTestCase.test_get_outputscCs.t d¡}tƒ}| |¡}d|_ddi|j_ddg|j_t  ¡}tj   |ddd|¡}|  d¡}|  ||¡d |_tj   |d ¡|_tj   |d dd|¡}|  d¡}|  ||¡| d ¡}i|_d d g|j_|  d ¡}tj   |d d dd|¡}|  ||¡d|_|  d ¡}tj   |d dd|¡}|  ||¡dS)NrwrErjÚsrcZlxmlz lxml.htmlZetreez lxml.etreerZtmpdirrxZtwistedztwisted.runner.portmapZrunnerZportmap)rrrrr}Z distributionr2Zpackagesr/r{r0r1rƒrfr3r‚)r rqr@r?ÚcurdirZwantedr0rxr#r#r$Útest_ext_fullpaths6           ÿ  z"BuildExtTestCase.test_ext_fullpathÚdarwinztest only relevant for MacOSXcCs| dd¡dS)Nz==)Ú_try_compile_deployment_target©r r#r#r$Útest_deployment_target_default´sz/BuildExtTestCase.test_deployment_target_defaultcCs| t|jdd¡dS)Nú>z10.1)rZr r‰rŠr#r#r$Útest_deployment_target_too_low»sÿz/BuildExtTestCase.test_deployment_target_too_lowcCsVt d¡}|rRdd„| d¡Dƒ}|dd7<d dd„|Dƒ¡}| d |¡dS) NÚMACOSX_DEPLOYMENT_TARGETcSsg|] }t|ƒ‘qSr#)Úint)rLÚxr#r#r$rMÊrNzEBuildExtTestCase.test_deployment_target_higher_ok..Ú.ryrEcss|]}t|ƒVqdSr&)Ústr)rLÚir#r#r$Ú ÌrNzDBuildExtTestCase.test_deployment_target_higher_ok..ú<)rrrcr1r‰)r Ú deptargetr#r#r$Ú test_deployment_target_higher_okÂs  z1BuildExtTestCase.test_deployment_target_higher_okc Cs tj}| ¡t_| ttd|¡|dur>tj d¡rHtjd=n |tjd<tj |jd¡}t |dƒ$}|  t   d|¡¡Wdƒn1sŒ0Yt  d¡}ttt| d¡dd…ƒƒ}|dd…d krÖd |}nt|ƒdkrìd |}nd |}td |gd|fgd}td |gdœƒ}|j|_| |¡}|j|_|j|_z>tj} tjsVtƒt_z| ¡|  ¡W| t_n| t_0Wnt!yš| "d¡Yn0dS)NÚenvironrŽzdeptargetmodule.cÚwzî #include 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)Zextra_compile_argsr+z*Wrong deployment target during compilation)#r/r˜ÚcopyrÚsetattrrGr0r1rÚopenÚwriter=r>rrÚtupleÚmaprrcrHr rr2rr3r4r5r6rr7rr8r9r Zfail) r ÚoperatorÚtargetZ orig_environZ deptarget_cÚfpZ deptarget_extr@r?rAr#r#r$r‰ÏsT      ö&     ýþ  z/BuildExtTestCase._try_compile_deployment_target)r<Ú __module__Ú __qualname__rr%rrCrKrVr]rhrrrsrtrvr„r‡ÚunittestZ skipUnlessr5rFr‹rr—r‰Ú __classcell__r#r#r!r$rs*  ;H0  B'   rcseZdZ‡fdd„Z‡ZS)ÚParallelBuildExtTestCasecstƒj|i|¤Ž}d|_|S)NT)rrZparallel)r r'r(rr!r#r$rsz"ParallelBuildExtTestCase.build_ext)r<r¥r¦rr¨r#r#r!r$r©sr©cCs,t ¡}| t t¡¡| t t¡¡|Sr&)r§Z TestSuiteZaddTestZ makeSuiterr©)Zsuiter#r#r$Ú test_suitesrªÚ__main__)#r5r/Úiorr=Zdistutils.corerZdistutils.command.build_extrZ distutilsrZdistutils.tests.supportrrr r Zdistutils.extensionr Zdistutils.errorsr r rrr§ÚtestrZtest.support.script_helperrr:ZTestCaserr©rªr<Z run_unittestr#r#r#r$Ús2        þ