3 Ävhu3ã@s„ddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed ƒWnek r´eZYnXe d ƒdd l mZd d„ZdZdZdZej dkrîdZn>ej!dk�r,yddl"Z"e#e"dƒZZWnek �r*YnXdd„Z$dd„Z%Gdd„deƒZe�s^ej!dk�rjd!dd„Z&ndZd"dd„Z&dd „Z'dS)#éN)Ú build_ext)Ú copy_file)Ú new_compiler)Úcustomize_compilerÚget_config_var)ÚDistutilsError)Úlog)ÚLibrary)ÚsixzCython.Compiler.MainÚLDSHARED)Ú _config_varsc CsZtjdkrNtjƒ}z$dtd<dtd<dtd<t|ƒWdtjƒtj|ƒXnt|ƒdS)NÚdarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr z -dynamiclibÚCCSHAREDz.dylibÚSO)ÚsysÚplatformÚ _CONFIG_VARSÚcopyrÚclearÚupdate)ÚcompilerZtmp©rú/usr/lib/python3.6/build_ext.pyÚ_customize_compiler_for_shlibs  rFZsharedr TÚntÚRTLD_NOWcCs tr|SdS)NÚ)Ú have_rtld)ÚsrrrÚ>srcCs>x8dd„tjƒDƒD]"\}}}d|kr*|S|dkr|SqWdS)z;Return the file extension for an abi3-compliant Extension()css |]}|dtjkr|VqdS)éN)ÚimpZ C_EXTENSION)Ú.0rrrrú Csz"get_abi3_suffix..z.abi3z.pydN)r!Z get_suffixes)ÚsuffixÚ_rrrÚget_abi3_suffixAs r&c@sveZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zddd„ZdS)rcCs.|jd}|_tj|ƒ||_|r*|jƒdS)z;Build extensions in build directory, then copy if --inplacerN)ZinplaceÚ _build_extÚrunÚcopy_extensions_to_source)ÚselfZ old_inplacerrrr(Ks  z build_ext.runc Cs®|jdƒ}xž|jD]”}|j|jƒ}|j|ƒ}|jdƒ}dj|dd…ƒ}|j|ƒ}tj j|tj j |ƒƒ}tj j|j |ƒ} t | ||j |jd�|jr|j|pžtj|dƒqWdS)NÚbuild_pyÚ.é)ÚverboseÚdry_runTéÿÿÿÿ)Úget_finalized_commandÚ extensionsÚget_ext_fullnameÚnameÚget_ext_filenameÚsplitÚjoinZget_package_dirÚosÚpathÚbasenameÚ build_librr.r/Ú _needs_stubÚ write_stubÚcurdir) r*r+ÚextÚfullnameÚfilenameZmodpathÚpackageZ package_dirZ dest_filenameZ src_filenamerrrr)Ss       z#build_ext.copy_extensions_to_sourcecCs¶tj||ƒ}||jkr²|j|}tjo4t|dƒo4tƒ}|r^tdƒ}|dt|ƒ …}|tƒ}t |t ƒr†t j j |ƒ\}}|jj|tƒStr²|jr²t j j|ƒ\}}t j j|d|ƒS|S)NZpy_limited_apiÚ EXT_SUFFIXzdl-)r'r5Úext_mapr ZPY3Úgetattrr&Ú_get_config_var_837ÚlenÚ isinstancer r8r9ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ use_stubsÚ_links_to_dynamicr6r7)r*r@rAr?Zuse_abi3Zso_extÚfnÚdrrrr5is"       zbuild_ext.get_ext_filenamecCs tj|ƒd|_g|_i|_dS)N)r'Úinitialize_optionsrJÚshlibsrD)r*rrrrQ~s zbuild_ext.initialize_optionscCs2tj|ƒ|jpg|_|j|jƒdd„|jDƒ|_|jrB|jƒx|jD]}|j|jƒ|_qJWxÌ|jD]Â}|j}||j |<||j |j dƒd<|jr |j |ƒp¢d}|o¶t o¶t |tƒ }||_||_|j|ƒ}|_tjjtjj|j|ƒƒ}|oø||jk�r|jj|ƒ|rht rhtj|jkrh|jjtjƒqhWdS)NcSsg|]}t|tƒr|‘qSr)rHr )r"r?rrrú ˆsz.build_ext.finalize_options..r,r-Fr0)r'Úfinalize_optionsr2Zcheck_extensions_listrRÚsetup_shlib_compilerr3r4Ú _full_namerDr6Úlinks_to_dynamicrMrHr rNr<r5Ú _file_namer8r9Údirnamer7r;Ú library_dirsÚappendr>Úruntime_library_dirs)r*r?r@ZltdÚnsrAZlibdirrrrrT„s,       zbuild_ext.finalize_optionscCsît|j|j|jd�}|_t|ƒ|jdk r8|j|jƒ|jdk rbx|jD]\}}|j ||ƒqJW|j dk r†x|j D]}|j |ƒqtW|j dk rœ|j |j ƒ|jdk r²|j|jƒ|jdk rÈ|j|jƒ|jdk rÞ|j|jƒtj|ƒ|_dS)N)rr/Úforce)rrr/r^rJrZ include_dirsZset_include_dirsZdefineZ define_macroZundefZundefine_macroÚ librariesZ set_librariesrZZset_library_dirsZrpathZset_runtime_library_dirsZ link_objectsZset_link_objectsÚlink_shared_objectÚ__get__)r*rr4ÚvalueZmacrorrrrU¡s(             zbuild_ext.setup_shlib_compilercCst|tƒr|jStj||ƒS)N)rHr Úexport_symbolsr'Úget_export_symbols)r*r?rrrrd¼s zbuild_ext.get_export_symbolsc Cs\|jƒ|j}z@t|tƒr"|j|_tj||ƒ|jrL|jdƒj }|j ||ƒWd||_XdS)Nr+) Z_convert_pyx_sources_to_langrrHr rJr'Úbuild_extensionr<r1r;r=)r*r?Z _compilerÚcmdrrrreÁs   zbuild_ext.build_extensioncsPtjdd„|jDƒƒ‰dj|jjdƒdd …dgƒ‰t‡‡fdd„|jDƒƒS) z?Return true if 'ext' links to a dynamic lib in the same packagecSsg|] }|j‘qSr)rV)r"ÚlibrrrrSÓsz.build_ext.links_to_dynamic..r,Nr-rc3s|]}ˆ|ˆkVqdS)Nr)r"Zlibname)ÚlibnamesÚpkgrrr#Õsz-build_ext.links_to_dynamic..r0)ÚdictÚfromkeysrRr7rVr6Úanyr_)r*r?r)rhrirrWÎs zbuild_ext.links_to_dynamiccCstj|ƒ|jƒS)N)r'Ú get_outputsÚ_build_ext__get_stubs_outputs)r*rrrrm×szbuild_ext.get_outputscs6‡fdd„ˆjDƒ}tj|ˆjƒƒ}tdd„|DƒƒS)Nc3s0|](}|jrtjjˆjf|jjdƒžŽVqdS)r,N)r<r8r9r7r;rVr6)r"r?)r*rrr#Ýsz0build_ext.__get_stubs_outputs..css|]\}}||VqdS)Nr)r"ÚbaseZfnextrrrr#ãs)r2Ú itertoolsÚproductÚ!_build_ext__get_output_extensionsÚlist)r*Z ns_ext_basesZpairsr)r*rZ__get_stubs_outputsÚs  zbuild_ext.__get_stubs_outputsccs"dVdV|jdƒjrdVdS)Nz.pyz.pycr+z.pyo)r1Úoptimize)r*rrrZ__get_output_extensionsås z!build_ext.__get_output_extensionsFcCs.tjd|j|ƒtjj|f|jjdƒžŽd}|rJtjj|ƒrJt|dƒ‚|j s¸t |dƒ}|j djddd t d ƒd tjj |jƒd d dt dƒdddt dƒddt dƒdddgƒƒ|jƒ|�r*ddlm}||gdd|j d�|jdƒj}|dk�r||g|d|j d�tjj|ƒ�r*|j �r*tj|ƒdS)Nz writing stub loader for %s to %sr,z.pyz already exists! Please delete.ÚwÚ zdef __bootstrap__():z- global __bootstrap__, __file__, __loader__z% import sys, os, pkg_resources, impz, dlz: __file__ = pkg_resources.resource_filename(__name__,%r)z del __bootstrap__z if '__loader__' in globals():z del __loader__z# old_flags = sys.getdlopenflags()z old_dir = os.getcwd()z try:z( os.chdir(os.path.dirname(__file__))z$ sys.setdlopenflags(dl.RTLD_NOW)z( imp.load_dynamic(__name__,__file__)z finally:z" sys.setdlopenflags(old_flags)z os.chdir(old_dir)z__bootstrap__()rr)Ú byte_compileT)rtr^r/Z install_lib)rÚinforVr8r9r7r6Úexistsrr/ÚopenÚwriteÚif_dlr:rXÚcloseZdistutils.utilrwr1rtÚunlink)r*Ú output_dirr?ÚcompileZ stub_fileÚfrwrtrrrr=ësP          zbuild_ext.write_stubN)F)Ú__name__Ú __module__Ú __qualname__r(r)r5rQrTrUrdrerWrmrnrrr=rrrrrJs   rc Cs(|j|j||||||||| | | | ƒ dS)N)ÚlinkZSHARED_LIBRARY) r*ÚobjectsÚoutput_libnamerr_rZr\rcÚdebugÚ extra_preargsÚextra_postargsÚ build_tempÚ target_langrrrr`s r`Zstaticc Cs^|dks t‚tjj|ƒ\}} tjj| ƒ\}}|jdƒjdƒrH|dd…}|j||||| ƒdS)NÚxrgé)ÚAssertionErrorr8r9r6rIrKÚ startswithZcreate_static_lib)r*r†r‡rr_rZr\rcrˆr‰rŠr‹rŒrAr:r?rrrr`,s  cCstjdkrd}t|ƒS)zŠ In https://github.com/pypa/setuptools/pull/837, we discovered Python 3.3.0 exposes the extension suffix under the name 'SO'. rŽr-r)rŽrŽr-)rÚ version_infor)r4rrrrFDs rF) NNNNNrNNNN) NNNNNrNNNN)(r8rrpr!Zdistutils.command.build_extrZ _du_build_extZdistutils.file_utilrZdistutils.ccompilerrZdistutils.sysconfigrrZdistutils.errorsrZ distutilsrZsetuptools.extensionr Zsetuptools.externr ZCython.Distutils.build_extr'Ú __import__Ú ImportErrorr rrrrMrLrr4ZdlÚhasattrr|r&r`rFrrrrÚsZ              Q