a
    	$aN`                  
   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
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mZ d dlmZ d dlmZ d dl	mZ d d	lmZ d
Zejd  dkZ e rdd Z!ndd Z!e"ddZ#e"ddZ$e"ddZ%e"ddZ&dd Z'e'e_'e'e_(e'dd Z)dd Z*dd Z+dd Z,dd Z-d d! Z.e'd"d# Z/e'd$d% Z0e'd&d' Z1e1e
j2_1d(d) Z3e3e
j2_3d*d+ Z4d,d- Z5e5ej6_5ed.d/d0d1ed2d3d4d5 Z7d6d7 Z8d~d8d9Z9d:d; Z:e'd<d= Z;e;e
j2_;dd>d?Z<ddAdBZ=dCdD Z>dEdF Z?e'ddGdHZ@e@e
j2_@ddJdKZAddLdMZBzd dNlCmDZD eDdOZEW nd   zd dlDZDeDDdOZEW n@   eFdPe_GG dQdR dReHZIdSdT ZJeIe_DeIe_DeJe_KY n0 Y n0 dUdV ZLdWdX ZMeMe
j2_Me'dYdZ ZNeNej6_NeNe
j2_Nd[d\ ZOej6jPZQdd]d^ZReRej6_Pi aSd_d` ZTeTej6_TddadbZUdcdd ZVdedf ZWddgdhZXeXe
j2_Xdidj ZYddkdlZZeZe
j2_Zdmdn Z[d dol\m]Z] dpdq Z^e^e
j2_^e^e_^drds Z_e_e
j2__ed1d0dteduedvdwdx Z`dd|d}Zaeaej6_adS )    N)SUPPRESS_HELP)BuildOptionsUtilsTaskLogs	ConfigureErrorsContext)	Scripting)featurebeforeafter)ConfigurationContext)debug)	ConfigSet)CACHE_SUFFIXshared   c                 C   s<   | }t | tr| d}nt | ts8tdt| | f |S )Nutf8z!Expected byte of string for %s:%s)
isinstancebytesdecodestr
ValueErrortypeZbytesorstringtmp r   l/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/samba_utils.py
get_string   s    

r    c                 C   s0   | }t | ts,t | ts,tdt| | f |S )Nz!Expected str or unicode for %s:%s)r   r   unicoder   r   r   r   r   r   r    -   s    Z644   Z744Z755Z777c                    sJ    fdd} j |_ dt v r& }ttj j | ttj j |  S )Nc                     sJ   d}d|v r|d }|d= z | i |W S  t jyD   |r@ Y n0 d S )NT	mandatory)r	   ConfigurationError)kkwr#   fr   r   fun;   s    zconf.<locals>.funr#   )__name__inspect	getsourcesetattrr   r   r   BuildContext)r(   r)   r   r'   r   conf9   s    r/   c                 C   sr   t | d}||v rH|| dkrHtd|| j ||| f  td t| d|| td||| j f  dS )zset the target type of a targetTARGET_TYPEEMPTYz<ERROR: Target '%s' in directory %s re-defined as %s - was %s   z0task_gen: Target '%s' created of type '%s' in %sT)	LOCAL_CACHEr   errorpathabspathsysexitLOCAL_CACHE_SETr   )ctxtargetvaluecacher   r   r   SET_TARGET_TYPEQ   s    
 
r>   c                 C   s   t | d}||vrdS || S )zget target type from cacher0   Nr3   )r:   r;   r=   r   r   r   GET_TARGET_TYPE]   s    
r@   c                 C   sJ   dt jv rt jd }nd}|d}| |vrF||  d|t jd< dS )z add something to LD_LIBRARY_PATHLD_LIBRARY_PATH :N)osenvironsplitappendjoin)r5   Zoldpathnewpathr   r   r   ADD_LD_LIBRARY_PATHe   s    


rJ   c                 C   s6   t |dg D ]$}| |}|rt |ddr dS qdS )z2return True if a target links to a private libraryZ
final_libsprivate_libraryFT)getattrget_tgen_by_name)bldr;   libtr   r   r   needs_private_libq   s
    
rQ   c                 C   s`   | j }g |jd< t }|jjr2|||jj |jjrXt|| rX|||jj	 t
|S )z the rpath value for installationRPATH)rN   envsetZRPATH_ON_INSTALLaddEXPAND_VARIABLESLIBDIRZRPATH_ON_INSTALL_PRIVATErQ   ZPRIVATELIBDIRlist)r;   rN   retr   r   r   install_rpathz   s    
rZ   c                    s>    fdddD }g  j d<  j jr(|S |D ]}t| q,g S )zthe rpath value for buildc                    s$   g | ]}t jd  jj|f qS )z%s/%s)rD   r5   normpathrS   BUILD_DIRECTORY).0drN   r   r   
<listcomp>       zbuild_rpath.<locals>.<listcomp>)r   zshared/privaterR   )rS   ZRPATH_ON_BUILDrJ   )rN   Zrpathsrpathr   r_   r   build_rpath   s    

