U
    ¼Ê¦iËa  ã                   @   s  d Z ddlZddlZddlmZmZ dddddd	d
ddddgZdhZdddddddddœdddddddddœddddddd ddœd!d!d"d"d#d$d%d&œd'd'd(d(d)d*d%d&œd+d+d,d,d-d*d%d&œd.œZd&Z	ej
 ¡ d Zd/ejdd0…  Zd1ejdd0…  Zej ej¡Zej ej¡Zej ej¡Zej ej¡ZdadZd2d3„ Zej�rVej eejƒ¡Znee  ¡ ƒZej!d4k�r’e "¡  #d5¡�r’eej $eee¡ƒZd6ej%k�r¬eej%d6 ƒZd7d8„ Z&e'ed9dƒZ(ej!d4k�räd:d;„ Z)e)eƒZe)e(ƒZ(did=d>„Z*e*d?ƒZ+e+�r d@D ]Z,dAee, dB< dCee, dD< �q dEdF„ Z-dGdH„ Z.dIdJ„ Z/dKdL„ Z0dMdN„ Z1djdOdP„Z2dQd„ Z3dRdS„ Z4dTdU„ Z5dVdW„ Z6dXdY„ Z7dkdZd„Z8d[d„ Z9d\d„ Z:d]d	„ Z;e0ƒ dd?fd^d
„Z<e0ƒ dd?fd_d„Z=d`d„ Z>dad„ Z?dbd„ Z@dcd„ ZAddde„ ZBdfdg„ ZCeDdhk�r eCƒ  dS )lz-Access to Python's configuration information.é    N)ÚpardirÚrealpathÚget_config_h_filenameÚget_config_varÚget_config_varsÚget_makefile_filenameÚget_pathÚget_path_namesÚ	get_pathsÚget_platformÚget_python_versionÚget_scheme_namesÚparse_config_hZMACOSX_DEPLOYMENT_TARGETz-{installed_base}/lib/python{py_version_short}z'{platbase}/lib/python{py_version_short}z1{base}/lib/python{py_version_short}/site-packagesz5{platbase}/lib/python{py_version_short}/site-packagesz;{installed_base}/include/python{py_version_short}{abiflags}z?{installed_platbase}/include/python{py_version_short}{abiflags}z
{base}/binz{base})ÚstdlibÚ
platstdlibÚpurelibÚplatlibÚincludeÚplatincludeÚscriptsÚdataz{installed_base}/lib/pythonz{base}/lib/pythonz{installed_base}/include/pythonz{installed_base}/Libz
{base}/Libz{base}/Lib/site-packagesz{installed_base}/Includez{base}/Scriptsz#{userbase}/Python{py_version_nodot}z1{userbase}/Python{py_version_nodot}/site-packagesz+{userbase}/Python{py_version_nodot}/Includez+{userbase}/Python{py_version_nodot}/Scriptsz
{userbase})r   r   r   r   r   r   r   z'{userbase}/lib/python{py_version_short}z5{userbase}/lib/python{py_version_short}/site-packagesz+{userbase}/include/python{py_version_short}z{userbase}/binz{userbase}/lib/pythonz#{userbase}/lib/python/site-packagesz{userbase}/include)Úposix_prefixÚ
posix_homeÚntZnt_userZ
posix_userZosx_framework_userú%d.%dé   z%d%dc                 C   s(   z
t | ƒW S  tk
r"   |  Y S X d S ©N)r   ÚOSError)Úpath© r   ú/usr/lib/python3.8/sysconfig.pyÚ_safe_realpathi   s    
r!   r   )z\pcbuild\win32z\pcbuild\amd64Z_PYTHON_PROJECT_BASEc                 C   s,   dD ]"}t j t j | d|¡¡r dS qdS )N)ZSetupzSetup.localZModulesTF)Úosr   ÚisfileÚjoin)ÚdÚfnr   r   r    Ú_is_python_source_dir~   s    r'   Z_homec                 C   s0   | r,t j | ¡ t j t j td¡¡¡r,tS | S )NZPCbuild)r"   r   ÚnormcaseÚ
startswithr$   Ú_PREFIX)r%   r   r   r    Ú_fix_pcbuild‡   s
    ÿr+   Fc                 C   s   | rt rtt ƒS ttƒS r   )Ú	_sys_homer'   Ú_PROJECT_BASE)Z
check_homer   r   r    Úis_python_build�   s    r.   T)r   r   z{srcdir}/Includer   z{projectbase}/.r   c                 C   sn   z| j f |ŽW S  tk
rh   z| j f tjŽW  Y S  tk
rb } ztd| ƒd ‚W 5 d }~X Y nX Y nX d S )Nz{%s})ÚformatÚKeyErrorr"   ÚenvironÚAttributeError)ÚsZ
local_varsÚvarr   r   r    Ú_subst_varsœ   s    r5   c                 C   s0   |   ¡ }| ¡ D ]\}}||kr"q|| |< qd S r   )ÚkeysÚitems)Ztarget_dictZ
other_dictZtarget_keysÚkeyÚvaluer   r   r    Ú_extend_dict¥   s
    r:   c                 C   sb   i }|d kri }t |tƒ ƒ t|   ¡ D ]4\}}tjdkrFtj |¡}tj t	||ƒ¡||< q(|S )N)Úposixr   )
r:   r   Ú_INSTALL_SCHEMESr7   r"   Únamer   Ú
expanduserÚnormpathr5   )ÚschemeÚvarsÚresr8   r9   r   r   r    Ú_expand_vars­   s    
rC   c                   C   s   t jdkrdS t jS )Nr;   r   )r"   r=   r   r   r   r    Ú_get_default_schemeº   s    
rD   c                  C   sz   t j dd ¡} | r| S dd„ }t jdkrBt j d¡p6d}||dƒS tjdkrptjrp|dd	tjd
tjd d…  ƒS |ddƒS )NZPYTHONUSERBASEc                  W   s   t j t jj| Ž ¡S r   )r"   r   r>   r$   )Úargsr   r   r    ÚjoinuserÈ   s    z_getuserbase.<locals>.joinuserr   ZAPPDATAú~ZPythonÚdarwinZLibraryr   r   z.local)r"   r1   Úgetr=   ÚsysÚplatformÚ
_frameworkÚversion_info)Zenv_baserF   Úbaser   r   r    Ú_getuserbaseÃ   s    


ÿrO   c              	   C   s`  ddl }| d¡}| d¡}| d¡}|dkr2i }i }i }t| dd��}| ¡ }	W 5 Q R X |	D ]¦}
|
 d¡s^|
 ¡ d	krzq^| |
