B -__ @sdZddlZddlZddlmZmZdddddd d d d d dg Zdddddddddddddddddddddddddddd d d!d!d"d#d$d%d&d&d'd'd(d)d$d%d*d*d+d+d,d)d$d%d-Zd%Zej dZ d.ej dd/Z d0ej dd/ZejejZejejZejejZejejZdadZd1d2ZejrPejeejZn eeZej d3kre!"d4reej#eeeZd5ej$kreej$d5Zd6d7Z%e&ed8dZ'ej d3krd9d:Z(e(eZe(e'Z'dhdZ*e*rx&d?D]Z+d@ee+dA<dBee+dC<qWdDdEZ,dFdGZ-dHdIZ.dJdKZ/dLdMZ0didNdOZ1dPdZ2dQdRZ3dSdTZ4dUdVZ5dWdXZ6djdYdZ7dZdZ8d[d Z9d\d Z:e/dd>fd]d Z;e/dd>fd^dZdad Z?dbd Z@dcddZAdedfZBeCdgkreBdS)kz-Access to Python's configuration information.N)pardirrealpathget_config_h_filenameget_config_varget_config_varsget_makefile_filenameget_pathget_path_names get_paths get_platformget_python_versionget_scheme_namesparse_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 platstdlibpurelibplatlibinclude platincludescriptsdataz{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})rrrrrrrz'{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_homentZnt_userZ posix_userZosx_framework_userz%d.%dz%d%dcCs"yt|Stk r|SXdS)N)rOSError)pathr/usr/lib/python3.7/sysconfig.py_safe_realpathdsrr)z\pcbuild\win32z\pcbuild\amd64Z_PYTHON_PROJECT_BASEcCs.x(dD] }tjtj|d|rdSqWdS)N)z Setup.distz Setup.localZModulesTF)osrisfilejoin)dfnrrr_is_python_source_dirys r%Z_homecCs0|r,tj|tjtjtdr,tS|S)NZPCbuild)r rnormcase startswithr"_PREFIX)r#rrr _fix_pcbuildsr)FcCs|rtrttSttS)N) _sys_homer% _PROJECT_BASE)Z check_homerrris_python_buildsr,T)rrz{srcdir}/Includerz{projectbase}/.rc Csfy |jf|Stk r`y|jftjStk rZ}ztd|dWdd}~XYnXYnXdS)Nz{%s})formatKeyErrorr environAttributeError)sZ local_varsvarrrr _subst_varss r3cCs4|}x&|D]\}}||kr$q|||<qWdS)N)keysitems)Z target_dictZ other_dictZ target_keyskeyvaluerrr _extend_dicts r8cCsfi}|dkri}t|txDt|D]4\}}tjdkrHtj|}tjt ||||<q*W|S)N)posixr) r8r_INSTALL_SCHEMESr5r namer expandusernormpathr3)schemevarsZresr6r7rrr _expand_varss   r@cCstjdkrdStjS)Nr9r)r r;rrrr_get_default_schemes rAcCsztjdd}|r|Sdd}tjdkrBtjdp6d}||dStjdkrptjrp|dd tjd tjdd S|dd S) NZPYTHONUSERBASEcWstjtjj|S)N)r rr<r")argsrrrjoinusersz_getuserbase..joinuserrZAPPDATA~ZPythondarwinZLibraryz%d.%drz.local)r r/getr;sysplatform _framework version_info)Zenv_baserCbaserrr _getuserbases   rLc CsZddl}|d}|d}|d}|dkr2i}i}i}t|dd}|} WdQRXx| D]} | ds`| d kr|q`|| } | r`| d d \} } | } | d d }d |kr| || <q`y t | } Wn$t k r| d d || <Yq`X| || <q`Wt | }d}x t |dkrxt|D]}||}||}||}|rv|rv||krp|n|} n|r|n|} | dk r| d } d}| |krt|| }n| |krd}nx| tjkrtj| }n`| |kr0|dr |dd|kr d }n$d| |krd}nt|d| }n d || <}|r|| d}|d| ||}d |kr~|||<n~y t |}Wn"t k r|||<Yn X|||<|||dr|dd|kr|dd}||kr|||<n|||<||q,WqWx.|D]"\}} t| tr&| ||<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. rNz"([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#rz$$$)ZCFLAGSZLDFLAGSZCPPFLAGSTFZPY_)recompileopen readlinesr'stripmatchgroupreplaceint ValueErrorlistr4lentuplesearchstartstrr r/endremover5 isinstanceupdate)filenamer?rTZ _variable_rxZ _findvar1_rxZ _findvar2_rxZdoneZnotdoneflineslinemnvZtmpvZ variablesZrenamed_variablesr;r7Zm1Zm2founditemZafterkrrr_parse_makefiles                                 rrcCsdtrtjtptdSttdr0dttj f}nd}ttj drP|dtj j 7}tjt d|dS)z Return the path of the Makefile.ZMakefileabiflagsz config-%s%sZconfig _multiarchz-%sr) _PYTHON_BUILDr rr"r*r+hasattrrG_PY_VERSION_SHORTrsimplementationrtr)Zconfig_dir_namerrrrMs  c Cs(tjddjtjtjttjdddS)NZ_PYTHON_SYSCONFIGDATA_NAMEz+_sysconfigdata_{abi}_{platform}_{multiarch}rtrP)ZabirH multiarch) r r/rFr-rGrsrHgetattrrxrrrr_get_sysconfigdata_nameZs r{c Csddl}i}t}yt||WnJtk rj}z,d|}t|drR|d|j}t|Wdd}~XYnXt}y"t|}t||WdQRXWnJtk r}z,d|}t|dr|d|j}t|Wdd}~XYnXt r|d|d<t }dt j kr$ddl }||} || _| t j|<d ttf} tt d rF| d 7} tj| d d tj| |d} t| ddd(}|d|d|j||dWdQRXtdddd}|| WdQRXdS)z;Generate the Python module containing build-time variables.rNz.invalid Python installation: unable to open %sstrerrorz (%s)ZLDSHAREDZ BLDSHAREDrEzbuild/lib.%s-%sZgettotalrefcountz-pydebugT)exist_okz.pywutf8)encodingzB# system configuration generated and used by the sysconfig module zbuild_time_vars = )streamzpybuilddir.txtascii)pprintrrrrrvr|rrVrrur{rGrHtypes ModuleTypebuild_time_varsmodulesr rwr makedirsrr"write) rr?ZmakefileemsgZconfig_hrir;rmoduleZ pybuilddirZdestfilerrr_generate_posix_varscsL          rcCs0t}t|ttdgd}|j}||dS)z7Initialize the module as appropriate for POSIX systems.rrN)r{ __import__globalslocalsrrg)r?r;Z_temprrrr _init_posixsrcCsVtd|d<td|d<td|d<d|d<d |d <t|d <tjttj|d <d S)z+Initialize the module as appropriate for NTrZLIBDESTrZ BINLIBDESTrZ INCLUDEPYz.pyd EXT_SUFFIXz.exeZEXEZVERSIONZBINDIRN)r_PY_VERSION_SHORT_NO_DOTr rdirnamerrG executable)r?rrr_init_non_posixs   rc Cs|dkr i}ddl}|d}|d}xx|}|s8P||}|r|dd\}}y t|}Wntk rvYnX|||<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. Nrz"#define ([A-Z][A-Za-z0-9_]+) (.*) z&/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/ rQr)rTrUreadlinerYrZr\r]) fpr?rTZ define_rxZundef_rxrkrlrmrnrrrrs*      cCsBtr,tjdkr"tjtptd}q4tp(t}ntd}tj|dS)zReturn the path of pyconfig.h.rZPCrz pyconfig.h)rur r;rr"r*r+r)Zinc_dirrrrrs   cCs tttS)z,Return a tuple containing the schemes names.)r`sortedr:rrrrr scCstS)z*Return a tuple containing the paths names.) _SCHEME_KEYSrrrrr scCs|rt||St|SdS)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?expandrrrr s cCst||||S)z[Return a path corresponding to the scheme. ``scheme`` is the install scheme name. )r )r;r>r?rrrrrscGstdkrhiattd<ttd<ttd<ttd<ttd<ttd<ttd<ttd <ttd <ttd <yt j td <Wnt k rd td <YnXt j dkrttt j dkrtttd}|dk r|td<ttd<td}|rd|td<nd td<tdt}t j dkr>tr0t jt}t j||}nt jt}t|td<t jdkrhddl}|t|rg}x|D]}|t|qxW|StSdS)anWith 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. Nprefix exec_prefixZ py_versionZpy_version_shortZpy_version_nodotZinstalled_baserKZinstalled_platbaseZplatbaseZ projectbasersrPrr9rSOZuserbaseZ MULTIARCH/ZmultiarchsubdirsrcdirrEr) _CONFIG_VARSr( _EXEC_PREFIX _PY_VERSIONrwr _BASE_PREFIX_BASE_EXEC_PREFIXr+rGrsr0r r;rrrFrLrrurrrr"rrH _osx_supportZcustomize_config_varsappend)rBrryrrKrZvalsr;rrrrsX           cCs*|dkrddl}|dtdt|S)zReturn the value of a single variable using the dictionary returned by 'get_config_vars()'. Equivalent to get_config_vars().get(name) rrNz SO is deprecated, use EXT_SUFFIXr)warningswarnDeprecationWarningrrF)r;rrrrrWsc Cstjdkr"dtjkrdStjStjdks6ttdsr3r8r@rArLrrrr{rrrrrr r r rrrr r rr__name__rrrrs             |  ?   S L