3 \å-ã@sddlZddlZddlZddlZejdkrBdd„Zdd„Zdd„Zejd krlejd krldd l m Z d d„Zn”ejd k�rddl Z ddl Z d d„Zejdkr¤dd„Zndd„Zejjd%ƒrÊdd„Zdd„Zn6ejdkrèdd„Zd&dd„Zndd„Zdd „Zd!d„Zd"d#„Zed$k�reƒdS)'éNÚntcCsšd}tjj|ƒ}|d krdS|t|ƒ}tj|d…jddƒ\}}t|dd …ƒd}|dkrf|d7}t|dd…ƒd }|dkr†d }|dkr–||SdS) zÏReturn the version of MSVC that was used to build Python. For Python 2.3 and up, the version number is included in sys.version. For earlier versions, assume the compiler is MSVC 6. zMSC v.ééNú éé ég$@réÿÿÿÿéþÿÿÿ)ÚsysÚversionÚfindÚlenÚsplitÚint)ÚprefixÚiÚsÚrestZ majorVersionZ minorVersion©rú#/usr/lib64/python3.6/ctypes/util.pyÚ_get_build_version s  rcCs^tƒ}|dkrdS|dkr d}n|dkr6d|d}ndSddl}d|jjkrV|d 7}|d S) z%Return the name of the VC runtime dllNrÚmsvcrtrzmsvcr%dé rz_d.pydÚdz.dll)rÚimportlib.machineryÚ machineryÚEXTENSION_SUFFIXES)r ZclibnameÚ importlibrrrÚ find_msvcrt"s rcCst|dkrtƒSx`tjdjtjƒD]J}tjj||ƒ}tjj|ƒrD|S|jƒj dƒrTq"|d}tjj|ƒr"|Sq"WdS)NÚcÚmÚPATHz.dll)r r!) rÚosÚenvironrÚpathsepÚpathÚjoinÚisfileÚlowerÚendswith)ÚnameZ directoryZfnamerrrÚ find_library7s  r,ÚposixÚdarwin)Ú dyld_findc CsLd|d|d||fg}x,|D]$}yt|ƒStk rBw Yq Xq WdS)Nz lib%s.dylibz%s.dylibz%s.framework/%s)Ú _dyld_findÚ ValueError)r+Úpossiblerrrr,Hs  c !Cstjdtj|ƒƒ}tjdƒ}|s,tjdƒ}|s4dStjƒ}z||dd|jd|g}t tj ƒ}d|d<d|d <yt j |t j t j|d �}Wntk ršdSX|�|jjƒ}WdQRXWdy |jƒWntk rÚYnXXtj||ƒ}|sòdStj|jd ƒƒS) Nz[^\(\)\s]*lib%s\.[^\(\)\s]*ÚgccZccz-Wl,-tz-oz-lÚCÚLC_ALLÚLANG)ÚstdoutÚstderrÚenvr)r#ÚfsencodeÚreÚescapeÚshutilÚwhichÚtempfileZNamedTemporaryFiler+Údictr$Ú subprocessÚPopenÚPIPEZSTDOUTÚOSErrorr7ÚreadÚcloseÚFileNotFoundErrorÚsearchÚfsdecodeÚgroup) r+ÚexprZ c_compilerZtempÚargsr9ÚprocZtraceÚresrrrÚ _findLib_gccWs:      rOZsunos5cCsz|sdSytjdd|ftjtjd�}Wntk r:dSX|�|jjƒ}WdQRXtjd|ƒ}|sjdSt j |j dƒƒS)Nz/usr/ccs/bin/dumpz-Lpv)r7r8s\[.*\]\sSONAME\s+([^\s]+)r) rArBrCÚDEVNULLrDr7rEr;rHr#rIrJ)ÚfrMÚdatarNrrrÚ _get_soname„s  rScCs�|sdStjdƒ}|sdSy"tj|ddd|ftjtjd�}Wntk rPdSX|�|jjƒ}WdQRXt j d|ƒ}|s€dSt j |j dƒƒS)NÚobjdumpz-pz-jz.dynamic)r7r8s\sSONAME\s+([^\s]+)r)r=r>rArBrCrPrDr7rEr;rHr#rIrJ)rQrTrMÚdumprNrrrrS•s"  ÚfreebsdÚopenbsdÚ dragonflyc CsR|jdƒ}g}y"x|r,|jdt|jƒƒƒqWWntk rDYnX|pPtjgS)Nó.r)rÚinsertrÚpopr1r Úmaxsize)ZlibnameÚpartsZnumsrrrÚ _num_version­s r^cCs¢tj|ƒ}d||f}tj|ƒ}ytjdtjtjd�}Wntk rPd}YnX|�|j j ƒ}WdQRXtj ||ƒ}|sˆt t |ƒƒS|jtd�tj|d ƒS) Nz:-l%s\.\S+ => \S*/(lib%s\.\S+)ú/sbin/ldconfigú-r)r7r8ó)Úkeyr)r_r`r )r;r<r#r:rArBrCrPrDr7rEÚfindallrSrOÚsortr^rI)r+ZenamerKrMrRrNrrrr,¸s        c CsêtjjdƒsdSttjƒ}d|d<|r,d }nd }d}ytj|tjtj|d�}Wnt k rbdSX|�:x2|j D](}|j ƒ}|j dƒrrtj |ƒjƒd}qrWWdQRX|s°dSx4|jdƒD]&}tjj|d |ƒ}tjj|ƒr¼|Sq¼WdS) Nú /usr/bin/crler4r5ú-64)r7r8r9sDefault Library Path (ELF):éú:zlib%s.so)rerf)re)r#r&Úexistsr@r$rArBrCrPrDr7ÚstripÚ startswithrIrr') r+Úis64r9rLÚpathsrMÚlineÚdirZlibfilerrrÚ _findLib_crleÏs6       rpFcCstt||ƒpt|ƒƒS)N)rSrprO)r+rlrrrr,óscCsàddl}|jdƒdkr&tjƒjd}ntjƒjd}dddddd œ}|j|d ƒ}d }tj|tj|ƒ|fƒ}yZt j d d gt j t j t j dddœd��,}tj ||jjƒƒ}|rºtj|jdƒƒSWdQRXWntk rÚYnXdS)NrÚlrgz-32z-64z libc6,x86-64z libc6,64bitz libc6,IA-64)z x86_64-64zppc64-64z sparc64-64zs390x-64zia64-64Zlibc6z\s+(lib%s\.[^\s]+)\s+\(%sz/sbin/ldconfigz-pr4)r5r6)Ústdinr8r7r9r)ÚstructZcalcsizer#ÚunameÚmachineÚgetr:r;r<rArBrPrCrHr7rErIrJrD)r+rsruZmach_mapZabi_typeZregexÚprNrrrÚ_findSoname_ldconfigøs.  rxc CsÐdtj|ƒ}ddg}tjjdƒ}|rHx |jdƒD]}|jd|gƒq2W|jdtjd|gƒd}yFtj |tj tj d d �}|j ƒ\}}tj |tj |ƒƒ} | r¦| jd ƒ}Wn"tk rÊ} zWYdd} ~ XnX|S) Nz[^\(\)\s]*lib%s\.[^\(\)\s]*Zldz-tZLD_LIBRARY_PATHrhz-Lz-oz-l%sT)r7r8Zuniversal_newlinesr)r;r<r#r$rvrÚextendÚdevnullrArBrCZ communicaterHrIrJÚ Exception) r+rKÚcmdZlibpathrÚresultrwÚoutÚ_rNÚerrrÚ _findLib_lds&   r�cCst|ƒptt|ƒpt|ƒƒS)N)rxrSrOr�)r+rrrr,,scCsØddlm}tjdkr:t|jƒt|jdƒƒttdƒƒtjdkrÔttdƒƒttdƒƒttdƒƒtj d kr¬t|j d ƒƒt|j d ƒƒt|j d ƒƒt|j d ƒƒn(t|j dƒƒt|j dƒƒttdƒƒdS)Nr)Úcdllrrr-r!r Úbz2r.z libm.dylibzlibcrypto.dylibzlibSystem.dylibzSystem.framework/Systemzlibm.soz libcrypt.soZcrypt) Zctypesr‚r#r+ÚprintrÚloadr,r ÚplatformZ LoadLibrary)r‚rrrÚtest4s"         r‡Ú__main__)rVrWrX)F)r#r=rAr r+rrr,r†Zctypes.macholib.dyldr/r0r;r?rOrSrkr^rprxr�r‡Ú__name__rrrrÚs8   +     $