
+c`J`                 @   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 i d  d d! d d" d d" d d" d d# d d# d d d d i d$ d d% d d& d d' d d' d d( d d( d d) d d i d* d d+ d d+ d d, d d, d d- d d. d d/ i d0 d d1 d d1 d d2 d d2 d d3 d d4 d d/ i d5 d d6 d d6 d d7 d d7 d d8 d d4 d d/ i i Z dk Z e j	 j
   d Z e j	 d d9  Z e d e d: 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 d; d<   Z e j rde j j e e j   Z n e e j    Z e j d$ k re j    j! dl  re e j j" e e e   Z d? e j# k re e j# d?  Z d@ dA   Z$ e% e dB d  Z& e& r@e j d$ k r@e& j    j! dm  r@e j j e j j e&   Z& dC dD dE  Z' e' dF  Z( e( rx* dn D]" Z) dG e e) d <dH e e) d <qhWdI dJ   Z* dK dL   Z+ dM dN   Z, dO dP   Z- dQ dR   Z. d dS dT  Z/ dU d   Z0 dV dW   Z1 dX dY   Z2 dZ d[   Z3 d d\ d  Z4 d] d   Z5 d^ d   Z6 d_ d	   Z7 e-   d dF d` d
  Z8 e-   d dF da d  Z9 db d   Z: dc d   Z; dd d   Z< de d   Z= df dg   Z> dh di   Z? e@ dj k re?   d S)oz-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_hposix_prefixstdlibz-{installed_base}/lib/python{py_version_short}
platstdlibz'{platbase}/lib/python{py_version_short}purelibz1{base}/lib/python{py_version_short}/site-packagesplatlibz5{platbase}/lib/python{py_version_short}/site-packagesincludez;{installed_base}/include/python{py_version_short}{abiflags}platincludez?{installed_platbase}/include/python{py_version_short}{abiflags}scriptsz
{base}/bindataz{base}
posix_homez{installed_base}/lib/pythonz{base}/lib/pythonz{installed_base}/include/pythonntz{installed_base}/Libz
{base}/Libz{base}/Lib/site-packagesz{installed_base}/Includez{base}/ScriptsZnt_userz#{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}Z
posix_userz'{userbase}/lib/python{py_version_short}z5{userbase}/lib/python{py_version_short}/site-packagesz+{userbase}/include/python{py_version_short}z{userbase}/binZosx_framework_userz{userbase}/lib/pythonz#{userbase}/lib/python/site-packagesz{userbase}/include      c             C   s+   y t  |   SWn t k
 r& |  SYn Xd  S)N)r   OSError)path r   /usr/lib/python3.5/sysconfig.py_safe_realpathc   s    r    \pcbuild\win32\pcbuild\amd64Z_PYTHON_PROJECT_BASEc             C   s=   x6 d D]. } t  j j t  j j |  d |   r d Sq Wd 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   St t  S)N)	_sys_homer*   _PROJECT_BASE)Z
check_homer   r   r   is_python_build   s    
r-   Tz{srcdir}/Includez{projectbase}/.c             C   sv   y |  j  |   SWn^ t k
 rq y |  j  t j   SWn5 t k
 rl } z t d |   WYd  d  } ~ Xn XYn Xd  S)Nz{%s})formatKeyErrorr%   environAttributeError)sZ
local_varsZvarr   r   r   _subst_vars   s    r3   c             C   sF   |  j    } x3 | j   D]% \ } } | | k r4 q | |  | <q Wd  S)N)keysitems)Ztarget_dictZ
other_dictZtarget_keyskeyvaluer   r   r   _extend_dict   s
    r8   c             C   s   i  } | d  k r i  } t  | t    x^ t |  j   D]L \ } } t j d k rf t j j |  } t j j t	 | |   | | <q9 W| S)Nposixr   )zposixznt)
r8   r   _INSTALL_SCHEMESr5   r%   namer   
expandusernormpathr3   )schemevarsZresr6   r7   r   r   r   _expand_vars   s    #r@   c               C   s   t  j d k r d St  j S)Nr9   r   )r%   r;   r   r   r   r   _get_default_scheme   s    rA   c              C   s   t  j j d d   }  d d   } t  j d k r_ t  j j d  pE d } |  rR |  S| | d  St j d k r t d	  } | r |  r |  S| d d
 | d t j d  d   S|  r |  S| d d  Sd  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%   r0   getr;   sysplatformr   version_info)Zenv_baserC   baseZ	frameworkr   r   r   _getuserbase   s"    rK   c             C   sO  d d l  } | j d  } | j d  } | j d  } | d k rK i  } i  } i  } t |  d d  } | j   }	 Wd QRXx |	 D] }
 |
 j d  s |
 j   d	 k r q | j |
  } | r | j d
 d  \ } } | j   } | j d d	  } d | k r| | | <q y t	 |  } Wn( t
 k
 rN| j d d  | | <Yq X| | | <q Wt | j    } d } xt |  d k rxqt |  D]c} | | } | j |  } | j |  } | r| r| j   | j   k  r| n | } n | r| n | } | d k	 r| j d
  } d } | | k rJt | |  } n | | k r_d } n | t j k r~t j | } nx | | k r| j d  r| d d  | k rd	 } qd | | k rd } qt | d |  } n d	 | | <} | r| | j   d  } | d | j    | | } d | k rI| | | <qy t	 |  } Wn" t
 k
 r}| j   | | <Yn X| | | <| j |  | j d  r| d d  | k r| d d  } | | k r| | | <q| | | <| j |  qWqxWx9 | 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_]*)}errorssurrogateescape#    r   z$$$CFLAGSLDFLAGSCPPFLAGSTFZPY_r   )rR   rS   rT   )recompileopen	readlines
startswithstripmatchgroupreplaceint
ValueErrorlistr4   lentuplesearchstartstrr%   r0   endremover5   
isinstanceupdate)filenamer?   rU   Z_variable_rxZ_findvar1_rxZ_findvar2_rxZdoneZnotdoneflineslinemnvZtmpvZ	variablesZrenamed_variablesr;   r7   Zm1Zm2founditemZafterkr   r   r   _parse_makefile   s    	!
'			

rt   c              C   s   t  r t j j t p t d  St t d  rD d 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,   hasattrrG   _PY_VERSION_SHORTru   implementationrv   r   )Zconfig_dir_namer   r   r   r   L  s    c           ,   C   sS  d d l  }  i  } t   } y t | |  Wn[ t k
 r } z; d | } t | d  rk | d | j } t |   WYd d } ~ Xn Xt   } y' t |   } t | |  Wd QRXWn[ t k
 r} z; d | } t | d  r | d | j } t |   WYd d } ~ Xn Xt	 r,| d | d <d } d	 t
 j k rrd d l } | j |  }	 | |	 _ |	 t
 j | <d
 t   t
 j d d  f }
 t t
 d  r|
 d 7}
 t j |
 d d t j j |
 | d  } t | d d d 4 } | j d  | j d  |  j  | d | Wd QRXt d d d d  } | j |
  Wd QRXd S)z;Generate the Python module containing build-time variables.r   Nz.invalid Python installation: unable to open %sstrerrorz (%s)ZLDSHAREDZ	BLDSHARED_sysconfigdatarE   zbuild/lib.%s-%sr   Zgettotalrefcountz-pydebugexist_okTz.pywencodingutf8zB# 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   rG   rH   types
ModuleTypebuild_time_varsmodulesr   versionr%   makedirsr   r'   write)r   r?   ZmakefileemsgZconfig_hrk   r;   r   moduleZ
pybuilddirZdestfiler   r   r   _generate_posix_varsX  sL    	
	
	 
r   c             C   s!   d d l  m } |  j |  d S)z7Initialize the module as appropriate for POSIX systems.r   )r   N)r|   r   ri   )r?   r   r   r   r   _init_posix  s    r   c             C   sq   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    rG   
executable)r?   r   r   r   _init_non_posix  s    


r   c       	      C   s   | d k r i  } d d l  } | j d  } | j d  } x |  j   } | sR P| j |  } | r | j d d  \ } } y t |  } Wn t k
 r Yn 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_]+) [*]/
rP   r   )rU   rV   readliner[   r\   r^   r_   )	fpr?   rU   Z	define_rxZundef_rxrm   rn   ro   rp   r   r   r   r     s*    c              C   sa   t  rB t j d k r3 t j j t p' t d  }  qN t 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   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  |  |  St |  Sd 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@   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 ri  a  t t  d <t t  d <t t  d <t t  d <t d t d t  d <t t  d	 <t t  d
 <t t  d <t t  d <t t  d <y t j	 t  d <Wn t
 k
 r d t  d <Yn Xt j d k r t t   t j d k r t t   t  j d  } | d k	 r	| t  d <t   t  d <t d  } | r9d | t  d <n
 d t  d <t  j d t  } t j d k rt rt j j t    } t j j | |  } n t j j t    } t |  t  d <t j d k rd d l } | j t   |  rg  } x$ |  D] } | j t  j |   qW| St  Sd 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_shortr   r   Zpy_version_nodotZinstalled_baserJ   Zinstalled_platbaseZplatbaseZprojectbaseru   rO   r   r9   r   SOZuserbaseZ	MULTIARCH/ZmultiarchsubdirsrcdirrE   )_CONFIG_VARS_PREFIX_EXEC_PREFIX_PY_VERSIONry   _BASE_PREFIX_BASE_EXEC_PREFIXr,   rG   ru   r1   r%   r;   r   r   rF   rK   r   rw   r   r   r   r'   r    rH   _osx_supportZcustomize_config_varsappend)rB   r   Z	multiarchr   rJ   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   rF   )r;   r   r   r   r   r   J  s    c              C   s  t  j d k r d }  t j j |   } | d* k r: t j St j j d |  } t j | t |   |  j   } | d k r d S| d k r d St j St  j d	 k s t t  d
  r t j Sd t  j	 k r t  j	 d St  j
   \ } } } } } | j   j d d  } | j d d  } | j d d  } | d d  d k rTd | | f S| d d  d k r| d d k rd } d t | d  d | d d  f } d d d d i }	 | d  |	 t j 7} n | d d!  d" k rd | | f S| d d  d# k rd$ | | | f S| d d%  d& k rxd& } d d l }
 |
 j d'  } | j |  } | r| j   } nF | 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 (rP   )Zamd64z	win-amd64Zitaniumzwin-ia64r9   unameZ_PYTHON_HOST_PLATFORMr   rO    _-N   Zlinuxz%s-%sZsunosr   5Zsolarisz%d.%sr   r   iZ32bitl    Z64bitz.%s   ZirixZaixz%s-%s.%s   cygwinz[\d.]+rE   z%s-%s-%s)r%   r;   rG   r   findrH   ra   lowerrx   r0   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   V  sZ    #(c               C   s   t  S)N)ry   r   r   r   r   r     s    c             C   sa   xZ t  t | j     D]@ \ } \ } } | d k rE t d |   t d | | f  q Wd  S)Nr   z%s: z
	%s = "%s")	enumerater   r5   print)titler   indexr6   r7   r   r   r   _print_dict  s    +r   c               C   s   d t  j k r t   d St 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)
rG   argvr   r   r   r   rA   r   r
   r   r   r   r   r   _main  s    r   __main__)zstdlibz
platstdlibr   r   zincluder   zdata)r!   r"   )r!   r"   )zposix_prefixr   )A__doc__r%   rG   os.pathr   r   __all__r:   r   r   splitr   ry   r   r   r=   r   r   base_prefixr   r   r   base_exec_prefixr   r   Z
_USER_BASEr    r   r   r,   getcwdr;   r   endswithr'   r0   r*   getattrr+   r-   rw   r>   r3   r8   r@   rA   rK   rt   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   __name__r   r   r   r   <module>   s   						 		|? S[