
§|jù2  ã               @   s,  d  d l  Z  d  d l Z d  d l 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 d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z y d  d l m Z Wn e k
 rä e Z Yn Xe d
 ƒ d  d l m Z d d „  Z d Z d Z d Z e j d k r5d Z nG e  j  d k r|y# d  d l! Z! e" e! d ƒ Z Z Wn e k
 r{Yn Xd d „  Z# d d „  Z$ Gd d „  d e ƒ Z e s¿e  j  d k rìd d d d d d  d d d d d d „
 Z% n0 d Z d d d d d d  d d d d d d „
 Z% d d „  Z& d S) é    N)Ú	build_ext)Ú	copy_file)Únew_compiler)Úcustomize_compilerÚget_config_var)ÚDistutilsError)Úlog)ÚLibrary)ÚsixÚLDSHARED)Ú_config_varsc             C   ss   t  j d k re t j ƒ  } z, d t d <d t d <d t d <t |  ƒ Wd  t j ƒ  t j | ƒ Xn
 t |  ƒ d  S)NÚdarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibÚCCSHAREDz.dylibÚSO)ÚsysÚplatformÚ_CONFIG_VARSÚcopyr   ÚclearÚupdate)ÚcompilerÚtmp© r   úB/tmp/pip-build-5c7ija6t/setuptools/setuptools/command/build_ext.pyÚ_customize_compiler_for_shlib   s    



r   FZsharedr   TÚntÚRTLD_NOWc             C   s   t  r
 |  Sd S)NÚ )Ú	have_rtld)Úsr   r   r   Ú<lambda>;   s    r    c              C   sQ   xJ d d „  t  j ƒ  Dƒ D]/ \ }  } } d |  k r9 |  S|  d k r |  Sq Wd S)z;Return the file extension for an abi3-compliant Extension()c             s   s(   |  ] } | d  t  j k r | Vq d S)é   N)ÚimpÚC_EXTENSION)Ú.0r   r   r   r   ú	<genexpr>@   s    z"get_abi3_suffix.<locals>.<genexpr>z.abi3z.pydN)r"   Úget_suffixes)ÚsuffixÚ_r   r   r   Úget_abi3_suffix>   s
    )r)   c               @   s¯   e  Z 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 d d „  Z d d d „ Z d S)r   c             C   s=   |  j  d } |  _  t j |  ƒ | |  _  | r9 |  j ƒ  d S)z;Build extensions in build directory, then copy if --inplacer   N)ZinplaceÚ
_build_extÚrunÚcopy_extensions_to_source)ÚselfZold_inplacer   r   r   r+   H   s
    	zbuild_ext.runc       
      C   sü   |  j  d ƒ } xæ |  j D]Û } |  j | j ƒ } |  j | ƒ } | j d ƒ } d j | d  d … ƒ } | j | ƒ } t j	 j | t j	 j
 | ƒ ƒ } t j	 j |  j | ƒ }	 t |	 | d |  j d |  j ƒ| j r |  j | pê t j | d ƒ q Wd  S)NÚbuild_pyÚ.é   ÚverboseÚdry_runTéÿÿÿÿ)Úget_finalized_commandÚ
extensionsÚget_ext_fullnameÚnameÚget_ext_filenameÚsplitÚjoinZget_package_dirÚosÚpathÚbasenameÚ	build_libr   r1   r2   Ú_needs_stubÚ
write_stubÚcurdir)
r-   r.   ÚextÚfullnameÚfilenameZmodpathÚpackageÚpackage_dirZdest_filenameZsrc_filenamer   r   r   r,   P   s    
	z#build_ext.copy_extensions_to_sourcec             C   s  t  j |  | ƒ } | |  j k rý |  j | } t j oL t | d ƒ oL t ƒ  } | r… t d ƒ } | d  t | ƒ … } | t ƒ  } t	 | t
 ƒ r¿ t j j | ƒ \ } } |  j j | t ƒ St rý | j rý t j j | ƒ \ } } t j j | d | ƒ S| S)NZpy_limited_apiÚ
EXT_SUFFIXzdl-)r*   r8   Úext_mapr
   ÚPY3Úgetattrr)   Ú_get_config_var_837ÚlenÚ
