3 \-@sddlZddlZddlZddlZejdkrBddZddZddZejd krlejd krldd l m Z d dZnejd krddl Z ddl Z d dZejdkrddZnddZejjd%rddZddZn6ejdkrddZd&ddZnddZdd Zd!dZd"d#Zed$kredS)'NntcCsd}tjj|}|d krdS|t|}tj|djdd\}}t|dd d}|dkrf|d7}t|ddd }|dkrd }|dkr||SdS) zReturn 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)sysversionfindlensplitint)prefixisrestZ majorVersionZ minorVersionr/usr/lib64/python3.6/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 dllNrmsvcrtrzmsvcr%d rz_d.pyddz.dll)rZimportlib.machinery machineryEXTENSION_SUFFIXES)r Zclibname importlibrrr find_msvcrt"s rcCst|dkrtSx`tjdjtjD]J}tjj||}tjj|rD|S|jj drTq"|d}tjj|r"|Sq"WdS)NcmPATHz.dll)rr ) rosenvironrpathseppathjoinisfilelowerendswith)nameZ directoryZfnamerrr find_library7s  r+posixdarwin) 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 rdSX||jj}WdQRXWdy |jWntk rYnXXtj||}|sdStj|jd S) Nz[^\(\)\s]*lib%s\.[^\(\)\s]*gccZccz-Wl,-tz-oz-lCLC_ALLLANG)stdoutstderrenvr)r"fsencodereescapeshutilwhichtempfileZNamedTemporaryFiler*dictr# subprocessPopenPIPEZSTDOUTOSErrorr6readcloseFileNotFoundErrorsearchfsdecodegroup) r*exprZ c_compilerZtempargsr8procZtraceresrrr _findLib_gccWs:      rNZsunos5cCsz|sdSytjdd|ftjtjd}Wntk r:dSX||jj}WdQRXtjd|}|sjdSt j |j dS)Nz/usr/ccs/bin/dumpz-Lpv)r6r7s\[.*\]\sSONAME\s+([^\s]+)r) r@rArBDEVNULLrCr6rDr:rGr"rHrI)frLdatarMrrr _get_sonames  rRcCs|sdStjd}|sdSy"tj|ddd|ftjtjd}Wntk rPdSX||jj}WdQRXt j d|}|sdSt j |j dS)Nobjdumpz-pz-jz.dynamic)r6r7s\sSONAME\s+([^\s]+)r)r<r=r@rArBrOrCr6rDr:rGr"rHrI)rPrSrLdumprMrrrrRs"  freebsdopenbsd dragonflyc CsR|jd}g}y"x|r,|jdt|jqWWntk rDYnX|pPtjgS)N.r)rinsertrpopr0r maxsize)ZlibnamepartsZnumsrrr _num_versions r]cCstj|}d||f}tj|}ytjdtjtjd}Wntk rPd}YnX||j j }WdQRXtj ||}|st t |S|jtdtj|d S) Nz:-l%s\.\S+ => \S*/(lib%s\.\S+)/sbin/ldconfig-r)r6r7)keyr)r^r_r )r:r;r"r9r@rArBrOrCr6rDfindallrRrNsortr]rH)r*ZenamerJrLrQrMrrrr+s        c CstjjdsdSttj}d|d<|r,d }nd }d}ytj|tjtj|d}Wnt k rbdSX|:x2|j D](}|j }|j drrtj |jd}qrWWdQRX|sdSx4|jdD]&}tjj|d |}tjj|r|SqWdS) N /usr/bin/crler3r4-64)r6r7r8sDefault Library Path (ELF)::zlib%s.so)rdre)rd)r"r%existsr?r#r@rArBrOrCr6strip startswithrHrr&) r*is64r8rKpathsrLlinedirZlibfilerrr _findLib_crles6       roFcCstt||pt|S)N)rRrorN)r*rkrrrr+scCsddl}|jddkr&tjjd}ntjjd}dddddd }|j|d }d }tj|tj||f}yZt j d d gt j t j t j dddd,}tj ||jj}|rtj|jdSWdQRXWntk rYnXdS)Nrlrfz-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-pr3)r4r5)stdinr7r6r8r)structcalcsizer"unamemachinegetr9r:r;r@rArOrBrGr6rDrHrIrC)r*rrruZmach_mapZabi_typeZregexprMrrr_findSoname_ldconfigs.  rxc Csdtj|}ddg}tjjd}|rHx |jdD]}|jd|gq2W|jdtjd|gd}yFtj |tj tj d d }|j \}}tj |tj |} | r| jd }Wn"tk r} zWYdd} ~ XnX|S) Nz[^\(\)\s]*lib%s\.[^\(\)\s]*Zldz-tZLD_LIBRARY_PATHrgz-Lz-oz-l%sT)r6r7Zuniversal_newlinesr)r:r;r"r#rvrextenddevnullr@rArBZ communicaterGrHrI Exception) r*rJcmdZlibpathrresultrwout_rMerrr _findLib_lds&   rcCst|ptt|pt|S)N)rxrRrNr)r*rrrr+,scCsddlm}tjdkr:t|jt|jdttdtjdkrttdttdttdtj d krt|j d t|j d t|j d t|j d n(t|j dt|j dttddS)Nr)cdllrrr,r rbz2r-z libm.dylibzlibcrypto.dylibzlibSystem.dylibzSystem.framework/Systemzlibm.soz libcrypt.soZcrypt) Zctypesrr"r*printrloadr+r platformZ LoadLibrary)rrrrtest4s"         r__main__)rUrVrW)F)r"r<r@r r*rrr+rZctypes.macholib.dyldr.r/r:r>rNrRrjr]rorxrr__name__rrrrs8   +     $