rc   c                 C   s(   || j v r| j | S i | j |< | j | S )zXreturn a named build cache dictionary, used to store
       state inside other functions)rS   )r:   namer   r   r   r3      s    


r3   c                 C   s   t | |}|||< dS )zset a value in a local cacheNr?   )r:   Z	cachenamekeyr<   r=   r   r   r   r9      s    
r9   c                 C   s   |st d| dS )za build assert callz
ERROR: %s
N)r	   WafError)r:   Z
expressionmsgr   r   r   ASSERT   s    rh   c                 C   s4   d}t |D ]"}|tjtj|| d }q|S )z=create a list of files by pre-pending each with a subdir namerB    )TO_LISTrD   r5   r[   rH   )rN   subdirrX   rY   lr   r   r   SUBDIR   s     rm   c                 C   s"   |D ]}|| vr|| | |< qdS )z%concatenate two dictionaries d1 += d2Nr   )Zd1Zd2rP   r   r   r   dict_concat   s    rn   c                 C   s   |t jj|< || _dS )z"add a new top level command to wafN)r
   g_module__dict__rd   )optrd   functionr   r   r   ADD_COMMAND   s    rs   ccccshlibcprogramZ
apply_coreZ	exec_rulec                 C   sv   t | ddrr| | j}|D ]T}| j|}| j|dud|| jf  |  t |ddr|  jd|j	 7  _qdS )zThe new depends_on attribute for build rules
       allow us to specify a dependency on output from
       a source generation rule