¡}|r^| d
d¡\}}| ¡ }| dd	¡}d|kr¾|||< q^z|t	krÌt
‚t|ƒ}W n$ t
k
rú   | dd¡||< Y q^X |||< q^t| ¡ ƒ}d}t|ƒdk�r&t|ƒD �]ò}|| }| |¡}| |¡}|�rv|�rv| ¡ | ¡ k �rp|n|}n|�r€|n|}|dk	�r| d
¡}d}||k�r´t|| ƒ}nˆ||k�rÄd}nx|tjk�rÜtj| }n`||k�r0| d¡�r
|dd… |k�r
d	}n$d| |k�rd}nt|d|  ƒ}nd	 ||< }|�r|| ¡ d… }|d| ¡ … | | }d|k�r~|||< nŒz|t	k�rŽt
‚t|ƒ}W n" t
k
�rº   | ¡ ||< Y n
X |||< | |¡ | d¡�r|dd… |k�r|dd… }||k�r|||< n|||< | |¡ �q,�q| ¡ D ]"\}}t|tƒ�r.| ¡ ||< �q.| |¡ |S )zÌParse a Makefile-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    r   Nz"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)z\$\(([A-Za-z][A-Za-z0-9_]*)\)z\${([A-Za-z][A-Za-z0-9_]*)}Úsurrogateescape)Úerrorsú#Ú é   r   z$$ú$)ZCFLAGSZLDFLAGSZCPPFLAGSTFZPY_é   )ÚreÚcompileÚopenÚ	readlinesr)   ÚstripÚmatchÚgroupÚreplaceÚ_ALWAYS_STRÚ
ValueErrorÚintÚlistr6   ÚlenÚtupleÚsearchÚstartÚstrr"   r1   ÚendÚremover7   Ú
isinstanceÚupdate)ÚfilenamerA   rW   Z_variable_rxZ_findvar1_rxZ_findvar2_rxZdoneZnotdoneÚfÚlinesÚlineÚmÚnÚvZtmpvZ	variablesZrenamed_variablesr=   r9   Zm1Zm2ÚfoundÚitemZafterÚkr   r   r    Ú_parse_makefileÖ   s¢    	












ÿ



ÿ


rv   c                  C   sd   t rtj tptd¡S ttdƒr0dttj	f } nd} ttj
dƒrP| dtj
j 7 } tj tdƒ| d¡S )z Return the path of the Makefile.ZMakefileÚabiflagszconfig-%s%sZconfigÚ
_multiarchz-%sr   )Ú_PYTHON_BUILDr"   r   r$   r,   r-   ÚhasattrrJ   Ú_PY_VERSION_SHORTrw   Úimplementationrx   r   )Zconfig_dir_namer   r   r    r   W  s    
c                	   C   s$   t j ddjtjttjddƒd�¡S )NZ_PYTHON_SYSCONFIGDATA_NAMEz _sysconfigdata_{abi}_{multiarch}rx   rS   )ZabiÚ	multiarch)r"   r1   rI   r/   rJ   rw   Úgetattrr|   r   r   r   r    Ú_get_sysconfigdata_named  s    þÿr   c               
   C   sÊ  ddl } i }tƒ }zt||ƒ W nJ tk
rj } z,d| }t|dƒrR|d|j  }t|ƒ‚W 5 d}~X Y nX tƒ }z"t|ƒ�}t||ƒ W 5 Q R X W nJ tk
rÞ } z,d| }t|dƒrÆ|d|j  }t|ƒ‚W 5 d}~X Y nX t	rð|d |d< t
ƒ }dtjk�r$ddl}| |¡}	||	_|	tj|< d	tƒ tf }
ttd
ƒ�rF|
d7 }
tj|
dd� tj |
|d ¡}t|ddd��(}| d¡ | d¡ | j ||d� W 5 Q R X tdddd��}| |
¡ W 5 Q R X dS )z;Generate the Python module containing build-time variables.r   Nz.invalid Python installation: unable to open %sÚstrerrorz (%s)ZLDSHAREDZ	BLDSHAREDrH   zbuild/lib.%s-%sZgettotalrefcountz-pydebugT)Úexist_okz.pyÚwÚutf8)ÚencodingzB# system configuration generated and used by the sysconfig module
zbuild_time_vars = )Ústreamzpybuilddir.txt)Úpprintr   rv   r   rz   r€   r   rY   r   ry   r   rJ   rK   ÚtypesÚ
ModuleTypeÚbuild_time_varsÚmodulesr   r{   r"   Úmakedirsr   r$   Úwrite)r†   rA   ZmakefileÚeÚmsgZconfig_hrm   r=   r‡   ÚmoduleZ
pybuilddirZdestfiler   r   r    Ú_generate_posix_varsl  sL    






r�   c                 C   s0   t ƒ }t|tƒ tƒ dgdƒ}|j}|  |¡ dS )z7Initialize the module as appropriate for POSIX systems.r‰   r   N)r   Ú
__import__ÚglobalsÚlocalsr‰   rk   )rA   r=   Z_tempr‰   r   r   r    Ú_init_posix«  s    r”   c                 C   sf   ddl }tdƒ| d< tdƒ| d< tdƒ| d< | ¡ d | d	< d
| d< t| d< tj ttj	ƒ¡| d< dS )z+Initialize the module as appropriate for NTr   Nr   ZLIBDESTr   Z
BINLIBDESTr   Z	INCLUDEPYÚ
EXT_SUFFIXz.exeZEXEZVERSIONZBINDIR)
Ú_impr   Úextension_suffixesÚ_PY_VERSION_SHORT_NO_DOTr"   r   Údirnamer!   rJ   Ú
executable)rA   r–   r   r   r    Ú_init_non_posix³  s    r›   c           	      C   s®   |dkri }ddl }| d¡}| d¡}|  ¡ }|s6qª| |¡}|rŒ| dd¡\}}z|tkrbt‚t|ƒ}W n tk
r€   Y nX |||< q(| |¡}|r(d|| d¡< q(|S )zÌParse a config.h-style file.

    A dictionary containing name/value pairs is returned.  If an
    optional dictionary is passed in as the second argument, it is
    used instead of a new dictionary.
    Nr   z"#define ([A-Z][A-Za-z0-9_]+) (.*)
z&/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/
rT   r   )rW   rX   Úreadliner\   r]   r_   r`   ra   )	ÚfprA   rW   Z	define_rxZundef_rxro   rp   rq   rr   r   r   r    r   Ä  s,    




