a
    db76                     @   sB  d dl Z d dlZd dlZd dlZe jdkrDdd Zdd Zdd Zne jd	krnejd
krnd dl	m
Z dd Znejdrd dlmZ ne jd	kr&d dlZd dlZdd Zdd Zejdkrdd Zndd Zejdrdd Zdd Zn8ejdkrdd Zd'ddZndd  Zd!d" Zd#d Zd$d% Zed&kr>e  dS )(    Nntc                  C   s   d} t j| }|dkrdS |t|  }t j|d dd\}}t|dd d }|dkrf|d7 }t|d	d
 d }|dkrd}|dkr|| S dS )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.
        zMSC v.   N             g      $@r   )sysversionfindlensplitint)prefixisrestZmajorVersionZminorVersion r   N/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python3.9/ctypes/util.py_get_build_version	   s    r   c                  C   s^   t  } | du rdS | dkr d}n| dkr6d| d  }ndS ddl}d|jjv rV|d	7 }|d
 S )z%Return the name of the VC runtime dllNr   msvcrtr   zmsvcr%d
   r   z_d.pydd.dll)r   Zimportlib.machinery	machineryEXTENSION_SUFFIXES)r   Zclibname	importlibr   r   r   find_msvcrt"   s    r   c                 C   sx   | dv rt  S tjd tjD ]R}tj|| }tj|rF|  S | 	drVq |d }tj|r |  S q d S )N)cmPATHr   )
r   osenvironr   pathseppathjoinisfilelowerendswith)nameZ	directoryZfnamer   r   r   find_library7   s    
r,   posixdarwin)	dyld_findc              	   C   sN   d|  d|  d| | f g}|D ]*} zt | W   S  tyF   Y qY q0 qd S )Nzlib%s.dylibz%s.dylibz%s.framework/%s)
_dyld_find
ValueError)r+   possibler   r   r   r,   H   s    
aix)r,   c                 C   s@   d}t | d}|d|kW  d   S 1 s20    Y  dS )z,Return True if the given file is an ELF files   ELFbr   N)openread)filenameZ
elf_headerthefiler   r   r   _is_elf`   s    r:   c           
      C   st  t dt|  }td}|s,td}|s4d S t }z|dd|jd|  g}t	t j
}d|d< d|d	< ztj|tjtj|d
}W n6 ty   Y W z|  W n ty   Y n0 d S 0 | |j }W d    n1 s0    Y  W z|  W n ty   Y n0 n$z|  W n ty2   Y n0 0 t||}|sLd S |D ]}	t|	sbqPt |	  S d S )N[^\(\)\s]*lib%s\.[^\(\)\s]*ZgccZccz-Wl,-t-oz-lCLC_ALLLANGstdoutstderrenv)r#   fsencodereescapeshutilwhichtempfileNamedTemporaryFiler+   dictr$   
subprocessPopenPIPEZSTDOUTOSErrorcloseFileNotFoundErrorrA   r7   findallr:   fsdecode)
r+   exprZ
c_compilerZtempargsrC   procZtraceresfiler   r   r   _findLib_gccf   sT    



*
rY   Zsunos5c                 C   s   | sd S zt jdd| ft jt jd}W n ty:   Y d S 0 | |j }W d    n1 s`0    Y  td|}|s~d S t	
|dS )Nz/usr/ccs/bin/dumpz-LpvrA   rB   s   \[.*\]\sSONAME\s+([^\s]+)r   )rL   rM   rN   DEVNULLrO   rA   r7   rE   searchr#   rS   group)frV   datarW   r   r   r   _get_soname   s    
(r`   c                 C   s   | sd S t d}|sd S z"tj|ddd| ftjtjd}W n tyP   Y d S 0 | |j }W d    n1 sv0    Y  t	
d|}|sd S t|dS )Nobjdump-pz-jz.dynamicrZ   s   \sSONAME\s+([^\s]+)r   )rG   rH   rL   rM   rN   r[   rO   rA   r7   rE   r\   r#   rS   r]   )r^   ra   rV   dumprW   r   r   r   r`      s$    

()ZfreebsdZopenbsdZ	dragonflyc                 C   sL   |  d}g }z|r*|dt|  qW n ty>   Y n0 |pJtjgS )N   .r   )r   insertr   popr1   r   maxsize)ZlibnamepartsZnumsr   r   r   _num_version   s    
ri   c                 C   s   t | }d||f }t|}ztjdtjtjd}W n tyN   d}Y n00 | |j	
 }W d    n1 st0    Y  t ||}|stt| S |jtd t|d S )Nz:-l%s\.\S+ => \S*/(lib%s\.\S+))/sbin/ldconfigz-rrZ       )keyr   )rE   rF   r#   rD   rL   rM   rN   r[   rO   rA   r7   rR   r`   rY   sortri   rS   )r+   ZenamerT   rV   r_   rW   r   r   r   r,      s"    