depends_onNz"Failed to find dependency %s of %smore_includesri   )
rL   to_listrx   rN   rM   rh   rd   postincludesry   )selflstxyr   r   r   process_depends_on   s    r   c                 C   s2   i }g }| D ] }||v rqd||< | | q|S )z?return a uniquified list in the same order as the existing listT)rG   )seqseenresultitemr   r   r   unique_list   s    
r   c                 C   s`   | du rg S t | trt| S t| dkr.g S | |}|D ]}|d dkr<t|   S q<|S )z:Split a list, preserving quoted strings and existing listsNr   ")r   rX   lenrF   shlex)r   	delimiterr~   er   r   r   rj      s    

rj   c                 C   s   t d| }g }|D ]d}t d|rn|dd }||vrRtd|| |jt|f || }t|trnd|}|	| qd|S )z<substitute vars, throw an error if a variable is not definedz(\$\{\w+\})z	\$\{\w+\}   z/Failed to find variable %s in %s in env %s <%s>ri   rB   )
rerF   matchKeyError	__class__r   r   rX   rH   rG   )stringrS   r~   outvZvnamer   r   r   subst_vars_error   s    

r   c                 C   s   t | j| | jS )z=Substitute an environment variable for any embedded variables)r   rS   )r:   Zvarnamer   r   r   SUBST_ENV_VAR   s    r   c                 C   sh   g }t | D ]T}| d | }t j|r<|t|| q|rNt||sNq|t j|| q|S )zrecursive directory list/)	rD   listdirr5   isdirextendrecursive_dirlistfnmatchrG   relpath)dirZrelbasepatternrY   r(   f2r   r   r   r     s    r   Tc              
   C   sd   zt | | W nN ty^ } z6|jtjkrH|rHt | t | | n W Y d}~n
d}~0 0 dS )zCan create symlink by forceN)rD   symlinkOSErrorerrnoEEXISTremove)srcdstforceexcr   r   r   r     s    
r   c                 C   sT   | sdS |  dr&t| dd  dS tj| r6dS ttj|  t|  dS )zlike mkdir -pNr   r   )endswithmkdir_prD   r5   r   dirnamemkdir)r   r   r   r   r     s    
r   c                 C   s>   | du r| S d}|  ddkr:|dkr:t| |} |d8 }q| S )zrecursively expand variablesNd   ${r   r   r2   )findr   )r   rS   limitr   r   r   SUBST_VARS_RECURSIVE,  s    

r   c                 C   s   t |tr0g }|D ]}|t| ||d q|S t |ts>|S t }|}|durv| D ]}|| ||< qZt||}|ddkrt|| j	}|ddks|ddkrt
d|  td |S )zexpand variables from a user supplied dictionary

    This is most useful when you pass vars=locals() to expand
    all your local variables in strings
    )varsNr   r   z$(z/Failed to substitute all variables in varstr=%sr2   )r   rX   rG   rV   r   r   keysr   r   rS   r   r4   r7   r8   )r:   Zvarstrr   rY   srS   r   r   r   r   rV   7  s&    



rV   Fc                 C   sX   |rt | |} t| }t|r,t|S t|rBt| S td|| f  dS )z2run a external command, return exit code or signalz&Unknown exit reason %d for command: %sr   )	r   rD   system	WIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGr   r4   )cmdrS   shellstatusr   r   r   RUN_COMMAND\  s    




r   c                 C   s   t  }|d u r tjtjjd}d}|jD ]}t|t	sBd|}| D ]b}d|||f }|r||
 D ]\}}	d||	|f }qdtd||f  t|}
|
rFtd|  |
}qFq*|S )Npythonr   ri   zPYTHONPATH=%s %s %sz%s=%s %szRunning Python test with %s: %szPython test failed: %s)LOAD_ENVIRONMENTrD   r5   rH   r
   ro   r   Zpython_interpretersr   r   itemsprintr   )Z	testfilesZ
pythonpathZ	extra_envrS   r   ZinterpZtestfiler   re   r<   rY   r   r   r   RUN_PYTHON_TESTSl  s$    


r   )md5s   abcdZabcdc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
replace_md5c                 C   s
   d | _ d S N)valr}   r   r   r   __init__  s    zreplace_md5.__init__c                 C   s   t | j|f| _d S r   )hashr   )r}   r   r   r   r   update  s    zreplace_md5.updatec                 C   s
   t | jS r   )r   r   r   r   r   r   digest  s    zreplace_md5.digestc                 C   s   |   dS )Nhex)r   encoder   r   r   r   	hexdigest  s    zreplace_md5.hexdigestN)r*   
__module____qualname__r   r   r   r   r   r   r   r   r     s   r   c                 C   s:   t | d}t }| r*|d} ||  q|  | S )Nrbi )openr   readr   closer   )filenamer(   mr   r   r   replace_h_file  s    

r   c               	   C   sH   t   } z$tjtjjdt }| | W n t	t
fyB   Y n0 | S )zXload the configuration environment, allowing access to env vars
       from new commandszc4che/default)r   rD   r5   rH   r
   ro   r   r   loadr   IOError)rS   pr   r   r   r     s    r   c                 C   s>   | j  }ttj ||j}ttj ||j}||kS )z(return True if file1 is newer than file2)r5   r6   rD   statrH   st_mtime)rN   Zfile1Zfile2curdirt1t2r   r   r   IS_NEWER  s    
r   c                 C   s   z
| j }W n ty(   t  }| _ Y n0 tj| j |}tj|rXtj|}ntjtjtj	j
|}| jj}|d | }||v rdS || tj|| j }|dv r| |S dtjv r| |S td|  dS )z=recurse into a directory, relative to the curdir or top levelrC   N)OptionsContextr   r.   CleanContextInstallContextUninstallContextListContextZClangDbContextzwaflib.extras.compat15z!Unknown RECURSE context class: {})visited_dirsAttributeErrorrT   rD   r5   rH   r6   existsr
   ro   topr   r*   rU   r   recurser7   modulesr   r4   format)r:   Z	directoryr   r^   r6   Zctxclassre   r   r   r   r   RECURSE  s(    




r   c                 C   sn  dt jvrdS t jd}|du r&d}d}d}t|D ]
}|dd dkrt|dd  | _t_tjdkrxd	gt_tjdkrd
gt_q8|d 	 r|
ddkr|
d}t| |d| ||d d  q8|d dkr|D ]0}td|rd}|d}q|dkrd| _qq8td|r6d}|d}q8|dkr8d| _q8|sTd| _n|rj|rjt|| _dS )zcheck for MAKEFLAGS environment variable in case we are being
    called from a Makefile try to honor a few make command line flagsZWAF_MAKENZ	MAKEFLAGSrB   Fr   r   zV=runner*=r   r2   -zj[0-9]*$Tjr%   z	-j[0-9]*$z-jz-k)rD   rE   getr   rF   intverboser   zonesisupperr   r-   r   searchstripkeepjobs)optionsZ	makeflagsZjobs_setr   rq   locr   r   r   r   CHECK_MAKEFLAGS  sB    




"
r   c           	      C   sT   t | |||d\}}}t| |jdkrJG dd dt}ddlm} ||_|||fS )N)_argscwdallow_unknownr2   c                   @   s   e Zd Zdd ZdS )z4wafsamba_options_parse_cmd_args.<locals>.NoOpSpawnerc                 S   s   d S r   r   )r}   masterr   r   r   r   %  s    z=wafsamba_options_parse_cmd_args.<locals>.NoOpSpawner.__init__N)r*   r   r   r   r   r   r   r   NoOpSpawner$  s   r  r   )Runner)waflib_options_parse_cmd_argsr   r   objectwaflibr  Spawner)	r}   r   r  r  r   commandsenvvarsr  r  r   r   r   wafsamba_options_parse_cmd_args  s    
r  c                 C   s&   |t v rt | S | |}|t |< |S )zfind or create an option group)option_groupsadd_option_group)rq   rd   grr   r   r   option_group.  s
    
r  c                 C   sH   |rt tj|  z t| d}|| |  W n   Y dS 0 dS )zsave data to a filewFT)r   rD   r5   r   r   writer   )r   contentsZ
create_dirr(   r   r   r   	save_file9  s    

r  c                 C   s2   zt | d}| }|  W n   Y dS 0 |S )zreturn contents of a filerN)r   r   r   )r   r(   r  r   r   r   	load_fileF  s    
r  c                 C   sD   t jt jdds tdddl}| }dt	_
t| dS )zrerun configure if necessaryWAFLOCKz.lock-wscriptzconfigure has not been runr   NT)rD   r5   r   rE   r   r	   rf   samba_wildcardZfake_build_environmentr   
autoconfigr   Zcheck_configured)r:   r  rN   r   r   r   reconfigureQ  s    
r  c                 C   s\   |du rdS |dd   r |S tj|\}}|r@| jj| S tj| jj\}}|| S )zLmap a filename with a shared library extension of .so to the real shlib nameNr   )isdigitrD   r5   splitextrS   pyext_PATTERNcshlib_PATTERN)r:   rd   r   Zroot1Zext1Zroot2Zext2r   r   r   map_shlib_extension[  s    r  c                 C   s6   t j| }|s||  S t j| }t j||| S )zJapply a filename pattern to a filename that may have a directory component)rD   r5   r   basenamerH   )r   r   r   r   r   r   r   apply_patternj  s
    r!  c                 C   s   |rt || jj}nt || jj}|rB|dd dkrB|dd }|r|d dkr^|dd }tj|\}}|dkrd|||f }nd	|||f }|S )
zmake a library filename
         Options:
              nolibprefix: don't include the lib prefix
              version    : add a version number
              python     : if we should use python module name conventionsr   r   rO   N.r2   z.dylibz%s.%s%sz%s%s.%s)r!  rS   r  r  rD   r5   r  )r:   rd   Znolibprefixversionr   libnamerootextr   r   r   make_libnamer  s    r'  c                 C   sf   t | d}g }|D ]N}|| }|dvr(q| |}|du rVtd||f  td || q|S )z(return a list of build objects for sambar0   )	SUBSYSTEMZMODULEBINARYLIBRARYZASN1PYTHONNz*Target %s of type %s has no task generatorr2   )r3   rM   r   r4   r7   r8   rG   )rN   targetsZtgt_listtgtr   rP   r   r   r   get_tgt_list  s    


r.  )WSCRIPT_FILEc              	   C   s   d}t | tjrd}nt | tjr&d}tj| j t	d | d | }| j
|}|rz
| j}W n ty   i  }| _Y n0 ||vrd||< | | z2|dd}tt|| d| j W | | n| | 0 dS )	z cause waf to process additional script based on `rule'.
        You should have file named wscript_<stage>_rule in the current directory
        where stage is either 'configure' or 'build'
    rB   	configurebuild_Tr  Nexec)r   r   r   r   r.   rD   r5   rH   r6   r/  r%  	find_noderecurse_cacher   pre_recurser   r3  compile	exec_dictpost_recurse)r}   ruleZstage	file_pathnoder=   function_coder   r   r   PROCESS_SEPARATE_RULE  s&    $