c                  C   sB   t r,tjdkr"tj tptd¡} q4tp(t} ntdƒ} tj | d¡S )zReturn the path of pyconfig.h.r   ZPCr   z
pyconfig.h)ry   r"   r=   r   r$   r,   r-   r   )Zinc_dirr   r   r    r   æ  s    

c                   C   s   t ttƒƒS )z,Return a tuple containing the schemes names.)rd   Úsortedr<   r   r   r   r    r   ò  s    c                   C   s   t S )z*Return a tuple containing the paths names.)Ú_SCHEME_KEYSr   r   r   r    r	   ÷  s    c                 C   s   |rt | |ƒS t|  S dS )z°Return a mapping containing an install scheme.

    ``scheme`` is the install scheme name. If not provided, it will
    return the default scheme for the current platform.
    N)rC   r<   )r@   rA   Úexpandr   r   r    r
   ü  s    
c                 C   s   t |||ƒ|  S )z[Return a path corresponding to the scheme.

    ``scheme`` is the install scheme name.
    )r
   )r=   r@   rA   r    r   r   r    r     s    c                  G   sš  t dk�rhi a tt d< tt d< tt d< tt d< tt d< tt d< tt d< tt d	< tt d
< tt d< zt	j
t d< W n tk
rˆ   dt d< Y nX tjdkrœtt ƒ tjdkr®tt ƒ t  d¡}|dk	rÈ|t d< tƒ t d< tdƒ}|rìd| t d< ndt d< t  dt¡}tjdk�r>t�r0tj tƒ ¡}tj ||¡}ntj tƒ ¡}t|ƒt d< t	jdk�rhddl}| t ¡ | �r’g }| D ]}| t  |¡¡ �qv|S t S dS )an  With no arguments, return a dictionary of all configuration
    variables relevant for the current platform.

    On Unix, this means every variable defined in Python's installed Makefile;
    On Windows it's a much smaller set.

    With arguments, return a list of values that result from looking up
    each argument in the configuration variable dictionary.
    NÚprefixÚexec_prefixZ
