a
    	”$aO#  ã                   @   s  d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ dddœZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZejdedddZde_dejv rÂde_edƒedƒdd„ ƒƒZdd„ Zdd„ Zd d!„ Z d$d"d#„Z!e!e	j"_!dS )%é    N)ÚOptionsÚUtilsÚLogsÚTaskÚBuildÚErrors)ÚfeatureÚbeforeÚafter)Úsamba_utilsÚboolZva_list)Z_Boolzstruct __va_list_tag *c                 C   s   t tt|  d¡ƒƒS )NÚ.)ÚlistÚmapÚintÚsplit©Úx© r   új/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/samba_abi.pyÚ<lambda>   ó    r   c                 C   s¾   |   ¡ } t dd| ¡} t dd| ¡} t dd| ¡} t dd| ¡} t dd| ¡} tD ]f}|}| d	d
¡}|d  ¡ s~|d dkr†|d7 }|d  ¡ sž|d dkr¦d| }t |t| | ¡} qR| S )znormalise a signature from gdbz^\$[0-9]+\s=\s\{(.+)\}$z\1z.^\$[0-9]+\s=\s\{(.+)\}(\s0x[0-9a-f]+\s<\w+>)+$z'^\$[0-9]+\s=\s(0x[0-9a-f]+)\s?(<\w+>)?$z0x[0-9a-f]+Z0xXXXXz&", <incomplete sequence (\\[a-z0-9]+)>z\1"Ú*z\*éÿÿÿÿÚ_z\br   )ÚstripÚreÚsubÚabi_type_mapsÚreplaceÚisalnum)ÚsigÚtÚmr   r   r   Únormalise_signature   s    r$   c                 C   s   t  dd| ¡} | S )zcope with older versions of gdbz	,\s\.\.\.Ú )r   r   )r!   r   r   r   Únormalise_varargs*   s    r&   c           	      C   sØ   t  |¡}i }|  d¡}|D ]¶}| d¡dkr0q| d¡}|r d}d}|D ]J}|d dkr|t |d |dd… ¡r|d	} q–qJt |d |¡rJd	} q–qJ|s |r qt d
|d t|d ƒf ¡ t|d ƒ||d < q|S )zparse ABI signatures fileÚ
ú:r   Fr   ú!é   NTz%s -> %s)r   ÚTO_LISTr   ÚfindÚfnmatchr   Údebugr$   )	ÚsigsÚ	abi_matchÚretÚaÚsZsaZmatchedÚnegativeÚpr   r   r   Ú
parse_sigs0   s,    


$r6   c                    s0   d  ‡ fdd„tˆ  ¡ ƒD ƒ¡}tj| |ddS )zsave ABI signatures to a filer%   c                 3   s   | ]}d |ˆ | f V  qdS )z%s: %s
Nr   )Ú.0r3   ©Úparsed_sigsr   r   Ú	<genexpr>K   r   zsave_sigs.<locals>.<genexpr>T)Ú
create_dir)ÚjoinÚsortedÚkeysr   Ú	save_file)Úsig_filer9   r/   r   r8   r   Ú	save_sigsI   s     rA   c              	   C   sR  | j }| jd  | j¡}tj |¡}t t	 
||g¡¡}t|| jƒ}| j}t |¡}|du sdtjjrŽt||ƒs|t d| ¡‚t d| ¡ dS t|| jƒ}d}	|D ]d}
|
|vrÌt d||
||
 f ¡ d}	q¢t||
 ƒt||
 ƒkr¢t d||
||
 ||
 f ¡ d}	q¢|D ],}
|
|vrt d	||
||
 f ¡ d}	q|	rNt d
| ¡‚dS )zcheck if the ABI has changedr   NzFailed to save ABI file "%s"zGenerated ABI signatures %sFzK%s: symbol %s has been removed - please update major version
	signature: %sTz]%s: symbol %s has changed - please update major version
	old_signature: %s
	new_signature: %sz^%s: symbol %s has been added - please mark it _PRIVATE_ or update minor version
	signature: %sa#  ABI for %s has changed - please fix library version then build with --abi-update
See http://wiki.samba.org/index.php/Waf#ABI_Checking for more information
If you have not changed any ABI, and your platform always gives this error, please configure with --abi-check-disable to skip this check)ÚABI_GENÚinputsÚabspathÚenvÚosÚpathÚbasenamer   Ú
get_stringr   Ú
cmd_outputr6   Ú	ABI_MATCHÚABI_FILEÚ	load_filer   ÚoptionsZ
ABI_UPDATErA   r   ÚWafErrorr   ÚwarnÚerrorr&   )ÚselfÚabi_genÚlibpathÚlibnamer/   r9   r@   Zold_sigsZparsed_old_sigsZ	got_errorr3   r   r   r   Úabi_check_taskO   sB    


ÿÿ

