a
    `2                  
   @   sp  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 d dlmZmZ d dlmZ d dlmZ d d	lmZ zd dlmZ ed
 W n ey   eZY n0 ed d dlmZ dd ZdZdZdZejdkrdZn<e j dkr zd dl!Z!e"e!d ZZW n ey   Y n0 dd Z#dd Z$G dd deZesRe j dkr^dddZ%ndZd ddZ%dS )!    NEXTENSION_SUFFIXES)	build_ext)	copy_file)new_compiler)customize_compilerget_config_var)DistutilsError)log)LibraryzCython.Compiler.MainLDSHARED)_config_varsc              	   C   sl   t jdkr`t }z6dtd< dtd< dtd< t|  W t  t| qht  t| 0 nt|  d S )Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibZCCSHAREDz.dylibZSO)sysplatform_CONFIG_VARScopyr   clearupdate)compilertmp r   >/usr/lib/python3/dist-packages/setuptools/command/build_ext.py_customize_compiler_for_shlib   s    

r   FZsharedr   TntRTLD_NOWc                 C   s   t r| S dS )N )	have_rtld)sr   r   r   if_dl>   s    r   c                  C   s.   t D ]$} d| v r|   S | dkr|   S qdS )z;Return the file extension for an abi3-compliant Extension()z.abi3z.pydNr   )suffixr   r   r   get_abi3_suffixB   s
    r!   c                   @   sv   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|  || _ |r*|   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#   L   s
    
zbuild_ext.runc           
      C   s   |  d}| jD ]}| |j}| |}|d}d|d d }||}tj	|tj	
|}tj	| j|}	t|	|| j| jd |jr| |ptj|d qd 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   r)   r*   _needs_stub
write_stubcurdir)
r%   r&   extfullnamefilenamemodpathpackageZpackage_dirZdest_filenameZsrc_filenamer   r   r   r$   T   s"    





z#build_ext.copy_extensions_to_sourcec                 C   s   t | |}|| jv r| j| }t|do.t }|rXtd}|d t|  }|t  }t|trt	j
|\}}| j|tS tr|jrt	j
|\}}t	j
|d| S |S )NZpy_limited_apiZ
EXT_SUFFIXzdl-)r"   r/   ext_mapgetattrr!   r   len
isinstancer   r2   r3   splitextshlib_compilerlibrary_filenamelibtype	use_stubs_links_to_dynamicr0   r1   )r%   r:   r;   r9   Zuse_abi3Zso_extfndr   r   r   r/   j   s    




zbuild_ext.get_ext_filenamec                 C   s    t |  d | _g | _i | _d S N)r"   initialize_optionsrC   shlibsr>   r%   r   r   r   rK   {   s    
zbuild_ext.initialize_optionsc                 C   s,  t |  | jpg | _| | j dd | jD | _| jrB|   | jD ]}| |j|_qH| jD ]}|j}|| j	|< || j	|
dd < | jr| |pd}|otot|t }||_||_| | }|_tjtj| j|}|r||jvr|j| |rbtrbtj|jvrb|jtj qbd S )Nc                 S   s   g | ]}t |tr|qS r   )rA   r   .0r9   r   r   r   
<listcomp>   s   
z.build_ext.finalize_options.<locals>.<listcomp>r'   r(   F)r"   finalize_optionsr,   Zcheck_extensions_listrL   setup_shlib_compilerr-   r.   
_full_namer>   r0   links_to_dynamicrF   rA   r   rG   r6   r/   
_file_namer2   r3   dirnamer1   r5   library_dirsappendr8   runtime_library_dirs)r%   r9   r:   Zltdnsr;   libdirr   r   r   rQ      s,    



zbuild_ext.finalize_optionsc                 C   s   t | j| j| jd }| _t| | jd ur8|| j | jd ur^| jD ]\}}|	|| qH| j
d ur~| j
D ]}|| qn| jd ur|| j | jd ur|| j | jd ur|| j | jd ur|| j t||_d S )N)r   r*   force)r   r   r*   r\   rC   r   Zinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macro	librariesZset_librariesrW   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectslink_shared_object__get__)r%   r   r.   valueZmacror   r   r   rR      s*    