py_versionZpy_version_shortZpy_version_nodotZinstalled_baserN   Zinstalled_platbaseZplatbaseZprojectbaserw   rS   r   r;   r•   ÚSOZuserbaseZ	MULTIARCHú/ZmultiarchsubdirÚsrcdirrH   r   )Ú_CONFIG_VARSr*   Ú_EXEC_PREFIXÚ_PY_VERSIONr{   r˜   Ú_BASE_PREFIXÚ_BASE_EXEC_PREFIXr-   rJ   rw   r2   r"   r=   r›   r”   rI   rO   r   ry   r   r™   r   r$   r!   rK   Ú_osx_supportZcustomize_config_varsÚappend)rE   r£   r}   r¥   rN   r«   Zvalsr=   r   r   r    r     sX    





c                 C   s*   | dkrddl }| dtd¡ tƒ  | ¡S )z“Return the value of a single variable using the dictionary returned by
    'get_config_vars()'.

    Equivalent to get_config_vars().get(name)
    r£   r   Nz SO is deprecated, use EXT_SUFFIXr   )ÚwarningsÚwarnÚDeprecationWarningr   rI   )r=   r­   r   r   r    r   c  s    c            
      C   sÎ  t jdkrFdtj ¡ krdS dtj ¡ kr.dS dtj ¡ kr@dS tjS t jdksZtt d	ƒs`tjS d
t jkrtt jd
 S t  ¡ \} }}}}|  ¡  	dd¡} | 	dd¡}| 	dd¡}| dd… dkrÊd| |f S | dd… dk�r,|d dk�rÀd} dt
|d ƒd |dd… f }dddœ}|d|tj  7 }n”| dd… dk�rLd | ||f S | dd!… d"k�rŽd"} ddl}| d#¡}| |¡}|�rÀ| ¡ }n2| dd!… d$k�rÀddl}	|	 tƒ | ||¡\} }}d%| ||f S )&aö  Return a string that identifies the current platform.

    This is used mainly to distinguish platform-specific build directories and
    platform-specific built distributions.  Typically includes the OS name and
    version and the architecture (as supplied by 'os.uname()'), although the
    exact information included depends on the OS; on Linux, the kernel version
    isn't particularly important.

    Examples of returned values:
       linux-i586
       linux-alpha (?)
       solaris-2.6-sun4u

    Windows will return one of:
       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
       win32 (all others - specifically, sys.platform is returned)

    For other non-POSIX platforms, currently just returns 'sys.platform'.

    r   Zamd64z	win-amd64z(arm)z	win-arm32z(arm64)z	win-arm64r;   ÚunameZ_PYTHON_HOST_PLATFORMr¤   rS   ú Ú_ú-Né   Zlinuxz%s-%sZsunosr   Ú5Zsolarisz%d.%srV   r   Z32bitZ64bit)iÿÿÿl   ÿÿÿÿ z.%sZaixz%s-%s.%sé   Úcygwinz[\d.]+rH   z%s-%s-%s)r"   r=   rJ   ÚversionÚlowerrK   rz   r1   r°   r^   ra   ÚmaxsizerW   rX   r\   r]   r«   Zget_platform_osxr   )
ZosnameZhostÚreleaser¸   ÚmachineZbitnessrW   Zrel_rerp   r«   r   r   r    r   o  sT    


 



  þ
c                   C   s   t S r   )r{   r   r   r   r    r   ¿  s    c                 C   sF   t t| ¡ ƒƒD ]0\}\}}|dkr0td|  ƒ td||f ƒ qd S )Nr   z%s: z
	%s = "%s")Ú	enumeraterž   r7   Úprint)Útitler   Úindexr8   r9   r   r   r    Ú_print_dictÃ  s    rÁ   c                   C   sf   dt jkrtƒ  dS tdtƒ  ƒ tdtƒ  ƒ tdtƒ  ƒ tƒ  tdtƒ ƒ tƒ  tdt	ƒ ƒ dS )z*Display all information sysconfig detains.z--generate-posix-varsNzPlatform: "%s"zPython version: "%s"z!Current installation scheme: "%s"ZPathsZ	Variables)
rJ   Úargvr�   r¾   r   r   rD   rÁ   r
   r   r   r   r   r    Ú_mainÊ  s    
rÃ   Ú__main__)F)N)N)EÚ__doc__r"   rJ   Úos.pathr   r   Ú__all__r_   r<   rŸ   r¸   Úsplitr¨   rM   r{   r˜   r   r?   r¡   r*   Úbase_prefixr©   r¢   r§   Úbase_exec_prefixrª   r¦   Z
_USER_BASEr!   rš   r™   r-   Úgetcwdr=   r¹   Úendswithr$   r1   r'   r~   r,   r+   r.   ry   r@   r5   r:   rC   rD   rO   rv   r   r   r�   r”   r›   r   r   r   r	   r
   r   r   r   r   r   rÁ   rÃ   Ú__name__r   r   r   r    Ú<module>   sþ   õÿöøøù
ù
ùÌ?ÿ
		
 ?
"SP