isinstancer	   r;   r<   ÚsplitextÚshlib_compilerÚlibrary_filenameÚlibtypeÚ	use_stubsÚ_links_to_dynamicr9   r:   )r-   rC   rD   rB   Zuse_abi3Zso_extÚfnÚdr   r   r   r8   f   s"    		zbuild_ext.get_ext_filenamec             C   s,   t  j |  ƒ d  |  _ g  |  _ i  |  _ d  S)N)r*   Úinitialize_optionsrO   ÚshlibsrH   )r-   r   r   r   rV   {   s    		zbuild_ext.initialize_optionsc             C   s¨  t  j |  ƒ |  j p g  |  _ |  j |  j ƒ d d „  |  j Dƒ |  _ |  j r[ |  j ƒ  x& |  j D] } |  j | j ƒ | _ qe Wx|  j D]} | j } | |  j	 | <| |  j	 | j
 d ƒ d <|  j rÜ |  j | ƒ pß d } | oû t oû t | t ƒ } | | _ | | _ |  j | ƒ } | _ t j j t j j |  j | ƒ ƒ } | ro| | j k ro| j j | ƒ | rŽ t rŽ t j | j k rŽ | j j t j ƒ qŽ Wd  S)Nc             S   s%   g  |  ] } t  | t ƒ r | ‘ q Sr   )rM   r	   )r$   rB   r   r   r   ú
<listcomp>…   s   	 z.build_ext.finalize_options.<locals>.<listcomp>r/   r0   Fr3   )r*   Úfinalize_optionsr5   Zcheck_extensions_listrW   Úsetup_shlib_compilerr6   r7   Ú
_full_namerH   r9   Úlinks_to_dynamicrR   rM   r	   rS   r?   r8   Ú
_file_namer;   r<   Údirnamer:   r>   Úlibrary_dirsÚappendrA   Úruntime_library_dirs)r-   rB   rC   ZltdÚnsrD   Zlibdirr   r   r   rY   �   s,    	
			$zbuild_ext.finalize_optionsc             C   sO  t  d |  j d |  j d |  j ƒ } |  _ t | ƒ |  j d  k	 rT | j |  j ƒ |  j d  k	 r� x' |  j D] \ } } | j	 | | ƒ qm W|  j
 d  k	 r½ x |  j
 D] } | j | ƒ q¦ W|  j d  k	 rÜ | j |  j ƒ |  j d  k	 rû | j |  j ƒ |  j d  k	 r| j |  j ƒ |  j d  k	 r9| j |  j ƒ t j | ƒ | _ d  S)Nr   r2   Úforce)r   r   r2   rc   rO   r   Úinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macroÚ	librariesZset_librariesr_   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectsÚlink_shared_objectÚ__get__)r-   r   r7   ÚvalueZmacror   r   r   rZ   ž   s(    %
zbuild_ext.setup_shlib_compilerc             C   s&   t  | t ƒ r | j St j |  | ƒ S)N)rM   r	   Úexport_symbolsr*   Úget_export_symbols)r-   rB   r   r   r   rj   ¹   s    zbuild_ext.get_export_symbolsc             C   s~   | j  ƒ  |  j } zZ t | t ƒ r1 |  j |  _ t j |  | ƒ | j rl |  j d ƒ j	 } |  j
 | | ƒ Wd  | |  _ Xd  S)Nr.   )Z_convert_pyx_sources_to_langr   rM   r	   rO   r*   Úbuild_extensionr?   r4   r>   r@   )r-   rB   Z	_compilerÚcmdr   r   r   rk   ¾   s    
		zbuild_ext.build_extensionc                sn   t  j d d „  |  j Dƒ ƒ ‰  d j | j j d ƒ d d	 … d g ƒ ‰ t ‡  ‡ f d d †  | j Dƒ ƒ S)