r>  c                 C   s   |  drdS dS )NAD_DC_BUILD_IS_ENABLEDTF)
CONFIG_SETr   r   r   r   r?    s    
r?  Z
cstaticlibZapply_lib_varsZapply_obj_varsc                 C   s^   dd }| j }|d D ]}|||r|d | q|d D ]}|||r<|d | q<dS )zAbefore apply_obj_vars for uselib, this removes the standard pathsc                 S   s&   | j D ]}|tj|kr dS qdS )NTF)ZSTANDARD_LIBPATHrD   r5   r[   )rS   r5   _pathr   r   r   is_standard_libpath  s    
z8samba_before_apply_obj_vars.<locals>.is_standard_libpathrR   LIBPATHN)rS   r   )r}   rB  r   ir   r   r   samba_before_apply_obj_vars  s    

rE  r   withwithoutc           
      C   s   |d u rd}n$|du rd}n|du r*d}nt |}|dkrFd||f }|d u r^d|d	d
 }d||f }d||f }	| j||d||d | j|	td|d d S )NautoTyesFnor   z"Build with %s support (default=%s)zwith_%sr   r2  z--%s-%s
store_true)helpactiondestdefaultstore_false)rL  rM  rN  )r   replace
add_optionr   )
rq   optionrL  rN  rO  	with_namewithout_nameZdefault_strZwith_valZwithout_valr   r   r   samba_add_onoff_option  s&    
rV  )N)N)T)N)NF)NN)NNF)F)F)FNF)r   NTrF  rG  )br   rD   r7   r   r   r   r+   optparser   r  r   r   r   r   r   r   r	   r
   r   waflib.TaskGenr   r   r   waflib.Configurer   waflib.Logsr   r   Zwaflib.Buildr   LIB_PATHversion_infoZPY3r    r   MODE_644ZMODE_744ZMODE_755ZMODE_777r/   Zconftestr>   r@   rJ   rQ   rZ   rc   r3   r9   rh   r.   rm   rn   rs   r   r   r   rj   r   r   r   r   r   r   rV   r   r   hashlibr   Zfoor   SIG_NILr  r   r   h_filer   r   r   r   parse_cmd_argsr  r  r  r  r  r  r  r  r!  r'  r.  Zwaflib.Contextr/  r>  r?  rE  rV  r   r   r   r   <module>   s   0(





	
	





!  


	
0





  
