O dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZde ededeedffdZde ede efd ZGd d e Zd ede efd Zejdede efdZdede efdZedkrddlZejZeds Jdedeedeejeddeej dde!dddD]Z"ee"ddSdS) zPEP 656 support. This module implements logic to detect if the currently running Python is linked against musl, and what musl version is used. N)IOIterator NamedTupleOptionalTupleffmtreturn.cvtj||tj|SN)structunpackreadcalcsize)rr s /builddir/build/BUILDROOT/alt-python311-pip-21.3.1-4.el9.x86_64/opt/alt/python311/lib/python3.11/site-packages/pip/_vendor/packaging/_musllinux.py_read_unpackedrs* =affV_S%9%9:: ; ;;cb|d t|d}n#tj$rYdSwxYw|ddt dkrdS|tjdd dd d |d\}}}t j|}n#t$rYdSwxYw t||\}}}}}}} n#tj$rYdSwxYwt| dzD]} |||| zz |t||\} } } n#tj$rYdSwxYw| d krZ|| tj | |  d }d |vrdS|cSdS)zDetect musl libc location by parsing the Python executable. Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html r16BNsELFHHI)IIIIHHHIIIIIIII)rrr)QQQIHHHIIQQQQQQ)r)rrmusl)seekrr errortupleroperator itemgetterKeyErrorrangeosfsdecoderstrip)ridente_fmtp_fmtp_idxp_get_e_phoff e_phentsizee_phnumip_typep_offsetp_filesz interpreters r_parse_ld_musl_from_elfr:s$ FF1IIIq%(( <tt RaRyE*%%%%tFF6?5 ! !1%%% , 21   (ue#U+ tt 4B1e4L4L17Aq!['' <tt 7Q;     wq())) ).~a/G/G)H)H &FHhh|   444  Q;;  xk!&&"2"23399$??  $ $44 4sB(;;B(( B65B6:CC&%C&D77E  E c$eZdZUeed<eed<dS) _MuslVersionmajorminorN)__name__ __module__ __qualname__int__annotations__rrr<r<Gs" JJJ JJJJJrr<outputcdd|DD}t|dks|ddddkrdStjd|d}|sdSt t |dt |d S) Ncg|]}||SrDrD.0ns r z'_parse_musl_version..Ms F F F1A FQ F F Frc3>K|]}|VdSr )r+rHs r z&_parse_musl_version..Ms*@@q@@@@@@rrrrr!zVersion (\d+)\.(\d+)r)r=r>) splitlineslenrematchr<rBgroup)rElinesms r_parse_musl_versionrULs F F@@F,=,=,?,?@@@ F F FE 5zzA~~q"1"//t (%(33A t c!''!**ooS__ E E EEr executablecltj5} |t|d}n#t$rYddddSwxYwt |}dddn #1swxYwY|sdSt j|gt jd}t|j S)a`Detect currently-running musl runtime version. This is done by checking the specified executable's dynamic linking information, and invoking the loader to parse its output for a version string. If the loader is musl, the output would be something like:: musl libc (x86_64) Version 1.2.2 Dynamic Program Loader rbNT)stderruniversal_newlines) contextlib ExitStack enter_contextopenIOErrorr: subprocessrunPIPErUrY)rVstackrldprocs r_get_musl_versionrfVs    (5 ##DT$:$:;;AA    ((((((((  $Q ' ' ((((((((((((((( t >2$z4 P P PD t{ + ++s1A1#:A1 AA1AA11A58A5archc#Kttj}|dSt|jddD]}d|jd|d|VdS)aTGenerate musllinux tags compatible to the current platform. :param arch: Should be the part of platform tag after the ``linux_`` prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a prerequisite for the current platform to be musllinux-compatible. :returns: An iterator of compatible musllinux tags. N musllinux_r1)rfsysrVr(r>r=)rgsys_muslr>s r platform_tagsrmnsr!00Hx~r2..;;:8>::E::D::::::;;r__main__zlinux-z not linuxzplat:zmusl:ztags: )endz[.-]r1-rriz )#__doc__r[ functoolsr%r)rPr r`rktypingrrrrrbytesstrrBrr:r<rU lru_cacherfrmr? sysconfig get_platformplat startswithprintrVsubsplittrDrrrs   <<<<<<<<<<<<<<FFFF,#,(<*@,,,,. ; ; ; ; ; ;  z !9 ! # #D ??8 $ $11k11 $ E'4 E'$$S^44555 E's ]626'3 30B0B20FGG H H!! aZ     !!r