3
,6`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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dnZej	j
 d Zd5ejdd6  Zd7ejdd6  ZejjejZejjejZejjejZejjejZdadZd8d9 ZejrPejjeejZneej Zej d:krej! j"doreejj#eeeZd=ej$kreej$d= Zd>d? Z%e&ed@dZ'e'rej d:kre'j! j"dprejjejje'Z'dqdBdCZ(e(dDZ)e)r0x&drD ]Z*dGee* d2< dHee* dI< qW dJdK Z+dLdM Z,dNdO Z-dPdQ Z.dRdS Z/dsdTdUZ0dVd Z1dWdX Z2dYdZ Z3d[d\ Z4d]d^ Z5dtd_dZ6d`d Z7dad Z8dbd	 Z9e. ddDfdcd
Z:e. ddDfdddZ;ded Z<dfd Z=dgd Z>dhd Z?didj Z@dkdl ZAeBdmkreA  dS )uz-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_userr   r   r   r   r   r   r   z%d.%d   z%d%dc             C   s"   yt | S  tk
r   | S X d S )N)r   OSError)path r   /usr/lib/python3.6/sysconfig.py_safe_realpathc   s    r   r   \pcbuild\win32\pcbuild\amd64Z_PYTHON_PROJECT_BASEc             C   s.   x(dD ] }t jjt jj| d|rdS qW dS )N
Setup.distSetup.localZModulesTF)r"   r#   )osr   isfilejoin)dfnr   r   r   _is_python_source_dirx   s    
r)   Z_homeFc             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,   Tr   r   z{srcdir}/Includez{projectbase}/.r   c             C   sd   y| j f |S  tk
r^   y| j f tjS  tk
rX } ztd| W Y d d }~X nX Y nX d S )Nz{%s})formatKeyErrorr$   environAttributeError)sZ
local_varsZvarr   r   r   _subst_vars   s    r2   c             C   s4   | j  }x&|j 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
    r7   c             C   sf   i }|d kri }t |t  xDt|  j D ]4\}}tjdkrHtjj|}tjjt	||||< q*W |S )Nposixr   )r8   r   )
r7   r   _INSTALL_SCHEMESr4   r$   namer   
expandusernormpathr2   )schemevarsZresr5   r6   r   r   r   _expand_vars   s    
r?   c               C   s   t jdkrdS t jS )Nr8   r   )r$   r:   r   r   r   r   _get_default_scheme   s    
r@   c              C   s   t jjdd } dd }t jdkrBt jjdp.d}| r8| S ||dS tjdkr|td	}|r|| r`| S |dd
|dtjd d  S | r| S |ddS d S )NZPYTHONUSERBASEc              W   s   t jjt jj|  S )N)r$   r   r;   r&   )argsr   r   r   joinuser   s    z_getuserbase.<locals>.joinuserr   ZAPPDATA~ZPythondarwinZPYTHONFRAMEWORKZLibraryz%d.%dr   z.local)r$   r/   getr:   sysplatformr   version_info)Zenv_baserB   baseZ	frameworkr   r   r   _getuserbase   s"    



rJ   c             C   sZ  ddl }|jd}|jd}|jd}|dkr2i }i }i }t| dd}|j }	W dQ R X x|	D ]}
|
jds`|
j d	kr|q`|j|
}|r`|jd
d\}}|j }|jdd	}d|kr|||< q`yt	|}W n$ t
k
r   |jdd||< Y q`X |||< q`W t|j }d}x
t|dkrxt|D ]}|| }|j|}|j|}|rv|rv|j |j k rp|n|}n|r|n|}|dk	r|jd
}d}||krt|| }n||krd}nx|tjkrtj| }n`||kr0|jdr
|dd |kr
d	}n$d| |krd}nt|d|  }nd	 ||< }|r||j d }|d|j  | | }d|kr~|||< n~yt	|}W n" t
k
r   |j ||< Y n
X |||< |j| |jdr|dd |kr|dd }||kr|||< n|||< |j| q,W qW x.|j D ]"\}}t|tr&|j ||< q&W |j| |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$$$CFLAGSLDFLAGSCPPFLAGSTFZPY_   )rQ   rR   rS   )recompileopen	readlines
startswithstripmatchgroupreplaceint
ValueErrorlistr3   lentuplesearchstartstrr$   r/   endremover4   
isinstanceupdate)filenamer>   rU   Z_variable_rxZ_findvar1_rxZ_findvar2_rxZdoneZnotdoneflineslinemnvZtmpvZ	variablesZrenamed_variablesr:   r6   Zm1Zm2founditemZafterkr   r   r   _parse_makefile   s    	


















rt   c              C   sd   t rtj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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+   hasattrrF   _PY_VERSION_SHORTru   implementationrv   r   )Zconfig_dir_namer   r   r   r   L  s    
c            	   C   s(   t jjddjtjtjttjdddS )NZ_PYTHON_SYSCONFIGDATA_NAMEz+_sysconfigdata_{abi}_{platform}_{multiarch}rv   rN   )ZabirG   	multiarch)	r$   r/   rE   r-   rF   ru   rG   getattrrz   r   r   r   r   _get_sysconfigdata_nameY  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 Y dd}~X 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 Y dd}~X nX t	r|d |d< t
 }dtjkr$ddl}|j|}	||	_|	tj|< d	t tf }
