o
    
_d`D                     @   s  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	m
Z
mZ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mZ zd dlmZ e d W n e!yi   eZY nw 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rzd dl*Z*e+e*d Z&Z%W n	 e!y   Y nw dd Z,dd Z-G dd deZe&se j)dkr						 				d!ddZ.dS dZ'						 				d!d dZ.dS )"    NEXTENSION_SUFFIXES)cache_from_source)DictIteratorListTuple)Path)	build_ext)new_compiler)customize_compilerget_config_var)log)	BaseError)	ExtensionLibraryzCython.Compiler.MainLDSHARED)_config_varsc              	   C   sl   t jdkr0t }zdtd< dtd< dtd< t|  W t  t| d S t  t| w 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   <lib/python3.10/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   if_dlD   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_suffixH   s   r'   c                   @   s@  e Zd ZU dZeed< dZeed< dd Zdede	e
e
f fdd	Zd
d Zdede
de
fddZdee	e
e
f  f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ee
 fdd Zdee
 fd!d"Zdee
 fd#d$Zdee
e
f fd%d&Zd'd( Zd)d* Zd3d+d,Zd3d-e
defd.d/Z d-e
fd0d1Z!d2S )4r
   Feditable_modeinplacec                 C   s2   | j d}| _ t|  || _ |r|   dS dS )z;Build extensions in build directory, then copy if --inplacer   N)r)   
_build_extruncopy_extensions_to_source)selfZold_inplacer   r   r   r+   U   s   
zbuild_ext.runextreturnc           
      C   sj   |  |j}| |}|d}d|d d }||}tj|tj|}tj| j	|}	||	fS )N.)
get_ext_fullnamenameget_ext_filenamesplitjoinZget_package_dirospathbasename	build_lib)
r-   build_pyr.   fullnamefilenamemodpathpackageZpackage_dirinplace_fileregular_filer   r   r   _get_inplace_equivalent]   s   


z!build_ext._get_inplace_equivalentc                 C   sp   |  d}| jD ]-}| ||\}}tj|s|js$| j||| jd |j	r5| 
||}| j||dd qd S )Nr;   )levelT)compile)get_finalized_command
extensionsrB   r7   r8   existsZoptionalZ	copy_fileverbose_needs_stub_get_equivalent_stub_write_stub_file)r-   r;   r.   r@   rA   inplace_stubr   r   r   r,   g   s   

z#build_ext.copy_extensions_to_sourceoutput_filec                 C   s2   t j|}|jd\}}}t j|| dS Nr0   .py)r7   r8   dirnamer3   
rpartitionr6   )r-   r.   rM   Zdir__r3   r   r   r   rJ   x   s   zbuild_ext._get_equivalent_stubc           
      c   s    | j sd S | d}| djpd}| jD ]/}| ||\}}||fV  |jrE| ||}| ||}t||d}t||d}	|	|fV  qd S )Nr;   install_libr"   )optimization)r)   rE   optimizerF   rB   rI   rJ   _compiled_file_name)
r-   r;   optr.   r@   rA   rL   Zregular_stubZinplace_cacheZoutput_cacher   r   r   _get_output_mapping}   s    



zbuild_ext._get_output_mappingc                 C   s   t d}|rt jj|d | }n
t| |}td}|| jv rk| j| }t	|do.t
 }|rA|d t|  }t
 }|| }t|trUt j|\}}| j|tS trk|jrkt j|\}}t j|d| S |S )NZSETUPTOOLS_EXT_SUFFIXr0   Z
EXT_SUFFIXZpy_limited_apizdl-)r7   getenvr8   r6   r5   r*   r4   r   ext_mapgetattrr'   len
isinstancer   splitextshlib_compilerlibrary_filenamelibtype	use_stubs_links_to_dynamic)r-   r<   Zso_extr=   r.   Zuse_abi3fndr   r   r   r4      s&   




zbuild_ext.get_ext_filenamec                 C   s&   t |  d | _g | _i | _d| _d S )NF)r*   initialize_optionsr_   shlibsrZ   r(   r-   r   r   r   rf      s
   

zbuild_ext.initialize_optionsc                 C   s8  t |  | jp	g | _| | j dd | jD | _| jr!|   | jD ]	}| |j|_q$| jD ]`}|j}|| j	|< || j	|
dd < | jrM| |pNd}|oXtoXt|t }||_||_| | }|_tjtj| j|}|r||jvr|j| |rtrtj|jvr|jtj q1| jrd| _d S d S )Nc                 S   s   g | ]	}t |tr|qS r   )r]   r   .0r.   r   r   r   
<listcomp>   s    z.build_ext.finalize_options.<locals>.<listcomp>r0   r1   FT)r*   finalize_optionsrF   Zcheck_extensions_listrg   setup_shlib_compilerr2   r3   
_full_namerZ   r5   links_to_dynamicrb   r]   r   rc   rI   r4   
_file_namer7   r8   rP   r6   r:   library_dirsappendcurdirruntime_library_dirsr(   r)   )r-   r.   r<   Zltdnsr=   libdirr   r   r   rl      s4   




