3 K]u3@sddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZed Wnek reZYnXe d dd l mZd dZdZdZdZej dkrdZn>ej!dkr,yddl"Z"e#e"dZZWnek r*YnXddZ$ddZ%GdddeZes^ej!dkrjd!ddZ&ndZd"ddZ&dd Z'dS)#N) build_ext) copy_file) new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixzCython.Compiler.MainLDSHARED) _config_varsc CsZtjdkrNtj}z$dtd<dtd<dtd<t|Wdtjtj|Xnt|dS)Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr z -dynamiclibCCSHAREDz.dylibSO)sysplatform _CONFIG_VARScopyrclearupdate)compilerZtmpr/usr/lib/python3.6/build_ext.py_customize_compiler_for_shlibs  rFZsharedr TntRTLD_NOWcCs tr|SdS)N) have_rtld)srrr>srcCs>x8ddtjDD]"\}}}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_rrrget_abi3_suffixAs r&c@sveZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdddZdS)rcCs.|jd}|_tj|||_|r*|jdS)z;Build extensions in build directory, then copy if --inplacerN)Zinplace _build_extruncopy_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|ptj|dqWdS)Nbuild_py.)verbosedry_runT)get_finalized_command extensionsget_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename build_librr.r/ _needs_stub write_stubcurdir) r*r+extfullnamefilenameZmodpathpackageZ package_dirZ dest_filenameZ src_filenamerrrr)Ss       z#build_ext.copy_extensions_to_sourcecCstj||}||jkr|j|}tjo4t|do4t}|r^td}|dt| }|t}t |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|S|S)NZpy_limited_api EXT_SUFFIXzdl-)r'r5ext_mapr ZPY3getattrr&_get_config_var_837len isinstancer r8r9splitextshlib_compilerlibrary_filenamelibtype use_stubs_links_to_dynamicr6r7)r*r@rAr?Zuse_abi3Zso_extfndrrrr5is"       zbuild_ext.get_ext_filenamecCs tj|d|_g|_i|_dS)N)r'initialize_optionsrJshlibsrD)r*rrrrQ~s zbuild_ext.initialize_optionscCs2tj||jpg|_|j|jdd|jD|_|jrB|jx|jD]}|j|j|_qJWx|jD]}|j}||j |<||j |j dd<|jr|j |pd}|ot ot |t }||_||_|j|}|_tjjtjj|j|}|o||jkr|jj||rht rhtj|jkrh|jjtjqhWdS)NcSsg|]}t|tr|qSr)rHr )r"r?rrr sz.build_ext.finalize_options..r,r-Fr0)r'finalize_optionsr2Zcheck_extensions_listrRsetup_shlib_compilerr3r4 _full_namerDr6links_to_dynamicrMrHr rNr<r5 _file_namer8r9dirnamer7r; library_dirsappendr>runtime_library_dirs)r*r?r@ZltdnsrAZlibdirrrrrTs,       zbuild_ext.finalize_optionscCst|j|j|jd}|_t||jdk r8|j|j|jdk rbx|jD]\}}|j ||qJW|j dk rx|j D]}|j |qtW|j dk r|j |j |jdk r|j|j|jdk r|j|j|jdk r|j|jtj||_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_objectslink_shared_object__get__)r*rr4valueZmacrorrrrUs(             zbuild_ext.setup_shlib_compilercCst|tr|jStj||S)N)rHr export_symbolsr'get_export_symbols)r*r?rrrrds zbuild_ext.get_export_symbolsc Cs\|j|j}z@t|tr"|j|_tj|||jrL|jdj }|j ||Wd||_XdS)Nr+) Z_convert_pyx_sources_to_langrrHr rJr'build_extensionr<r1r;r=)r*r?Z _compilercmdrrrres   zbuild_ext.build_extensioncsPtjdd|jDdj|jjddd dgtfdd|jDS) z?Return true if 'ext' links to a dynamic lib in the same packagecSsg|] }|jqSr)rV)r"librrrrSsz.build_ext.links_to_dynamic..r,Nr-rc3s|]}|kVqdS)Nr)r"Zlibname)libnamespkgrrr#sz-build_ext.links_to_dynamic..r0)dictfromkeysrRr7rVr6anyr_)r*r?r)rhrirrWs zbuild_ext.links_to_dynamiccCstj||jS)N)r' get_outputs_build_ext__get_stubs_outputs)r*rrrrmszbuild_ext.get_outputscs6fddjD}tj|j}tdd|DS)Nc3s0|](}|jrtjjjf|jjdVqdS)r,N)r<r8r9r7r;rVr6)r"r?)r*rrr#sz0build_ext.__get_stubs_outputs..css|]\}}||VqdS)Nr)r"baseZfnextrrrr#s)r2 itertoolsproduct!_build_ext__get_output_extensionslist)r*Z ns_ext_basesZpairsr)r*rZ__get_stubs_outputss  zbuild_ext.__get_stubs_outputsccs"dVdV|jdjrdVdS)Nz.pyz.pycr+z.pyo)r1optimize)r*rrrZ__get_output_extensionss z!build_ext.__get_output_extensionsFcCs.tjd|j|tjj|f|jjdd}|rJtjj|rJt|d|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|j|r*ddlm}||gdd|j d|jdj}|dkr||g|d|j dtjj|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)rinforVr8r9r7r6existsrr/openwriteif_dlr:rXcloseZdistutils.utilrwr1rtunlink)r* output_dirr?compileZ stub_filefrwrtrrrr=sP          zbuild_ext.write_stubN)F)__name__ __module__ __qualname__r(r)r5rQrTrUrdrerWrmrnrrr=rrrrrJs   rc Cs(|j|j||||||||| | | | dS)N)linkZSHARED_LIBRARY) r*objectsoutput_libnamerr_rZr\rcdebug extra_preargsextra_postargs build_temp target_langrrrr`s r`Zstaticc CsRtjj|\}} tjj| \}}|jdjdr<|dd}|j||||| dS)Nxrg)r8r9r6rIrK startswithZcreate_static_lib)r*rrrr_rZr\rcrrrrrrAr: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'. rr-r)rrr-)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 rrrrMrLrr4Zdlhasattrr|r&r`rFrrrrsZ              Q