ttd
rF|
d7 }
tj|
dd tjj|
|d }t|ddd(}|jd |jd | j ||d W dQ R X tdddd}|j|
 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	BLDSHAREDrD   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   rt   r   rx   r~   r   rW   r   rw   r}   rF   rG   types
ModuleTypebuild_time_varsmodulesr   ry   r$   makedirsr   r&   write)r   r>   ZmakefileemsgZconfig_hrk   r:   r   moduleZ
pybuilddirZdestfiler   r   r   _generate_posix_varsb  sL    






r   c             C   s0   t  }t|t t dgd}|j}| j| dS )z7Initialize the module as appropriate for POSIX systems.r   r   N)r}   
__import__globalslocalsr   ri   )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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   rF   
executable)r>   r   r   r   _init_non_posix  s    r   c       	      C   s   |dkri }ddl }|jd}|jd}xx| j }|s8P |j|}|r|jdd\}}yt|}W n tk
rv   Y nX |||< q*|j|}|r*d||j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_]+) [*]/
rO   r   )rU   rV   readliner[   r\   r^   r_   )	fpr>   rU   Z	define_rxZundef_rxrm   rn   ro   rp   r   r   r   r     s*    




c              C   sB   t r,tjdkr"tjjtptd} q4tp(t} ntd} tjj| dS )zReturn the path of pyconfig.h.r   ZPCr   z
pyconfig.h)rw   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.)rb   sortedr9   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)r?   r9   )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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< 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 jd}|dk	r|t d< t t d< td}|rd| t d< ndt d< t jdt}tjdkr>tr0tjjt }tjj||}ntjjt }t|t d< t	jdkrhddl}|jt  | rg }x| D ]}|jt j| qxW |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_baserI   Zinstalled_platbaseZplatbaseZprojectbaseru   rN   r   r8   r   SOZuserbaseZ	MULTIARCH/ZmultiarchsubdirsrcdirrD   r   )_CONFIG_VARS_PREFIX_EXEC_PREFIX_PY_VERSIONry   r   _BASE_PREFIX_BASE_EXEC_PREFIXr+   rF   ru   r0   r$   r:   r   r   rE   rJ   r   rw   r   r   r   r&   r   rG   _osx_supportZcustomize_config_varsappend)rA   r   r{   r   rI   r   Zvalsr:   r   r   r   r     sX    






c             C   s*   | dkrddl }|jdtd t j| 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   rE   )r:   r   r   r   r   r   V  s    c              C   s  t jdkrnd} tjj| }|d)kr(tjS tjjd|}tj|t|  | j }|dkr\dS |dkrhdS tjS t jd	kstt d
 rtjS dt j	krt j	d S t j
 \}}}}}|j jdd}|jdd}|jdd}|dd dkrd||f S |dd dkrV|d dkrd}dt|d d |dd f }ddd}	|d|	tj  7 }n|dd  d!krtd||f S |dd d"krd#|||f S |dd$ d%krd%}ddl}
|
jd&}|j|}|r|j }n2|dd$ d'krddl}|j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; eg. for IRIX
    the architecture isn't particularly important (IRIX only runs on SGI
    hardware), but for Linux the kernel version isn't particularly
    important.

    Examples of returned values:
       linux-i586
       linux-alpha (?)
       solaris-2.6-sun4u
       irix-5.3
       irix64-6.2

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

    For other non-POSIX platforms, currently just returns 'sys.platform'.
    r   z bit (rO   )Zamd64z	win-amd64Zitaniumzwin-ia64r8   unameZ_PYTHON_HOST_PLATFORMr   rN    _-N   Zlinuxz%s-%sZsunosr   5Zsolarisz%d.%srT   r   Z32bitZ64bit)il    z.%s   ZirixZaixz%s-%s.%s   cygwinz[\d.]+rD   z%s-%s-%s)r$   r:   rF   versionfindrG   ra   lowerrx   r/   r   r]   r^   maxsizerU   rV   r[   r\   r   Zget_platform_osxr   )r   ijZlookZosnameZhostreleaser   machineZbitnessrU   Zrel_rern   r   r   r   r   r   b  sZ    


 



c               C   s   t S )N)ry   r   r   r   r   r     s    c             C   sJ   xDt t|j D ]0\}\}}|dkr2td|   td||f  qW d S )Nr   z%s: z
	%s = "%s")	enumerater   r4   print)titler   indexr5   r6   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)
rF   argvr   r   r   r   r@   r   r
   r   r   r   r   r   _main  s    
r   __main__)r   r   r   r   r   r   r   )r    r!   )r    r!   )F)r   r   )N)N)C__doc__r$   rF   os.pathr   r   __all__r9   r   r   splitr   rH   ry   r   r   r<   r   r   base_prefixr   r   r   base_exec_prefixr   r   Z
_USER_BASEr   r   r   r+   getcwdr:   r   endswithr&   r/   r)   r|   r*   r,   rw   r=   r2   r7   r?   r@   rJ   rt   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[
