o
    uJAf2                     @  sT  d dl mZ d dlZd dlZd dlZddlmZ ddlmZ ddlm	Z	 d dl
Z
e
 Zejdddd	d
 ejddd dadZdFddZdGddZdHdIddZdJd d!ZdKd$d%ZdLd(d)ZdMd+d,ZdMd-d.ZdMd/d0ZdMd1d2ZdMd3d4ZdNd6d7ZdOd9d:ZdOd;d<ZdNd=d>ZdPd?d@ZdQdBdCZ e!dDkre"e ej#dEd  dS dS )R    )annotationsN   )mesonlib)mlog)
Popen_safez--cross-host
cross_hostzcross compilation host platform)defaultdesthelpargs+)nargsz/Relinking will always happen on source changes.outfilenamestrreturnNonec                 C  s4   t | ddd	 W d   dS 1 sw   Y  dS )z*Just touch it so relinking happens always.wutf-8encodingN)open)r    r   G/usr/lib/python3.10/site-packages/mesonbuild/scripts/symbolextractor.py
dummy_syms(   s   "r   textc                 C  s   z#t |dd}| }W d    n1 sw   Y  | |kr"W d S W n	 ty,   Y nw t |ddd}||  W d    d S 1 sEw   Y  d S )Nr   r   r   )r   readFileNotFoundErrorwrite)r   r   fZoldtextr   r   r   write_if_changed-   s   
"r   toolsT.List[str]msgstderrT.Optional[str]c                 C  sr   t jtrd S | d| dt }|r|d| 7 }t| ttddd	 W d    d S 1 s2w   Y  d S )N z. 
r   r   r   )ospathexistsTOOL_WARNING_FILERELINKING_WARNINGr   warningr   )r    r"   r#   mr   r   r   print_tool_warning8   s   
"r.   namec                 C  s0   |   }|tjv rdd l}|tj| S | gS )Nr   )upperr'   environshlexsplit)r/   Zevarr2   r   r   r   get_toolC   s
   
r4   kwargsT.Anyc                 K  s   t | }zt|| fi |\}}}W n ty"   t|d Y d S  ty0   t|d Y d S w |jdkr>t|d| d S |S )Nz	not foundz
not usabler   zdoes not work)r4   r   r   r.   PermissionError
returncode)r/   r   r5   toolpoutputer   r   r   	call_toolJ   s   


r=   r9   T.Tuple[str, str]c                 K  s|   zt | fi |\}}}W n# ty   d d| d f Y S  ty0   d d| d f Y S w |jdkr:d |fS |d fS )Nz{!r} not found
r   z{!r} not usable
)r   r   formatr7   r8   )r9   r5   r:   r;   r<   r   r   r   call_tool_nowarnY   s   
r@   libfilenamec                 C  s   t dd| g}|st| d S dd |dD }t|dks!J t ddd	d
d| g}|s3t| d S |dD ],}|s=q8| }|dd }|d  dv r\t|dkr\||d g7 }|d|g7 }q8td|d | d S )Nreadelf-dc                 S     g | ]}d |v r|qS ZSONAMEr   .0xr   r   r   
<listcomp>j       zgnu_syms.<locals>.<listcomp>r&      nm	--dynamic--extern-only--defined-only--format=posixr   r   >   GBD      r%   )r=   r   r3   lenr0   joinr   )rA   r   r;   resultlineZ
line_splitentryr   r   r   gnu_symsd   s*   
r[   c              	   C  s@   t jd }zd| t jd< t| | W |t jd< d S |t jd< w )NPATHz/usr/gnu/bin:)r'   r1   r[   )rA   r   Zorigpathr   r   r   solaris_syms   s
   