zbuild_ext.finalize_optionsc                 C   s   t | j| j| jd }| _t| | jd ur|| j | jd ur/| jD ]
\}}|	|| q$| j
d ur?| j
D ]}|| q7| jd urJ|| j | jd urU|| j | jd ur`|| j | jd urk|| j t||_d S )N)r   dry_runforce)r   r   rw   rx   r_   r   Zinclude_dirsZset_include_dirsZdefineZdefine_macroZundefZundefine_macro	librariesZset_librariesrq   Zset_library_dirsZrpathZset_runtime_library_dirsZlink_objectsZset_link_objectslink_shared_object__get__)r-   r   r3   valueZmacror   r   r   rm      s*   







zbuild_ext.setup_shlib_compilerc                 C   s   t |tr|jS t| |S N)r]   r   export_symbolsr*   get_export_symbolsr-   r.   r   r   r   r      s   
zbuild_ext.get_export_symbolsc                 C   sl   |   | j}z*t|tr| j| _t| | |jr,| dj	}| 
|| W || _d S W || _d S || _w )Nr;   )Z_convert_pyx_sources_to_langr   r]   r   r_   r*   build_extensionrI   rE   r:   
write_stub)r-   r.   Z	_compilerr:   r   r   r   r      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   )rn   )rj   libr   r   r   rk     s    z.build_ext.links_to_dynamic.<locals>.<listcomp>r0   Nr1   r"   c                 3   s    | ]	}|  v V  qd S r}   r   )rj   ZlibnameZlibnamesZpkgr   r   	<genexpr>      z-build_ext.links_to_dynamic.<locals>.<genexpr>)dictfromkeysrg   r6   rn   r5   anyry   r   r   r   r   ro      s    zbuild_ext.links_to_dynamicc                 C   s   g t | |  S r}   )r*   get_source_files_get_internal_dependsrh   r   r   r   r   	  s   zbuild_ext.get_source_filesc              	   c   s    t | jjptj }dd | jD }dtdtddfdd}|D ]O}t |}| r1||d	 q!d
|j	v r<||d q!z
|| jdd}W n t
yT   ||d Y q!w z|| W n tyj   ||d Y q!w | V  q!dS )zAYield ``ext.depends`` that are contained by the project directoryc                 s   s     | ]}|j D ]}|V  qqd S r}   )depends)rj   r.   depr   r   r   r     s    z2build_ext._get_internal_depends.<locals>.<genexpr>	orig_pathreasonr/   Nc                 S   s   t d| | d S )NzJdependency %s won't be automatically included in the manifest: the path %s)r   info)r   r   r   r   r   skip  s
   z-build_ext._get_internal_depends.<locals>.skipzmust be relativez..zcan't have `..` segmentsT)strictzdoesn't existzmust be inside the project root)r	   ZdistributionZsrc_rootr7   rs   resolverF   stris_absolutepartsOSErrorrelative_to
ValueErroras_posix)r-   Zproject_rootr   r   r   r8   Zresolvedr   r   r   r     s4   




zbuild_ext._get_internal_dependsc                 C   s,   | j rt|   S tt| |   S r}   )r)   listget_output_mappingkeyssortedr*   get_outputs_build_ext__get_stubs_outputsrh   r   r   r   r   2  s   zbuild_ext.get_outputsc                 C   s   |   }tt|dd dS )z1See :class:`setuptools.commands.build.SubCommand`c                 S   s   | d S )Nr   r   )xr   r   r   <lambda>:  s    z.build_ext.get_output_mapping.<locals>.<lambda>)key)rX   r   r   )r-   mappingr   r   r   r   7  s   zbuild_ext.get_output_mappingc                    s6    fdd j D }t|  }tdd |D S )Nc                 3   s4    | ]}|j rtjj jg|jd R  V  qdS )r0   N)rI   r7   r8   r6   r:   rn   r5   ri   rh   r   r   r   >  s    
z0build_ext.__get_stubs_outputs.<locals>.<genexpr>c                 s   s    | ]	\}}|| V  qd S r}   r   )rj   baseZfnextr   r   r   r   E  r   )rF   	itertoolsproduct!_build_ext__get_output_extensionsr   )r-   Zns_ext_basespairsr   rh   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 d S )NrO   z.pycr;   z.pyo)rE   rU   rh   r   r   r   Z__get_output_extensionsG  s   
z!build_ext.__get_output_extensionsc                 C   s2   t jj|g|jdR  d }| ||| d S rN   )r7   r8   r6   rn   r5   rK   )r-   
output_dirr.   rD   	stub_filer   r   r   r   M  s    zbuild_ext.write_stubr   c                 C   s   t d|j| |rtj|rt|d | jsPt|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 |  |rY| | d S d S )Nz writing stub loader for %s to %sz 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   r   rn   r7   r8   rG   r   rw   openwriter6   r%   r9   rp   close_compile_and_remove_stub)r-   r   r.   rD   fr   r   r   rK   Q  sN   
zbuild_ext._write_stub_filec                 C   sp   ddl m} ||gdd| jd | dj}|dkr$||g|d| jd tj|r4| js6t| d S d S d S )Nr   )byte_compileT)rU   rx   rw   rS   )	Zdistutils.utilr   rw   rE   rU   r7   r8   rG   unlink)r-   r   r   rU   r   r   r   r   x  s   z"build_ext._compile_and_remove_stubN)F)"__name__
__module____qualname__r(   bool__annotations__r)   r+   r   r   r   rB   r,   rJ   r   rX   r4   rf   rl   rm   r   r   ro   r   r   r   r   r   r   r   r   r   rK   r   r   r   r   r   r
   Q   s0   
 
	&
'r
   c                 C   s(   |  | j|||||||||	|
|| d S r}   )linkZSHARED_LIBRARY)r-   objectsoutput_libnamer   ry   rq   rt   r~   debugextra_preargsextra_postargs
build_temptarget_langr   r   r   rz     s   rz   Zstaticc                 C   s^   |d u sJ t j|\}}t j|\}}| ddr$|dd  }| ||||| d S )Nr   r      )r7   r8   r5   r^   r`   
startswithZcreate_static_lib)r-   r   r   r   ry   rq   rt   r~   r   r   r   r   r   r=   r9   r.   r   r   r   rz     s   )
NNNNNr   NNNN)/r7   r   r   Zimportlib.machineryr   importlib.utilr   rV   typingr   r   r   r   pathlibr	   Zdistutils.command.build_extr
   Z_du_build_extZdistutils.ccompilerr   Zdistutils.sysconfigr   r   	distutilsr   Zsetuptools.errorsr   Zsetuptools.extensionr   r   ZCython.Distutils.build_extr*   
__import__ImportErrorr   r   r   r#   rb   ra   r   r3   Zdlhasattrr%   r'   rz   r   r   r   r   <module>   s~    

	  6!