zbuild_ext.setup_shlib_compilerc                 C   s   t |tr|jS t| |S rJ   )rA   r   export_symbolsr"   get_export_symbolsr%   r9   r   r   r   rb      s    
zbuild_ext.get_export_symbolsc                 C   sb   |   | j}zFt|tr"| j| _t| | |jrL| dj	}| 
|| W || _n|| _0 d S )Nr&   )Z_convert_pyx_sources_to_langr   rA   r   rC   r"   build_extensionr6   r+   r5   r7   )r%   r9   Z	_compilercmdr   r   r   rd      s    
zbuild_ext.build_extensionc                    sP   t dd | jD  d|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S r   )rS   )rO   libr   r   r   rP          z.build_ext.links_to_dynamic.<locals>.<listcomp>r'   Nr(   r   c                 3   s   | ]}|  v V  qd S rJ   r   )rO   ZlibnameZlibnamespkgr   r   	<genexpr>   rg   z-build_ext.links_to_dynamic.<locals>.<genexpr>)dictfromkeysrL   r1   rS   r0   anyr]   rc   r   rh   r   rT      s     zbuild_ext.links_to_dynamicc                 C   s   t | |   S rJ   )r"   get_outputs_build_ext__get_stubs_outputsrM   r   r   r   rn      s    zbuild_ext.get_outputsc                    s6    fdd j D }t|  }tdd |D S )Nc                 3   s2   | ]*}|j rtjj jg|jd R  V  qdS )r'   N)r6   r2   r3   r1   r5   rS   r0   rN   rM   r   r   rj      s   z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c                 s   s   | ]\}}|| V  qd S rJ   r   )rO   baseZfnextr   r   r   rj      rg   )r,   	itertoolsproduct!_build_ext__get_output_extensionslist)r%   Zns_ext_basesZpairsr   rM   r   Z__get_stubs_outputs   s
    
zbuild_ext.__get_stubs_outputsc                 c   s"   dV  dV  |  djrdV  d S )N.pyz.pycr&   z.pyo)r+   optimizerM   r   r   r   Z__get_output_extensions   s    z!build_ext.__get_output_extensionsFc                 C   s4  t d|j| tjj|g|jdR  d }|rLtj|rLt|d | j	st
|d}|dddd	td
 dtj|j dddtddddtddddddtddddg |  |r0ddlm} ||gdd| j	d  | d!j}|dkr||g|d| j	d  tj|r0| j	s0t| d S )"Nz writing stub loader for %s to %sr'   ru   z already exists! Please delete.w
zdef __bootstrap__():z-   global __bootstrap__, __file__, __loader__z0   import sys, os, pkg_resources, importlib.utilz, 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)z3     spec = importlib.util.spec_from_file_location(z#                __name__, __file__)z0     mod = importlib.util.module_from_spec(spec)z!     spec.loader.exec_module(mod)z   finally:z"     sys.setdlopenflags(old_flags)z     os.chdir(old_dir)z__bootstrap__()r   r   )byte_compileT)rv   r\   r*   Zinstall_lib)r
   inforS   r2   r3   r1   r0   existsr	   r*   openwriter   r4   rU   closeZdistutils.utilry   r+   rv   unlink)r%   
output_dirr9   compileZ	stub_filefry   rv   r   r   r   r7      sh    


zbuild_ext.write_stubN)F)__name__
__module____qualname__r#   r$   r/   rK   rQ   rR   rb   rd   rT   rn   ro   rs   r7   r   r   r   r   r   K   s   	r   c                 C   s(   |  | j|||||||||	|
|| d S rJ   )linkZSHARED_LIBRARY)r%   objectsoutput_libnamer   r]   rW   rY   ra   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   r^     s    r^   Zstaticc                 C   s^   |d u sJ t j|\}}t j|\}}| ddrH|dd  }| ||||| d S )Nxrf      )r2   r3   r0   rB   rD   
startswithZcreate_static_lib)r%   r   r   r   r]   rW   rY   ra   r   r   r   r   r   r;   r4   r9   r   r   r   r^   -  s    
)
NNNNNr   NNNN)
NNNNNr   NNNN)&r2   r   rq   importlib.machineryr   Zdistutils.command.build_extr   Z_du_build_extZdistutils.file_utilr   Zdistutils.ccompilerr   Zdistutils.sysconfigr   r   Zdistutils.errorsr	   Z	distutilsr
   Zsetuptools.extensionr   ZCython.Distutils.build_extr"   
__import__ImportErrorr   r   r   r   rF   rE   r   r.   Zdlhasattrr   r!   r^   r   r   r   r   <module>   sZ   

	 Q        