ÿrV   Ú	abi_checkÚBLUEz.bin)ÚcolorÚext_inTz--abi-checkÚ
apply_linkc                 C   s€   | j j}|jr| jdu rdS |js&dS | j j ¡ }tj 	|d¡}d| j| j
| jf }|  d| jjd ¡}||_| j|_||_dS )z'check that ABI matches saved signaturesNzbuildtools/scripts/abi_gen.shz%s/%s-%s.sigsrW   r   )ÚbldrE   Z	ABI_CHECKÚabi_directoryÚHAVE_VISIBILITY_ATTRÚsrcnoderD   rF   rG   r<   Úversion_libnameÚvnumÚcreate_taskÚ	link_taskÚoutputsrL   r0   rK   rB   )rR   rE   ZtopsrcrS   Zabi_fileÚtskr   r   r   rW   €   s    
ÿc                 C   s6   t  | ¡ ¡ D ]"}| d¡d }||vr|||< qdS )z6process one ABI file, adding new symbols to the symmapr(   r   N)r   ÚreadfÚ
splitlinesr   )ÚfnameÚversionÚsymmapÚlineZsymnamer   r   r   Úabi_process_file™   s    rl   c                 C   s  i }|D ]}|  || g ¡ |¡ qd}t|td}|D ]z}	d||	f }
|
|krT q´|  d|
 ¡ |	t| ¡ ƒv rœ|  d¡ | |	g ¡D ]}|  d| ¡ qˆ|  d| ¡ d|
 }q8|  d| ¡ ttd	d
„ |ƒƒ}ttdd
„ |ƒƒ}|  d¡ t	|ƒdkr|D ]}|  d| ¡ qn
|  d¡ | 
g d¢¡ |  d¡ |D ]}|  d|dd…  ¡ q@|dgkr‚t	|ƒdkr‚|  d¡ |  d¡ dS )a  Write a vscript file for a library in --version-script format.

    :param f: File-like object to write to
    :param libname: Name of the library, uppercased
    :param current_version: Current version
    :param versions: Versions to consider
    :param symmap: Dictionary mapping symbols -> version
    :param abi_match: List of symbols considered to be public in the current
        version
    r%   ©Úkeyz%s_%sz%s {
z		global:
z		%s;
z}%s;

z %sc                 S   s   | d dkS ©Nr   r)   r   r   r   r   r   r   ¿   r   z#abi_write_vscript.<locals>.<lambda>c                 S   s   | d dkS ro   r   r   r   r   r   r   À   r   r   z		*;
)z!_endz!__bss_startz!_edataz	local:
r*   Nr   z};
)Ú
setdefaultÚappendr=   Úversion_keyÚwriter>   Úgetr   ÚfilterÚlenÚextend)ÚfrU   Zcurrent_versionÚversionsrj   r0   Zinvmapr3   Zlast_keyÚkZsymverZ	local_abiZ
global_abir   r   r   r   Úabi_write_vscript¡   s@    





r{   c                 C   s¸   | j d  | j¡}i }g }| jD ]P}| | j¡}tj |¡}|t| jj	ƒd tdƒ … }| 
|¡ t|||ƒ q t|dd}z*t|| jj	| jj||| jjƒ W | ¡  n
| ¡  0 dS )ú0generate a vscript file for our public librariesr   r*   ú.sigsÚw)ÚmodeN)rd   ÚbldpathrE   rC   rD   rF   rG   rH   rv   ÚLIBNAMErq   rl   Úopenr{   ÚVERSIONrK   Úclose)ÚtaskÚtgtrj   ry   rx   rh   rH   ri   r   r   r   Úabi_build_vscriptÒ   s    

ÿr‡   c           	      C   sÖ   |r6| j jd||f dd}dd„ }t| ¡ |d}nd}tj  |¡}tj  |¡}| dd	¡ d
d	¡ ¡ }| dd	¡ d
d	¡ ¡ }| j|t	|d|d}|du r¦dg}n
t
 |¡}||j_||j_||j_g d¢|_dS )r|   z%s/%s-[0-9]*.sigsT)Úflatc                 S   s    t | d tdƒ …  d¡d ƒS )Nr}   ú-r   )rr   rv   Úrsplit)rG   r   r   r   Úabi_file_keyë   s    z!ABI_VSCRIPT.<locals>.abi_file_keyrm   r%   r‰   r   ú+Úvscripts)ÚruleÚsourceÚgroupÚtargetNr   )r   rƒ   rK   )rG   Úant_globr=   r   rF   rH   r   ÚupperÚSAMBA_GENERATORr‡   r   r+   rE   rK   rƒ   r   Úvars)	r\   rU   r]   ri   Úvscriptr0   r   r‹   r"   r   r   r   ÚABI_VSCRIPTç   s,    ü
r—   )N)#rF   Úsysr   r-   Úwaflibr   r   r   r   r   r   Úwaflib.TaskGenr   r	   r
   Úwafsambar   r   rr   r$   r&   r6   rA   rV   Útask_factoryr"   ÚquietÚargvÚ
always_runrW   rl   r{   r‡   r—   ÚBuildContextr   r   r   r   Ú<module>   s6    þ+
1
