U
    pda                     @   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re" #d5reej$eeeZd6ej%kreej%d6 Zd7d8 Z&e'ed9dZ(ej!d4krd: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rt
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rt|| }n||krd}nx|tjkrt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~|||< nz|t	krt
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 )zParse 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 )zParse 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 )zReturn 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rtt  tjdkrtt  t d}|dk	r|t d< t t d< td}|rd| 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  | rg }| 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 )zReturn 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rd| |f S | dd dkr,|d dkrd} 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rd"} ddl}|d#}||}|r| }n2| dd! d$krd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
