B
    \ cI`                 @   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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d/  Zd0ejdd/  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d1d2 ZejrPejeejZnee Zej d3kre! "d4reej#eeeZd5ej$kreej$d5 Zd6d7 Z%e&ed8dZ'ej d3krd9d: Z(e(eZe(e'Z'dhd<d=Z)e)d>Z*e*rx&d?D ]Z+d@ee+ dA< dBee+ dC< qW dDdE Z,dFdG Z-dHdI Z.dJdK Z/dLdM Z0didNdOZ1dPd Z2djdQdRZ3dSdT Z4dUdV Z5dWdX Z6dkdYdZ7dZd Z8d[d Z9d\d	 Z:e/ dd>fd]d
Z;e/ dd>fd^dZ<d_d Z=d`d Z>dad Z?dbd Z@dcdd ZAdedf ZBeCdgkr eB  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-{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_userz%d.%d   z%d%dc             C   s"   yt | S  tk
r   | S X d S )N)r   OSError)path r   lib/python3.7/sysconfig.py_safe_realpathd   s    r   r   )z\pcbuild\win32z\pcbuild\amd64Z_PYTHON_PROJECT_BASEc             C   s.   x(dD ] }t jt j| d|rdS qW dS )N)z
Setup.distzSetup.localZModulesTF)osr   isfilejoin)dfnr   r   r   _is_python_source_diry   s    
r%   _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 )N)	_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   sf   y| j f |S  tk
r`   y| j f tjS  tk
rZ } ztd| d W d 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    r4   c             C   s4   |   }x&| D ]\}}||kr$q|| |< qW d S )N)keysitems)Ztarget_dictZ
other_dictZtarget_keyskeyvaluer   r   r   _extend_dict   s
    r9   c             C   sf   i }|d kri }t |t  xDt|   D ]4\}}tjdkrHtj|}tjt	||||< q*W |S )N)posixr   )
r9   r   _INSTALL_SCHEMESr6   r    namer   
expandusernormpathr4   )schemevarsresr7   r8   r   r   r   _expand_vars   s    
rB   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    
rC   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 )NPYTHONUSERBASEc              W   s   t jt jj|  S )N)r    r   r=   r"   )argsr   r   r   joinuser   s    z_getuserbase.<locals>.joinuserr   APPDATA~PythondarwinLibraryz%d.%dr   z.local)r    r0   getr<   sysplatform
_frameworkversion_info)env_baserF   baser   r   r   _getuserbase   s    


rS   c          	   C   sZ  ddl }|d}|d}|d}|dkr2i }i }i }t| dd}| }	W dQ R X x|	D ]}
|
ds`|
 d	kr|q`||
}|r`|d
d\}}| }|dd	}d|kr|||< q`yt	|}W n$ t
k
r   |dd||< Y q`X |||< q`W t| }d}x
t|dkrxt|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~|||< n~yt	|}W n" t
k
r   | ||< Y n
X |||< || |dr|dd |kr|dd }||kr|||< n|||< || q,W qW x.| D ]"\}}t|tr&| ||< q&W || |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int
ValueErrorlistr5   lentuplesearchstartstrr    r0   endremover6   
isinstanceupdate)filenamer@   r[   Z_variable_rxZ_findvar1_rxZ_findvar2_rxZdoneZnotdoneflineslinemnvZtmpvZ	variablesZrenamed_variablesr<   r8   Zm1Zm2founditemZafterkr   r   r   _parse_makefile   s    	


















ry   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,   hasattrrM   _PY_VERSION_SHORTrz   implementationr{   r   )Zconfig_dir_namer   r   r   r   M  s    
c             C   st   xTdD ]L}t j|d }|rJ| rJydd l}|j|}W n   d }Y nX |r|S qW djtjtj	t
tjdddS )N)Z_PYTHON_SYSCONFIGDATA_NAMEZ _CONDA_PYTHON_SYSCONFIGDATA_NAMEr   z+_sysconfigdata_{abi}_{platform}_{multiarch}r{   rW   )ZabirN   Z	multiarch)r    r0   rL   importlib.utilutil	find_specr.   rM   rz   rN   getattrr   )Zcheck_existsZenvvarrA   	importlibloaderr   r   r   _get_sysconfigdata_nameZ  s    

r   c           
   C   s  ddl } i }t }yt|| W nJ tk
rj } z,d| }t|drR|d|j  }t|W dd}~X Y nX t }y"t|}t|| W dQ R X W nJ tk
r } z,d| }t|dr|d|j  }t|W d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 dQ R X tdddd}||
 W d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	BLDSHAREDrJ   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ascii)pprintr   ry   r   r}   r   r   r]   r   r|   r   rM   rN   types
ModuleTypebuild_time_varsmodulesr   r~   r    makedirsr   r"   write)r   r@   ZmakefileemsgZconfig_hrp   r<   r   moduleZ
pybuilddirZdestfiler   r   r   _generate_posix_varsk  sL    






r   c             C   s2   t d}t|t t dgd}|j}| | dS )z7Initialize the module as appropriate for POSIX systems.Tr   r   N)r   
__import__globalslocalsr   rn   )r@   r<   Z_tempr   r   r   r   _init_posix  s    r   c             C   sV   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   ZLIBDESTr   Z
BINLIBDESTr   Z	INCLUDEPYz.pyd
EXT_SUFFIXz.exeZEXEZVERSIONZBINDIRN)r   _PY_VERSION_SHORT_NO_DOTr    r   dirnamer   rM   
executable)r@   r   r   r   _init_non_posix  s    r   c       	      C   s   |dkri }ddl }|d}|d}xx|  }|s8P ||}|r|dd\}}yt|}W n tk
rv   Y nX |||< q*||}|r*d||d< q*W |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_]+) [*]/
rX   r   )r[   r\   readliner`   ra   rc   rd   )	fpr@   r[   Z	define_rxZundef_rxrr   rs   rt   ru   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)r|   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.)rg   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)rB   r;   )r?   r@   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?   r@   r   r   r   r   r     s    c              G   s|  t dkrFi 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< y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t}tjdkrtrtjt }tj||}ntjt }t|t d< t	jdkrFddl}|t  | rtg }x| D ]}|t | qVW |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_baserR   Zinstalled_platbaseZplatbaseZprojectbaserz   rW   r   r:   r   SOuserbasesrcdirrJ   r   )_CONFIG_VARSr)   _EXEC_PREFIX_PY_VERSIONr~   r   _BASE_PREFIX_BASE_EXEC_PREFIXr,   rM   rz   r1   r    r<   r   r   rL   rS   r|   r   r   r   r"   r   rN   _osx_supportZcustomize_config_varsappend)rE   r   r   rR   r   Zvalsr<   r   r   r   r     sP    






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   rL   )r<   r   r   r   r   r   Y  s    c        
      C   s  t jdkr"dtj krdS tjS t jdks6tt ds<tjS dt jkrPt 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r(d| ||f S | dd dkrjd} 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-amd64r:   unameZ_PYTHON_HOST_PLATFORM/rW    _-N   Zlinuxz%s-%sZsunosr   5Zsolarisz%d.%srZ   r   Z32bitZ64bit)il    z.%sZaixz%s-%s.%s   cygwinz[\d.]+rJ   z%s-%s-%s)r    r<   rM   versionlowerrN   r}   r0   r   rb   rc   maxsizer[   r\   r`   ra   r   Zget_platform_osxr   )
ZosnameZhostreleaser   machineZbitnessr[   Zrel_rers   r   r   r   r   r   e  sF    


 



c               C   s   t S )N)r~   r   r   r   r   r     s    c             C   sJ   xDt t| D ]0\}\}}|dkr2td|   td||f  qW d S )Nr   z%s: z
	%s = "%s")	enumerater   r6   print)titler   indexr7   r8   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)
rM   argvr   r   r   r   rC   r   r
   r   r   r   r   r   _main  s    
r   __main__)F)N)F)N)D__doc__r    rM   os.pathr   r   __all__r;   r   r   splitr   rP   r~   r   r   r>   r   r)   base_prefixr   r   r   base_exec_prefixr   r   Z
_USER_BASEr   r   r   r,   getcwdr<   r   endswithr"   r0   r%   r   r+   r*   r-   r|   r?   r4   r9   rB   rC   rS   ry   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   __name__r   r   r   r   <module>   s   

		
|
?
 ML
