Re2@s,ddlZddlZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZyddlmZWnek reZYnXe d dd l mZd d ZdZdZdZejdkr5dZnGej dkr|y#ddl!Z!e"e!dZZWnek r{YnXddZ#ddZ$GdddeZesej dkrdddddddddddd Z%n0dZdddddddddddd Z%ddZ&dS) N) build_ext) copy_file) new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixLDSHARED) _config_varsc Csstjdkretj}z,dtd;sr cCsQxJddtjDD]/\}}}d|kr9|S|dkr|SqWdS)z;Return the file extension for an abi3-compliant Extension()css(|]}|dtjkr|VqdS)N)imp C_EXTENSION).0rrrr @sz"get_abi3_suffix..z.abi3z.pydN)r" get_suffixes)suffix_rrrget_abi3_suffix>s )  r)c@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdddZdS)rcCs=|jd}|_tj|||_|r9|jdS)z;Build extensions in build directory, then copy if --inplacerN)Zinplace _build_extruncopy_extensions_to_source)selfZ old_inplacerrrr+Hs   z build_ext.runc Cs|jd}x|jD]}|j|j}|j|}|jd}dj|dd}|j|}tj j|tj j |}tj j|j |} t | |d|j d|j|jr|j|ptj|dqWdS)Nbuild_py.verbosedry_runT)get_finalized_command extensionsget_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename build_librr1r2 _needs_stub write_stubcurdir) r-r.extfullnamefilenameZmodpathpackage package_dirZ dest_filenameZ src_filenamerrrr,Ps   z#build_ext.copy_extensions_to_sourcecCstj||}||jkr|j|}tjoLt|doLt}|rtd}|dt| }|t}t |t rt j j |\}}|jj|tStr|jrt j j|\}}t j j|d|S|S)NZpy_limited_api EXT_SUFFIXzdl-)r*r8ext_mapr PY3getattrr)_get_config_var_837len isinstancer r;r<splitextshlib_compilerlibrary_filenamelibtype use_stubs_links_to_dynamicr9r:)r-rCrDrBZuse_abi3Zso_extfndrrrr8fs"     zbuild_ext.get_ext_filenamecCs,tj|d|_g|_i|_dS)N)r*initialize_optionsrOshlibsrH)r-rrrrV{s   zbuild_ext.initialize_optionscCstj||jpg|_|j|jdd|jD|_|jr[|jx&|jD]}|j|j|_qeWx|jD]}|j}||j |<||j |j dd<|jr|j |pd}|ot ot |t }||_||_|j|}|_tjjtjj|j|}|ro||jkro|jj||rt rtj|jkr|jjtjqWdS)NcSs%g|]}t|tr|qSr)rMr )r$rBrrr s z.build_ext.finalize_options..r/r0Fr3)r*finalize_optionsr5Zcheck_extensions_listrWsetup_shlib_compilerr6r7 _full_namerHr9links_to_dynamicrRrMr rSr?r8 _file_namer;r<dirnamer:r> library_dirsappendrAruntime_library_dirs)r-rBrCZltdnsrDZlibdirrrrrYs,       $zbuild_ext.finalize_optionscCsOtd|jd|jd|j}|_t||jdk rT|j|j|jdk rx'|jD]\}}|j ||qmW|j dk rx|j D]}|j |qW|j dk r|j |j |jdk r|j|j|jdk r|j|j|jdk r9|j|jtj||_dS)Nrr2force)rrr2rcrOr include_dirsZset_include_dirsZdefineZ define_macroZundefZundefine_macro librariesZ set_librariesr_Zset_library_dirsZrpathZset_runtime_library_dirsZ link_objectsZset_link_objectslink_shared_object__get__)r-rr7valueZmacrorrrrZs(% zbuild_ext.setup_shlib_compilercCs&t|tr|jStj||S)N)rMr export_symbolsr*get_export_symbols)r-rBrrrrjszbuild_ext.get_export_symbolsc Cs~|j|j}zZt|tr1|j|_tj|||jrl|jdj }|j ||Wd||_XdS)Nr.) Z_convert_pyx_sources_to_langrrMr rOr*build_extensionr?r4r>r@)r-rBZ _compilercmdrrrrks    zbuild_ext.build_extensioncsntjdd|jDdj|jjddd dgtfdd|jDS) z?Return true if 'ext' links to a dynamic lib in the same packagecSsg|]}|jqSr)r[)r$librrrrXs z.build_ext.links_to_dynamic..r/Nr0rc3s|]}|kVqdS)Nr)r$libname)libnamespkgrrr%sz-build_ext.links_to_dynamic..r3)dictfromkeysrWr:r[r9anyre)r-rBr)rorprr\s,zbuild_ext.links_to_dynamiccCstj||jS)N)r* get_outputs_build_ext__get_stubs_outputs)r-rrrrtszbuild_ext.get_outputscsKfddjD}tj|j}tdd|DS)Nc3s<|]2}|jrtjjj|jjdVqdS)r/N)r?r;r<r:r>r[r9)r$rB)r-rrr%sz0build_ext.__get_stubs_outputs..css|]\}}||VqdS)Nr)r$baseZfnextrrrr%s)r5 itertoolsproduct!_build_ext__get_output_extensionslist)r-Z ns_ext_basespairsr)r-rZ__get_stubs_outputss zbuild_ext.__get_stubs_outputsccs%dVdV|jdjr!dVdS)Nz.pyz.pycr.z.pyo)r4optimize)r-rrrZ__get_output_extensionssz!build_ext.__get_output_extensionsFcCstjd|j|tjj||jjdd}|rctjj|rct|d|j st |d}|j djddd t d d tjj |jd d dt ddddt dddt ddddg|j|rddlm}||gddddd|j |jd j}|dkrx||gd|ddd|j tjj|r|j rtj|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_compiler|rcTr2 install_lib)rinfor[r;r<r:r9existsrr2openwriteif_dlr=r]closedistutils.utilrr4r|unlink)r- output_dirrBcompileZ stub_filefrr|rrrr@sP        zbuild_ext.write_stubN)__name__ __module__ __qualname__r+r,r8rVrYrZrjrkr\rtruryr@rrrrrGs          rc Cs8|j|j||||||||| | | | dS)N)linkZSHARED_LIBRARY) r-objectsoutput_libnamerrer_raridebug extra_preargsextra_postargs build_temp target_langrrrrfs    rfZstaticc Cs|dksttjj|\}} tjj| \}}|jdjdrj|dd}|j||||| dS)Nxrm)AssertionErrorr;r<r9rNrP startswithZcreate_static_lib)r-rrrrer_rarirrrrrrDr=rBrrrrf)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'. rr0r)rrr0)r version_infor)r7rrrrKAsrK)'r;rrwr"Zdistutils.command.build_extrZ _du_build_extdistutils.file_utilrdistutils.ccompilerrdistutils.sysconfigrrdistutils.errorsr distutilsrZsetuptools.extensionr Zsetuptools.externr ZCython.Distutils.build_extr* ImportErrorr rrrrRrQrr7dlhasattrrr)rfrKrrrrsV