z?Return true if 'ext' links to a dynamic lib in the same packagec             S   s   g  |  ] } | j  ‘ q Sr   )r[   )r$   Úlibr   r   r   rX   Ð   s   	 z.build_ext.links_to_dynamic.<locals>.<listcomp>r/   Nr0   r   c             3   s   |  ] } ˆ | ˆ  k Vq d  S)Nr   )r$   Úlibname)ÚlibnamesÚpkgr   r   r%   Ò   s    z-build_ext.links_to_dynamic.<locals>.<genexpr>r3   )ÚdictÚfromkeysrW   r:   r[   r9   Úanyre   )r-   rB   r   )ro   rp   r   r\   Ë   s    ,zbuild_ext.links_to_dynamicc             C   s   t  j |  ƒ |  j ƒ  S)N)r*   Úget_outputsÚ_build_ext__get_stubs_outputs)r-   r   r   r   rt   Ô   s    zbuild_ext.get_outputsc                sK   ‡  f d d †  ˆ  j  Dƒ } t j | ˆ  j ƒ  ƒ } t d d „  | Dƒ ƒ S)Nc             3   s<   |  ]2 } | j  r t j j ˆ  j | j j d  ƒ Œ Vq d S)r/   N)r?   r;   r<   r:   r>   r[   r9   )r$   rB   )r-   r   r   r%   Ú   s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c             s   s   |  ] \ } } | | Vq d  S)Nr   )r$   ÚbaseZfnextr   r   r   r%   à   s    )r5   Ú	itertoolsÚproductÚ!_build_ext__get_output_extensionsÚlist)r-   Zns_ext_basesÚpairsr   )r-   r   Z__get_stubs_outputs×   s    zbuild_ext.__get_stubs_outputsc             c   s%   d Vd V|  j  d ƒ j r! d Vd  S)Nz.pyz.pycr.   z.pyo)r4   Úoptimize)r-   r   r   r   Z__get_output_extensionsâ   s    z!build_ext.__get_output_extensionsFc             C   s¥  t  j d | j | ƒ t j j | | j j d ƒ Œ d } | rc t j j | ƒ rc t | d ƒ ‚ |  j	 s t
 | d ƒ } | j d j d d d	 t d
 ƒ d t j j | j ƒ d d d t d ƒ d d d t d ƒ d d t d ƒ d d d g ƒ ƒ | j ƒ  | r¡d d l m } | | g d d d d d |  j	 ƒ|  j d  ƒ j } | d k rx| | g d | d d d |  j	 ƒt j j | ƒ r¡|  j	 r¡t j | ƒ d  S)!Nz writing stub loader for %s to %sr/   z.pyz already exists! Please delete.ÚwÚ
zdef __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__()r   r   )Úbyte_compiler|   rc   Tr2   Úinstall_lib)r   Úinfor[   r;   r<   r:   r9   Úexistsr   r2   ÚopenÚwriteÚif_dlr=   r]   ÚcloseÚdistutils.utilr   r4   r|   Úunlink)r-   Ú
output_dirrB   ÚcompileZ	stub_fileÚfr   r|   r   r   r   r@   è   sP    				
zbuild_ext.write_stubN)Ú__name__Ú
__module__Ú__qualname__r+   r,   r8   rV   rY   rZ   rj   rk   r\   rt   ru   ry   r@   r   r   r   r   r   G   s   	r   c             C   s8   |  j  |  j | | | | | | | | |	 |
 | | ƒ d  S)N)ÚlinkZSHARED_LIBRARY)r-   ÚobjectsÚoutput_libnamer‰   re   r_   ra   ri   ÚdebugÚextra_preargsÚextra_postargsÚ
build_tempÚtarget_langr   r   r   rf     s
    rf   Zstaticc             C   s‡   | d  k s t  ‚ t j j | ƒ \ } } t j j | ƒ \ } } |  j d ƒ j d ƒ rj | d d  … } |  j | | | | | ƒ d  S)NÚxrm   é   )ÚAssertionErrorr;   r<   r9   rN   rP   Ú
startswithZcreate_static_lib)r-   r�   r‘   r‰   re   r_   ra   ri   r’   r“   r”   r•   r–   rD   r=   rB   r   r   r   rf   )  s    c             C   s   t  j d k  r d }  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˜   r0   r   )r˜   r˜   r0   )r   Úversion_infor   )r7   r   r   r   rK   A  s    rK   )'r;   r   rw   r"   Zdistutils.command.build_extr   Z_du_build_extÚdistutils.file_utilr   Údistutils.ccompilerr   Údistutils.sysconfigr   r   Zdistutils.errorsr   Ú	distutilsr   Zsetuptools.extensionr	   Zsetuptools.externr
   ZCython.Distutils.build_extr*   ÚImportErrorr   r   r   r   rR   rQ   r   r7   ÚdlÚhasattrr…   r)   rf   rK   r   r   r   r   Ú<module>   sV   
		Ð			