B
    Y\a2              
   @   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 ed
 W n ek
r   eZY nX 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,yd dl"Z"e#e"d ZZW n ek
r*   Y nX dd Z$dd Z%G dd deZes^e j!dkrjdddZ&ndZd ddZ&dS )!    N)	build_ext)	copy_file)new_compiler)customize_compilerget_config_var)DistutilsError)log)Library)sixzCython.Compiler.MainLDSHARED)_config_varsc          	   C   sZ   t jdkrNt }z$dtd< dtd< dtd< t|  W d t  t| X nt|  d S )Ndarwinz0gcc -Wl,-x -dynamiclib -undefined dynamic_lookupr   z -dynamiclibZCCSHAREDz.dylibZSO)sysplatform_CONFIG_VARScopyr   clearupdate)compilerZtmp r   ;lib/python3.7/site-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   <lambda>>   s    r   c              C   s>   x8dd t  D D ]"\} }}d| kr*| S | dkr| S qW d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>C   s    z"get_abi3_suffix.<locals>.<genexpr>z.abi3z.pydN)r   Zget_suffixes)suffix_r   r   r   get_abi3_suffixA   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'   K   s
    
zbuild_ext.runc       
      C   s   |  d}x| jD ]}| |j}| |}|d}d|d d }||}tj	|tj	
|}tj	| j|}	t|	|| j| jd |jr| |ptj|d qW 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filenameZmodpathpackageZpackage_dirZdest_filenameZsrc_filenamer   r   r   r(   S   s    




z#build_ext.copy_extensions_to_sourcec             C   s   t | |}|| jkr| j| }tjo4t|do4t }|r^t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&   r3   ext_mapr
   ZPY3getattrr%   r   len
isinstancer	   r6   r7   splitextshlib_compilerlibrary_filenamelibtype	use_stubs_links_to_dynamicr4   r5   )r)   r>   r?   r=   Zuse_abi3Zso_extfndr   r   r   r3   i   s"    





zbuild_ext.get_ext_filenamec             C   s    t |  d | _g | _i | _d S )N)r&   initialize_optionsrF   shlibsrA   )r)   r   r   r   rM   ~   s    
zbuild_ext.initialize_optionsc             C   s4  t |  | jpg | _| | j dd | jD | _| jrB|   x| jD ]}| |j|_qJW x| jD ]}|j}|| j	|< || j	|
dd < | jr| |pd}|otot|t }||_||_| | }|_tjtj| j|}|r
||jkr
|j| |rhtrhtj|jkrh|jtj qhW d S )Nc             S   s   g | ]}t |tr|qS r   )rD   r	   )r!   r=   r   r   r   
<listcomp>   s    z.build_ext.finalize_options.<locals>.<listcomp>r+   r,   F)r&   finalize_optionsr0   Zcheck_extensions_listrN   setup_shlib_compilerr1   r2   
_full_namerA   r4   links_to_dynamicrI   rD   r	   rJ   r:   r3   
_file_namer6   r7   dirnamer5   r9   library_dirsappendr<   runtime_library_dirs)r)   r=   r>   Zltdnsr?   Zlibdirr   r   r   rP      s,    

zbuild_ext.finalize_optionsc             C   s   t | j| j| jd }| _t| | jd k	r8|| j | jd k	rbx| jD ]\}}|	|| qJW | j
d k	rx| j
D ]}|| qtW | jd k	r|| j | jd k	r|| j | jd k	r|| j | jd k	r|| j t||_d S )N)r   r.   force)r   r   r.   rZ   rF   r   Zinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macro	librariesZset_librariesrV   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectslink_shared_object__get__)r)   r   r2   valueZmacror   r   r   rQ      s(    






zbuild_ext.setup_shlib_compilerc             C   s   t |tr|jS t| |S )N)rD   r	   export_symbolsr&   get_export_symbols)r)   r=   r   r   r   r`      s    
zbuild_ext.get_export_symbolsc             C   s\   |   | j}z@t|tr"| j| _t| | |jrL| dj	}| 
|| W d || _X d S )Nr*   )Z_convert_pyx_sources_to_langr   rD   r	   rF   r&   build_extensionr:   r/   r9   r;   )r)   r=   Z	_compilercmdr   r   r   ra      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   )rR   )r!   libr   r   r   rO      s    z.build_ext.links_to_dynamic.<locals>.<listcomp>r+   Nr,   r   c             3   s   | ]}|  kV  qd S )Nr   )r!   Zlibname)libnamespkgr   r   r"      s    z-build_ext.links_to_dynamic.<locals>.<genexpr>)dictfromkeysrN   r5   rR   r4   anyr[   )r)   r=   r   )rd   re   r   rS      s     zbuild_ext.links_to_dynamicc             C   s   t | |   S )N)r&   get_outputs_build_ext__get_stubs_outputs)r)   r   r   r   ri      s    zbuild_ext.get_outputsc                s6    fdd j D }t|  }tdd |D S )Nc             3   s0   | ](}|j rtjj jf|jd  V  qdS )r+   N)r:   r6   r7   r5   r9   rR   r4   )r!   r=   )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    )r0   	itertoolsproduct!_build_ext__get_output_extensionslist)r)   Zns_ext_basesZpairsr   )r)   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 )Nz.pyz.pycr*   z.pyo)r/   optimize)r)   r   r   r   Z__get_output_extensions   s    z!build_ext.__get_output_extensionsFc             C   s,  t d|j| tjj|f|jd d }|rJtj|rJt|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tddddg |  |r(ddlm} ||gdd| j	d | dj}|dkr||g|d| j	d tj|r(| j	s(t| 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_compileT)rp   rZ   r.   Zinstall_lib)r   inforR   r6   r7   r5   r4   existsr   r.   openwriteif_dlr8   rT   closeZdistutils.utilrs   r/   rp   unlink)r)   
output_dirr=   compileZ	stub_filefrs   rp   r   r   r   r;      sP    




zbuild_ext.write_stubN)F)__name__
__module____qualname__r'   r(   r3   rM   rP   rQ   r`   ra   rS   ri   rj   rn   r;   r   r   r   r   r   J   s   	r   c             C   s(   |  | j|||||||||	|
|| d S )N)linkZSHARED_LIBRARY)r)   objectsoutput_libnamer{   r[   rV   rX   r_   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   r\     s
    r\   Zstaticc             C   s^   |d kst tj|\}}tj|\}}| ddrH|dd  }| ||||| d S )Nxrc      )AssertionErrorr6   r7   r4   rE   rG   
startswithZcreate_static_lib)r)   r   r   r{   r[   rV   rX   r_   r   r   r   r   r   r?   r8   r=   r   r   r   r\   ,  s    )
NNNNNr   NNNN)
NNNNNr   NNNN)'r6   r   rl   r   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setuptools.externr
   ZCython.Distutils.build_extr&   
__import__ImportErrorr   r   r   r   rI   rH   r   r2   Zdlhasattrrx   r%   r\   r   r   r   r   <module>   sX   

	 Q   	   