(c           	      C   s   t jdsd S tt j}d|d< |r,d}nd}d }ztj|tjtj|d}W n t	yb   Y d S 0 |@ |j
D ](}| }|drpt | d }qpW d    n1 s0    Y  |sd S |d	D ]*}t j|d
|  }t j|r|  S qd S )N/usr/bin/crler=   r>   )rn   -64)rn   r@   s   Default Library Path (ELF):r5   :zlib%s.so)r#   r&   existsrK   r$   rL   rM   rN   r[   rO   rA   strip
startswithrS   r   r'   )	r+   is64rC   rU   pathsrV   linedirZlibfiler   r   r   _findLib_crle   s8    



2
rx   Fc                 C   s   t t| |pt| S N)r`   rx   rY   )r+   rt   r   r   r   r,   	  s    c                 C   s  dd l }|ddkr&t jd }nt jd }dddddd	}||d
}d}t|t| |f }z~t	j
ddgt	jt	jt	jddddF}t||j }|rt|dW  d    W S W d    n1 s0    Y  W n ty   Y n0 d S )Nr   lr5   z-32ro   zlibc6,x86-64zlibc6,64bitzlibc6,IA-64)z	x86_64-64zppc64-64z
sparc64-64zs390x-64zia64-64Zlibc6z\s+(lib%s\.[^\s]+)\s+\(%srj   rb   r=   )r>   r?   )stdinrB   rA   rC   r   )structcalcsizer#   unamemachinegetrD   rE   rF   rL   rM   r[   rN   r\   rA   r7   rS   r]   rO   )r+   r|   r   Zmach_mapZabi_typeZregexprW   r   r   r   _findSoname_ldconfig  s4    
Br   c                 C   s   dt |  }ddg}tjd}|rD|dD ]}|d|g q0|dtjd|  g d }zZtj	|tj
tj
d	d
}| \}}t |t|}	|	D ]}
t|
sqt|
  W S W n ty   Y n0 |S )Nr;   Zldz-tZLD_LIBRARY_PATHrp   z-Lr<   z-l%sT)rA   rB   Zuniversal_newlines)rE   rF   r#   r$   r   r   extenddevnullrL   rM   rN   ZcommunicaterR   rS   r:   	Exception)r+   rT   cmdZlibpathr   resultr   out_rW   rX   r   r   r   _findLib_ld,  s,    
r   c                 C   s    t | ptt| ptt| S ry   )r   r`   rY   r   )r+   r   r   r   r,   G  s
    

c                  C   s  ddl m}  tjdkr:t| j t| d ttd tjdkrttd ttd ttd tj	d	krt| 
d
 t| 
d t| 
d t| 
d ntj	drddl m} tjdk rtd|dtj  td| 
d  ttd t| 
d n*td|dtj  td| 
d  tdtd  td| 
td  tdtd  td| 
td  n(t| 
d t| 
d ttd d S )Nr   )cdllr   r   r-   r!   r    bz2r.   z
libm.dylibzlibcrypto.dylibzlibSystem.dylibzSystem.framework/Systemr3   )CDLLl        z"Using CDLL(name, os.RTLD_MEMBER): zlibc.a(shr.o)zUsing cdll.LoadLibrary(): Zrpmz	librpm.sozlibc.a(shr_64.o)z	crypt	:: Zcryptz
crypto	:: Zcryptozlibm.sozlibcrypt.so)Zctypesr   r#   r+   printr   loadr,   r   platformZLoadLibraryrs   r   rg   ZRTLD_MEMBER)r   r   r   r   r   testO  s<    


r   __main__)F)r#   rG   rL   r   r+   r   r   r,   r   Zctypes.macholib.dyldr/   r0   rs   Zctypes._aixrE   rI   r:   rY   r`   ri   rx   r   r   r   __name__r   r   r   r   <module>   s>   


2


$(
