a
    	$aT8                     @   sh  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	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d dlmZ dd Ze
jd	ed
ed dej_dej_dej_dej_dej_dIddZejjej_eej_dJddZeej_dKddZeej_dd Z e ej_ dd Z!e!ej_!eddddddedddd  Z"edLd"d#Z#edMd$d%Z$G d&d' d'ejZd(d) Z%ejj&ej_'e%ej_&ej(ej_)ej(ej_*ed*d+ Z+edNd-d.Z,ed/d0 Z-d1d2 Z.e.ej_/ed3d4 Z0d5d6 Z1e1e_1e
ddde
2d de
d7dd8d9 Z3e
d:d;d<d=d>d?d@dAdB	e
d7dCdD Z4e
d7dEdF Z5e
j6dGdH Z7dS )O    N)Build	ConfigureNodeUtilsOptionsLogsTaskGen)	ConfigSet)featureafter)confConfigurationContext)
decide_extc                    s    j } jj}dd }g   _}|||j |||j  fdd jD }|jrhdd |D }|| dd |D }|j	| 
 |j pd dd} jd |d	d
dd
 d S )Nc                 S   s   t | tr| gS | S N)
isinstancestr)xx r   l/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/samba_waf18.pyto_list   s    
zflexfun.<locals>.to_listc                    s   g | ]}|   qS r   )	path_fromget_cwd).0atskr   r   
<listcomp>       zflexfun.<locals>.<listcomp>c                 S   s   g | ]}| tjd qS )/)replaceossepr   xr   r   r   r      r   c                 S   s   g | ]}|r|qS r   r   r"   r   r   r   r      r   r   )cwdenvquietz

)r%   	generatorbldlast_cmdextendFLEX	FLEXFLAGSinputsZ	FLEX_MSYScmd_and_logr   outputswriter   )r   r%   r*   r   lstr/   txtr   r   r   flexfun   s    

r5   flexz.l)nameruleext_indeciderdefaultc                 C   s"   |rt | dr|   S |  S )Nchildren)hasattrget_bldabspathold_abspathselfr%   r   r   r   r?   -   s    r?   c                 C   s   |   S r   r?   rA   r   r   r   bldpath4   s    rD   c                 C   s   |   S r   rC   rA   r   r   r   srcpath9   s    rE   c                 C   s>   t |d}|  }ztj||d W |  n
|  0 d S )Nwb)openget_merged_dictr   cPickledumpcloserB   filenamefiledatar   r   r   
store_fast>   s
    
rQ   c                 C   s>   t |d}ztj|}W |  n
|  0 | j| d S )Nrb)rH   r   rJ   loadrL   tableupdaterM   r   r   r   	load_fastG   s
    