r]   c                 C  s   t dd| g}|st| d S |d}t|D ]\}}d|v r$|} nq||d  ||d  g}t ddd	d
| g}|sBt| d S |dd |dD 7 }td|d | d S )NZotoolz-lr&   ZLC_ID_DYLIBr      rL   rN   rO   rP   c                 S  "   g | ]}d  | dd qS r%   r   r   rW   r3   rF   r   r   r   rI         " zosx_syms.<locals>.<listcomp>)r=   r   r3   	enumerater   rW   )rA   r   r;   arrivalmatchrX   r   r   r   osx_syms   s&   
rh   c                 C  s   t dd| g}|st| d S dd |dD }t|dks!J t ddd	d
| g}|s2t| d S |dd |dD 7 }td|d | d S )NrB   rC   c                 S  rD   rE   r   rF   r   r   r   rI      rJ   z openbsd_syms.<locals>.<listcomp>r&   rK   rL   z-Dz-Pz-gc                 S  s0   g | ]}|r| d sd| dd qS )zU r%   r   r   )endswithrW   r3   rF   r   r   r   rI      s   0 r=   r   r3   rV   r   rW   rA   r   r;   rX   r   r   r   openbsd_syms   s   rl   c                 C  s   t dd| g}|st| d S dd |dD }t|dks!J t ddd	d
d| g}|s3t| d S |dd |dD 7 }td|d | d S )NrB   rC   c                 S  rD   rE   r   rF   r   r   r   rI      rJ   z freebsd_syms.<locals>.<listcomp>r&   rK   rL   rM   rN   rO   rP   c                 S  r_   r`   ra   rF   r   r   r   rI      rb   rj   rk   r   r   r   freebsd_syms   s   
rm   impfilenamec                 C  s   t dd| g}|st| d S |g}t dddd| g}|s#t| d S |dD ]}d|vr/q(||jd	d
d  q(td|d | d S )Ndlltool-IrL   rN   rO   rP   r&    T rK   maxsplitr   )r=   r   r3   appendr   rW   )rn   r   r;   rX   rY   r   r   r   cygwin_syms   s    ru   T.Tuple[T.List[str], str]c                 C  s   d}dgt dfD ]}t|d| g \}}|r$|ddd d f  S ||7 }q	tt dd	| g \}}|r<|gd fS ||7 }g |fS )
N libllvm-libz-listr&   ro   rp   )r4   r@   r3   )rn   
all_stderrrx   r;   r<   r   r   r   _get_implib_dllname   s   

r}   c                 C  s   d}t j }d|d< ttdd| g |d\}}|r2|d}|d}|d	}||| d fS ||7 }d
D ];}tt|ddd| g \}}|rog }	|dD ]}
d|
vs\|
dr]qQ|	|
jddd  qQ|	d f  S ||7 }q8g |fS )Nrw   Z1033ZVSLANGdumpbinz-exports)envr&   zFile Type: LIBRARYz	  Summary)llvm-nmrL   rN   rO   rP   rq   z.textrK   rr   r   )	r'   r1   copyr@   r4   r3   index
startswithrt   )rn   r|   r   r;   r<   linesstartendrL   rX   rY   r   r   r   _get_implib_exports   s.   




r   c                 C  sx   t | \}}|stg dd| t| d S t| \}}|s,tg dd| t| d S ||7 }td|d | d S )N)rx   ry   ro   zdo not work or were not found)r~   r   rL   r&   )r}   r.   r   r   r   rW   )rn   r   rX   r<   symbolsr   r   r   windows_syms  s   r   c                 C  sP  |d ur
t | d S t st rt| | d S t r$t| | d S t r/t| | d S t	 r:t
| | d S t rEt
| | d S t r\tj|rVt|| d S t | d S t rstj|rmt|| d S t | d S t r~t| | d S tjtstdt  ttddd W d    n1 sw   Y  t | d S )Nz>Symbol extracting has not been implemented for this platform. r   r   r   )r   r   Zis_linuxZis_hurdr[   Zis_osxrh   Z
is_openbsdrl   Z
is_freebsdrm   Z	is_netbsd
is_windowsr'   r(   isfiler   Z	is_cygwinru   Zis_sunosr]   r)   r*   r   r,   r+   r   )rA   rn   r   r   r   r   r   gen_symbols  s<   r   intc                 C  s~   t | }t|jdkrtd td tj	|jd d}tj	|da
|jd }|jd }|jd }t||||j dS )	NrT   zGsymbolextractor.py <shared library file> <import library> <output file>rK   r   zmeson-privateZ$symbolextractor_tool_warning_printedr   rU   )parser
parse_argsrV   r   printsysexitr'   r(   rW   r*   r   r   )r   optionsZprivdirZlibfileZimpfileZoutfiler   r   r   run>  s   




r   __main__rK   )r   r   r   r   )r   r   r   r   r   r   )N)r    r!   r"   r   r#   r$   r   r   )r/   r   r   r!   )r/   r   r   r!   r5   r6   r   r   )r9   r!   r5   r6   r   r>   )rA   r   r   r   r   r   )rn   r   r   r   r   r   )rn   r   r   rv   )
rA   r   rn   r   r   r   r   r   r   r   )r   r!   r   r   )$
__future__r   typingTr'   r   rw   r   r   r   argparseArgumentParserr   add_argumentr*   r+   r   r   r.   r4   r=   r@   r[   r]   rh   rl   rm   ru   r}   r   r   r   r   __name__r   argvr   r   r   r   <module>   sD   








	







)