3 f4O @sdZddlZddlZddlZddlZddlmZejjej Z ejjej Z ejjej ZejjejZdejkrejjejdZnejjejjejZejdkrejjd,rejjejjeZd d Zeed dZeoejdkoejjd-rejjejjeZd d ZeZdZyes.ejZWne k rFYnXddZ!d.ddZ"d/ddZ#ddZ$ddZ%ddZ&d0ddZ'ej(dZ)ej(dZ*ej(dZ+d1d d!Z,d"d#Z-da.d$d%Z/d&d'Z0d(d)Z1d*d+Z2dS)2aProvide access to Python's configuration information. The specific configuration variables available depend heavily on the platform and configuration. The values may be retrieved using get_config_var(name), and the list of variables is available via get_config_vars().keys(). Additional convenience functions are also available. Written by: Fred L. Drake, Jr. Email: N)DistutilsPlatformErrorZ_PYTHON_PROJECT_BASEnt\pcbuild\win32\pcbuild\amd64cCs.x(dD] }tjjtjj|d|rdSqWdS)N Setup.dist Setup.localModulesTF)rr)ospathisfilejoin)dfnr!/usr/lib64/python3.6/sysconfig.py_is_python_source_dir)s r_homecCstr ttSttS)N) _sys_homer project_baserrrr _python_build2srcCsdtjddS)zReturn a string containing the major and minor Python version, leaving off the patchlevel. Sample return values could be '1.5' or '2.2'. z%d.%dN)sys version_inforrrrget_python_versionDsrcCs|dkr|rtpt}tjdkrjtrL|r.tp,tStjjt dd}tjj |Sdt t }tjj|d|Stjdkrtjj|dSt dtjdS) aReturn the directory containing installed Python header files. If 'plat_specific' is false (the default), this is the path to the non-platform-specific header files, i.e. Python.h and so on; otherwise, this is the path to platform-specific header files (namely pyconfig.h). If 'prefix' is supplied, use it instead of sys.base_prefix or sys.base_exec_prefix -- i.e., ignore 'plat_specific'. NposixsrcdirZIncludepythonincluderzFI don't know where Python installs its C header files on platform '%s')BASE_EXEC_PREFIX BASE_PREFIXr name python_buildrrr r get_config_varnormpathr build_flagsr) plat_specificprefixZincdirZ python_dirrrrget_python_incLs     r)cCs|dkr&|r|rtpt}n |r"tp$t}tjdkrp|s8|r>d}nd}tjj||dt}|r`|Stjj|dSnrAZccZcxxoptZcflagsZccsharedZldsharedZ shlib_suffixarZar_flagsZnewccZcppr?Zcc_cmdrrrrBs\                         rBcCsDtr,tjdkr"tjjtptd}q6tp(t}n tdd}tjj|dS)z2Return full pathname of installed pyconfig.h file.rPCr)r'z pyconfig-64.h)r#r r"r r rrr))inc_dirrrrget_config_h_filenames    rLcCs\trtjjtptdStddd}djtt }t t j drL|dt j j 7}tjj||dS)zAReturn full pathname of installed Makefile from the Python build.Makefilerr)r'r.z config-{}{} _multiarchz-%s)r#r r r rrr/formatrr&hasattrrimplementationrN)Zlib_dirZ config_filerrrget_makefile_filenames  rRc Cs|dkr i}tjd}tjd}xx|j}|s0P|j|}|rz|jdd\}}y t|}Wntk rnYnX|||<q"|j|}|r"d||jd<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. Nz"#define ([A-Z][A-Za-z0-9_]+) (.*) z&/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/ rrr)recompilereadlinematchgroupint ValueError)fpg define_rxundef_rxlinemnvrrrparse_config_hs(      rbz"([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_]*)}c Csddlm}||ddddd}|dkr*i}i}i}x|j}|dkrFPtj|}|r4|jdd\}} | j} | jdd } d | kr| ||<q4y t| } Wn$t k r| jdd ||<Yq4X| ||<q4Wd} x|rxt |D]} || } t j | pt j | }|r|jd}d}||kr2t||}n||krBd}nx|tjkrZtj|}n`|| kr| jdr| dd| krd }n$d||krd}nt|d|}n d ||<}|r| |jd}| d|j} |j| kr| |7} | |7} d |kr| || <nzy t| } Wn"t k r@| j|| <Yn X| || <|| =| jdr| dd| kr| dd} | |kr| || <q|| =qWqW|jx.|jD]"\}} t| tr| j||<qW|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)TextFilersurrogateescape)Zstrip_commentsZ skip_blanksZ join_lineserrorsNrz$$r$r5r;r=TFPY_)r5r;r=)Zdistutils.text_filercrU _variable_rxrVrWstripreplacerXrYlist _findvar1_rxsearch _findvar2_rxstrr rErFendstartcloseitems isinstanceupdate)rr[rcrZdonenotdoner^r_r`ratmpvrenamed_variablesr"valuefounditemafterkrrrparse_makefiles                       rcCsZxTtj|ptj|}|rP|j\}}|d||j|jd||d}qPqW|S)aExpand Makefile-style variables -- "${foo}" or "$(foo)" -- in 'string' according to 'vars' (a dictionary mapping variable names to values). Variables not present in 'vars' are silently expanded to the empty string. The variable values in 'vars' should not contain further variable expansions; if 'vars' is the output of 'parse_makefile()', you're fine. Returns a variable-expanded version of 's'. rrN)rmrnrospangetrW)svarsr_Zbegrqrrrexpand_makefile_varss *rc CsVtjjddjtjtjttjddd}t |t t dgd}|j }ia t j|dS) z7Initialize the module as appropriate for POSIX systems._PYTHON_SYSCONFIGDATA_NAMEz+_sysconfigdata_{abi}_{platform}_{multiarch}rNr)abir@ multiarchbuild_time_varsrN)r rErrOrabiflagsr@getattrrQ __import__globalslocalsrrCrv)r"_temprrrr _init_posixsrcCs~i}tddd|d<tddd|d<tdd|d<tjd|d<d |d <tjd d |d <tjjtjj t j |d<|a dS)z+Initialize the module as appropriate for NTrr)r'r.LIBDEST BINLIBDEST)r' INCLUDEPY EXT_SUFFIXz.exeEXE.rVERSIONBINDIRN) r/r)_impextension_suffixesrrkr r dirnameabspathr executablerC)r[rrr_init_ntsrcGs^tdkr(tjdtj}|r(|niattd<ttd<tjd}|dk rV|td<tjdt}tjdkrtrtj j t }tj j ||}ntj j t }tj j tj j|td<totjdkr t}tj jtd o|tjkr tj j |td}tj j|td<tjd kr(d dl}|jt|rVg}x|D]}|jtj|q8W|StSdS) aWith no arguments, return a dictionary of all configuration variables relevant for the current platform. Generally this includes everything needed to build extensions and install both pure modules and extensions. 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. NZ_init_r( exec_prefixrSOrrr0r)rCrrr r"r-r,rr#r rrRr rr%isabsgetcwdrr@rAcustomize_config_varsappend)argsfuncrrbaserAvalsr"rrrrDs@       rDcCs*|dkrddl}|jdtdtj|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)warningswarnDeprecationWarningrDr)r"rrrrr$sr$)rr)rr)rN)rrN)N)N)3__doc__rr rSrrerr r%r(r-rr, base_prefixr!base_exec_prefixr rErrrrr"lowerendswithrrrrr#r&rAttributeErrorrr)r/rBrLrRrbrTrirmrorrrCrrrDr$rrrr sZ      # +I      mJ