rV   ccxxdasmfcincludespropagate_uselib_varsprocess_sourcec                    sV   |  | t| dg | jd  }|| _t| jd| jj  fdd|D | jd< d S )Nr\   INCLUDEScwdxc                    s   g | ]}|  qS r   )r   r"   r`   r   r   r   V   r   z"apply_incpaths.<locals>.<listcomp>INCPATHS)to_incnodesr   getattrr%   includes_nodesr*   bldnode)rB   r3   r   ra   r   apply_incpathsP   s    "rg   Tc           
      C   s   |rt |tsJ |d u r d}nt |tr2t|}|| j|< t |tsPt |trVd}n|r^dp`d}||t|f }|d }| jj}|D ] }	|	|r||||	<  qq| j	d| | j
d| d S )Nr   z%s=%sz%s="%s"=DEFINES
define_key)r   r   boolintr%   floatri   
startswithindexappend_valueappend_unique)
rB   keyvalquotecommentsappbanr3   r#   r   r   r   defineX   s$    


ry   c                    sT   |rt |tsJ |d   fdd| jjD | j_| jd| |rPd| j|< d S )Nrh   c                    s   g | ]}|  s|qS r   )rn   r"   rx   r   r   r   {   r   zundefine.<locals>.<listcomp>rj   r   )r   r   r%   ri   rq   )rB   rr   from_envru   r   rz   r   undefinev   s    r|   c                       s   e Zd Z fddZ  ZS )r   c                    s    |  d d| j_tt|  S )Nr;   T)setenvr%   merge_config_headersuperr   	init_dirs)rB   	__class__r   r   r      s    
zConfigurationContext.init_dirs)__name__
__module____qualname__r   __classcell__r   r   r   r   r      s   r   c                 O   s$   d|vrd|d< | j |i |}|S )N	mandatoryF)find_program_old)rB   kkwretr   r   r   find_program_samba   s    r   c           	      O   sd  |  | g }d|v rd|d }tjjjjD ]8}t|ddr*||jv r*ttj|jd}|r*|	| q*dd }|||d  | j
|d fi | d}z| j|i |}W nF | jjy   | j|d d	fi | tjd
kr n
| d Y n0 ||d< ||| j | j|i |}|sB| j|d d	fi | | d|  n| j| |d |fi | |S )z<Override the waf defaults to inject --with-directory optionsmsgmatchN c                 S   sR   | D ]H}||j vr*tj|dg|j  |_ ||jvrtj|dg|j |_qd S )Nincludelib)CPPPATHr    pathjoinLIBPATH)dirsr%   r#   r   r   r   add_options_dir   s
    

zcheck.<locals>.add_options_dirr%   errmsgYELLOW   zThe configuration failedsuccesszThe configuration failed %rokmsg)
validate_cr   OptionsContextparseroption_listrd   r   optionsdestappend	start_msg	run_builderrorsConfigurationErrorend_msgr   verbosefatalr%   
post_checkret_msg)	rB   r   r   additional_dirsr   r#   rY   r   r   r   r   r   check   s8    

r   Fc                    s\   du rrdnd fdd}z j |d d W n  jjyV   Y dS 0 d	S )
z/see if the platform supports building librariesNzrpath library supportzbuilding library supportc                    s   | j d}|j  |dd | j d}|dd g }rl| j d}|dd |d|   | d	|d
|d
d | d|dd
d}r|j g|_ fdd}|  | ||j	j
d d d S )Nlibdir/liblc1.cz"int lib_func(void) { return 42; }
wzmain.cz,int main(void) {return !(lib_func() == 42);}ZldscriptzTEST_1.0A2 { global: *; };
z-Wl,--version-script=%sc cshliblib1)featuressourcetarget	linkflagsr7   z
c cprogramprog1)r   r   r   uselib_localc                    sb    j d}ttj}| jd j tj |dd |d< | j	j
j| jd  g| |d d S )N)r   r   LD_LIBRARY_PATHr   )r%   )SAMBA_CROSS_ARGSdictr    environr/   parentr?   pathsepgetr)   r*   r0   )rB   argsr%   )r   r   r   r   run_app   s    
&z5CHECK_LIBRARY_SUPPORT.<locals>.build.<locals>.run_appr   )r8   r   )srcnode	make_noder   mkdirr2   r   r?   rpathpost	link_taskr1   )r*   lib_nodeZ	main_noder   Zscriptor   r   r   r   version_scriptr   r   build   s"    
z$CHECK_LIBRARY_SUPPORT.<locals>.buildzChecking for %s)	build_funr   FTr   r   r   )r   r   r   r   r   r   r   r   CHECK_LIBRARY_SUPPORT   s    r   c                    s@    fdd}z j ||ddd W n  jjy:   Y dS 0 dS )zcheck if we need -lcc                    s<   | j d}|j  |dd | d|g jjdd d S )Nr   zF#include <stdio.h>
int lib_func(void) { FILE *f = fopen("foo", "r");}
r   r   liblc)r   r   r   r   )r   r   r   r   r2   r%   EXTRA_LDFLAGS)r*   r   r   r   r   r      s    
zCHECK_NEED_LC.<locals>.buildz-lc is unnecessaryz-lc is necessary)r   r   r   r   FTr   )r   r   r   r   r   r   CHECK_NEED_LC   s    r   c                 C   s   dS )NTr   )r*   tgt_listr   r   r   order   s    r   c                 O   sB   d|v rt |d |d< d|vr*d|d< d|d< | j|i |S )Nr   r   FTglobal_define)shlexsplit	check_cfg)rB   r   r   r   r   r   	CHECK_CFG   s    r   c              
   K   s   d}d|v r|d }|d= d|v r8|d }|d= ||d< t | t|d< tjj|d< |rbtjj|d< z$tjj| fi |}| d }W n0 ty } ztt|W Y d }~n
d }~0 0 |j	r|sd	| t|f }t|d
}|S )NFsilenter%   shellstdoutstderrr   z"command execution failed: %s -> %rr   )
r   r   r   
subprocessPIPEPopencommunicateOSError
ValueError
returncode)cmdr   r   tmppoutputr   r   r   r   r   
cmd_output	  s.    "r   
apply_linkc                 C   s*  | j }ddlm} | t| dg | _| t| dg | _| t| dg }| jj}t	 }t	 }t
|}|r~tjr~td |r&| }||v rq~||}	|	  || t|	ddr| t|	dg D ]6}
||
}|  t|ddrt|j|s||
 qt|	ddr|	j|	jtjd	 d }t|	j|rP|d
|g n|d|g | j|	j | j j|	jj7  _|	jjd j }||d vr|d|g | t|	dg D ]B}||vr|| |d|  s|| jvr| j d| qt|	ddr~| j!|	"|	j# q~dS )z{
    process the uselib_local attribute
    execute after apply_link because of the execution order set on 'link_task'
    r   )stlink_taskuselibr\   r   z6compat: "uselib_local" is deprecated, replace by "use"Nr   r   STLIBLIBr   STLIB_export_includes)$r%   Zwaflib.Tools.ccrootr   r   rd   r   r\   r*   get_tgen_by_namesetr   dequer   r   warnpopleftr   addr   r   r   r   rfindr    r!   rp   set_run_after	dep_nodesr1   r   rD   prepend_valueinsertr,   rc   r   )rB   r%   r   namesr   seenZseen_uselibr   Zlib_nameyr#   obj	link_nametmp_pathvr   r   r   apply_uselib_local)  sX    




r  cprogram
cxxprogramcstlibcxxstlibcshlibcxxshlibdprogramdstlibdshlibc           
      C   s   t | dg }|sdS | |}| jj}g }|r|d }||v rL|dd }q*||}t |ddrd}||j}|  |D ]}||v rq|d}|g| }q||rq*|  || t |dg D ]}	| jj	
|	j qq*dS )zWadd the .o files produced by some other object files in the same manner as uselib_localadd_objectsNr   r   compiled_tasks)rd   r   r*   r   r  reverser   r   r   r/   r,   r1   )
rB   r   r   r   r#   r   Zaddedr3   utr   r   r   apply_objdepsu  s6    

r  c                 C   s8   t | dsd S | jD ]}| j|}| jj| qd S )N	obj_files)r=   r  r   find_resourcer   r/   r   )rB   r#   noder   r   r   process_obj_files  s
    

r  c                 C   s6   t | dsg | _d| jvr&| jd | j| dS )z}Small example on how to link object files as if they were source
    obj = bld.create_obj('cc')
    obj.add_obj_file('foo.o')r  r  N)r=   r  methsr   )rB   rO   r   r   r   add_obj_file  s
    

r  )N)N)N)TN)TN)FFN)8r    r   syswaflibr   r   r   r   r   r   r   r	   waflib.TaskGenr
   r   waflib.Configurer   r   Zwaflib.Tools.flexr   r5   declare_chainBuildContextvariantCleanContextInstallContextUninstallContextListContextr?   r@   rD   rE   rQ   rV   rg   ry   r|   r   find_programr   nadaZENFORCE_GROUP_ORDERINGZAUTOCLEANUP_STALE_FILESr   r   r   r   check_group_orderingr   r   beforer  r  r  taskgen_methodr  r   r   r   r   <module>   s   $






1'



I(
