a
    	”$aÆ£  ã                   @   s¸  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 d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ ed	d
„ ƒZedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zeej _dd„ Z!dd„ Z"dd „ Z#d!d"„ Z$d#d$„ Z%d%d&„ Z&d'd(„ Z'd)d*„ Z(d+d,„ Z)d-d.„ Z*d/d0„ Z+d1d2„ Z,d3d4„ Z-d5d6„ Z.d7d8„ Z/d9Z0g d:¢Z1g d;¢Z2d<gZ3g d=¢Z4g d>¢Z5d?gZ6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:e:ej _:dS )Hé    N)ÚBuildÚOptionsÚLogsÚUtilsÚErrors)Údebug)Úconf)Ú	ConfigSet)ÚBUILTIN_LIBRARY)ÚLOCAL_CACHEÚTO_LISTÚget_tgt_listÚunique_list)Úlibrary_flagsc                 C   s$   d| j vrg | j _| j j |¡ dS )z/add a dependency for all binaries and librariesÚGLOBAL_DEPENDENCIESN)Úenvr   Úappend)ÚctxÚdep© r   úk/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/samba_deps.pyÚADD_GLOBAL_DEPENDENCY   s    
r   c                 C   s   d| j _dS )zGindicate that circular dependencies between libraries should be broken.TN)r   ÚALLOW_CIRCULAR_LIB_DEPENDENCIES)r   r   r   r   Ú#BREAK_CIRCULAR_LIBRARY_DEPENDENCIES   s    r   c                 C   s   t | dƒ}|||< dS )z,setup some implied dependencies for a SYSLIBÚSYSLIB_DEPSN)r   )r   ÚtargetÚdepsÚcacher   r   r   ÚSET_SYSLIB_DEPS   s    
r   c           	   	   C   sÐ   t | dƒ}t | dƒ}|D ]²}|  ||v d| ¡ || }|dks|dkrJq|  |¡}|  |dud| ¡ || D ]L}|d }|| }|d	v rŽqp|  |dud
|||f ¡ |dv rp|j |¡ qpt|jƒ|_qdS )zôexpand the reverse dependencies resulting from subsystem
       attributes of modules. This is walking over the complete list
       of declared subsystems, and expands the samba_deps_extended list for any
       module<->subsystem dependenciesÚINIT_FUNCTIONSÚTARGET_TYPEz Subsystem target %s not declaredÚDISABLEDÚEMPTYNzUnable to find subsystem %sÚTARGET)r!   r"   z)Subsystem target %s for %s (%s) not found©Ú	SUBSYSTEM)r   ÚASSERTÚget_tgen_by_nameÚsamba_deps_extendedr   r   )	ÚbldÚsubsystem_listÚtargetsÚsubsystem_nameÚtypeÚ	subsystemÚdÚmodule_nameÚmodule_typer   r   r   Úexpand_subsystem_deps#   s(    



ÿr2   c                 C   s~  | j dv rät| jƒ| _t| jƒ| _t| jƒ| _| j ¡ }t	| t|ƒƒ\}}}t
| dg ƒdd… }| |¡ || _t
| ddƒrž| jjrž| jjD ]}| j |¡ qŒt
| ddƒrÌ| jjrÌ| jjD ]}| j |¡ qºtd| j| j| j| jƒ | j dv rFt| jƒ| _| j t| jƒ¡ | jD ]$}| j |¡}| j t|jƒ¡ qt| jƒ| _t
| ddƒrzg }	| jD ]}
|	 |
 ¡ ¡ q^|	| _dS )	a  This builds the dependency list for a target. It runs after all the targets are declared

    The reason this is not just done in the SAMBA_*() rules is that we have no way of knowing
    the full dependency list for a target until we have all of the targets declared.
    ©ÚLIBRARYÚBINARYÚPYTHONÚsamba_ldflagsNÚallow_undefined_symbolsFzSdeps: computed dependencies for target %s: uselib=%s uselib_local=%s add_objects=%sr$   Úuselib)Ú
samba_typeÚlistÚfinal_syslibsr9   Ú
final_libsÚuselib_localÚfinal_objectsÚadd_objectsÚcopyr   ÚgetattrÚextendÚldflagsr   Úundefined_ldflagsÚremoveÚundefined_ignore_ldflagsr   r   ÚsnameÚdirect_syslibsr)   r'   r   Úupper)ÚselfÚlibsÚcflagsrD   ÚcpppathZnew_ldflagsÚfÚlibÚtZup_listÚlr   r   r   Úbuild_dependenciesJ   s<    


ÿ

rS   c                 C   s  t | ddƒdu rdS | j}t|| tƒ i ƒ}g }t | ddƒrPt | ddƒrP| d¡ | | j¡ d|jv r‚t | ddƒr‚| |jd ¡ | d	¡ tƒ }g }|D ]˜}| |¡}| 	|dud
|| j
f ¡ t |dg ƒdd… }t |ddƒrì| d¡ |g kröqš|j}	|D ]0}
|	d |
 }||vr | |¡ | |¡ q qš| j |j¡}|D ]}
tj |
|¡}| |¡ qFt | ddƒrŒt | ddƒsŒ| d¡ g }|D ]Z}|d d	kr´| |¡ q”tj | j ¡ |¡}tj || jj ¡ ¡}| d	| ¡ q”t|ƒ| _td| j
| jƒ dS )a  This builds the right set of includes for a target.

    One tricky part of this is that the includes= attribute for a
    target needs to use paths which are relative to that targets
    declaration directory (which we can get at via t.path).

    The way this works is the includes list gets added as
    samba_includes in the main build task declaration. Then this
    function runs after all of the tasks are declared, and it
    processes the samba_includes attribute to produce a includes=
    attribute
    Úsamba_includesNÚlocal_includeTÚlocal_include_firstÚ.ÚEXTRA_INCLUDESÚglobal_includeú#z#Unable to find dependency %s for %sÚsamba_includes_extendedú/r   z)deps: includes for target %s: includes=%s)rB   r)   Úincludes_objectsÚsetr   rC   r[   r   r'   r&   rH   Úsamba_abspathÚaddÚpathÚabspathÚosÚrelpathÚjoinÚsrcnoder   Úincludesr   )rK   r)   Zinc_depsrg   Zinc_setZinc_absr/   rQ   ZinclistÚtpathÚincZnpathZmypathrd   Zincludes_topÚiZabsincZrelincr   r   r   Úbuild_includesy   sZ    








ÿrk   c                 C   s  | j }t|dƒ}| j}| d¡r,|dd… }g }||v rB| |¡ t| ddƒ}|durd| t|ƒ¡ t| ddƒ}|dur‚| |¡ d| jv rdS t| d	d
ƒ}t|dƒ}t| dg ƒdd… }|g kr(| 	dd¡}| 	dd¡}| 	dd¡}| d||f ¡ |d
krd| }	| d||	f ¡ || _
dS |D ]ä}| ||v d|| jf ¡ g }
|| D ]&}||d  dkrV|
 |d ¡ qV|
g krÀ| d||f ¡ |d
krd| }	| d||	f ¡ nN| d|d |
¡d | f ¡ d dd„ |
D ƒ¡d|  }	| d||	f ¡ q,|| _
dS )z+This builds the right set of init functionsr   ú.objlistr   iøÿÿÿÚsamba_modulesNÚsamba_subsystemÚpyembedÚinit_function_sentinelZNULLr    Úsamba_cflagsú-Ú_rW   r\   z-DSTATIC_%s_MODULES=%sz)extern void __%s_dummy_module_proto(void)z-DSTATIC_%s_MODULES_PROTO=%sz7No init_function defined for module '%s' in target '%s'r#   r!   ÚINIT_FUNCTIONú,Ú c                 s   s   | ]}d | V  qdS )z_MODULE_PROTO(%s)Nr   )Ú.0rO   r   r   r   Ú	<genexpr>   ó    z%add_init_functions.<locals>.<genexpr>)r)   r   rH   Úendswithr   rB   rC   r   ÚfeaturesÚreplacerM   r&   re   )rK   r)   Ú
subsystemsrH   ÚmodulesÚmÚsentinelr+   rM   ÚprotoZinit_fn_listr/   r   r   r   Úadd_init_functionsÇ   s`    








ÿ

 ÿr‚   c              	   C   sì  t dƒ t| dƒ}|D ]¶}tt|ddƒƒ}tj tj |j | j	¡|j	j
d ¡¡}tƒ }|D ]h}t|tƒs~td| ƒ | ¡ }tj tj ||¡¡}||v rºt d||jf ¡ t d¡ | |¡ q\||_qi }	|D ]Œ}||j d	vrêqÖ|jD ]p}
|j |
¡}t|d
tƒ ƒ}|D ]L}||	vr(i |	|< |j|	| vrFg |	| |j< |	| |j  |j¡ qqðqÖ|	D ]~}t|	| ƒdkr¢tjjr¢t d||	|   ¡ f ¡ |	| D ]8}t|	| | ƒdkrªt! "d|||	| | f ¡‚qªqhdS )z;see if we are compiling the same source file more than oncez$deps: checking for duplicate sourcesr    Úsourcerv   z/defaultz*strange path in check_duplicate_sources %rz-ERROR: source %s appears twice in target '%s'é   r3   Úsamba_source_setz1WARNING: source %s is in more than one target: %szAERROR: source %s is in more than one subsystem of target '%s': %sT)#r   r   r   rB   rc   ra   Únormpathrd   rb   r   ÚBUILD_DIRECTORYr^   Ú
isinstanceÚstrÚprintre   r   ÚerrorrH   ÚsysÚexitr`   r…   r@   r)   r'   r   Úlenr   ÚoptionsÚSHOW_DUPLICATESÚwarnÚkeysr   ÚWafError)r)   Útgt_listr+   rQ   Zsource_listrh   Zobj_sourcesÚsÚpr}   ÚobjÚt2Z
source_setZtnamer   r   r   Úcheck_duplicate_sources  sH    
(



$r™   c              	      sò   ‡ fdd„}ˆ j jD ]}||ƒ}|jD ]
}||_q&qi }d}ˆ j jD ]}||ƒ}|||< |d7 }qDtˆ dƒ}	d}
|D ]x}t|dg ƒt|dg ƒ }|D ]V}ˆ  |¡}|d	u r¬q”||j }||j }||kr”t d
|j	|j|j	|jf ¡ d}
q”qt|
S )z˜see if we have any dependencies that violate the group ordering

    It is an error for a target to depend on a target from a later
    build group
    c                    s    ˆj ‰‡ ‡fdd„ˆjD ƒd S )Nc                    s&   g | ]}t ˆj| ƒt ˆ ƒkr|‘qS r   )ÚidÚgroups_names)rw   Úx©ÚgZtmr   r   Ú
<listcomp>=  ry   z<check_group_ordering.<locals>.group_name.<locals>.<listcomp>r   )Útask_managerr›   )rž   ©r)   r   r   Ú
group_name;  s    z(check_group_ordering.<locals>.group_namer   r„   r    Tr@   r>   NzJTarget %r in build group %r depends on target %r from later build group %rF)
r    ÚgroupsZ	tasks_genZsamba_groupr   rB   r'   r   r‹   rH   )r)   r”   r¢   rž   ÚgnamerQ   Zgrp_mapÚidxÚnamer+   ÚretÚtdepsr/   r˜   Zmap1Zmap2r   r¡   r   Úcheck_group_ordering4  s6    






ÿr©   c              
   C   sL   t | dƒ}|D ]8}||j dvr"qtd|j|jt|dg ƒt|dg ƒƒ qdS )z+show the final dependencies for all targetsr    )r4   r5   r6   r%   zPdeps: final dependencies for target %s: uselib=%s uselib_local=%s add_objects=%sr>   r@   N)r   rH   r   r9   rB   ©r)   r”   r+   rQ   r   r   r   Úshow_final_deps_  s    
ÿr«   c                 C   s‚   t | dƒ}|D ]n}|jdkr&|j|_n|j|_||j |_|j | j¡|_|j	dd… |_
t|jƒdd… |_t|ddƒ|_qdS )z3ensure a target has a the required samba attributesr    rv   Nrq   )r   r¦   rH   r   r:   ra   rb   r   r_   Ú
samba_depsr(   r   rT   r[   rB   rM   rª   r   r   r   Úadd_samba_attributesk  s    


r­   c                 C   sÊ   t | dƒ}i }|D ]N}t|ddƒs$q|jD ]4}|  ||v d||jf ¡ || dkr*|j||< q*q|D ]^}tt|jƒƒD ]J}|j| }||v rx|j|| krxtd|j||| f ƒ || |j|< qxqfdS )a
  replace dependencies based on grouping libraries

    If a library is marked as a grouping library, then any target that
    depends on a subsystem that is part of that grouping library gets
    that dependency replaced with a dependency on the grouping library
    r    Úgrouping_libraryFz-grouping library target %s not declared in %sr%   zAdeps: target %s: replacing dependency %s with grouping library %sN)r   rB   r(   r&   rH   ÚrangerŽ   r   )r)   r”   r+   ÚgroupingrQ   r   rj   r   r   r   Úreplace_grouping_libraries{  s     


r±   c              
   C   sh  t | dƒ}t | dƒ}| jj}tƒ }|D ]2}|  |¡}|jD ]}| |¡ | |d ¡ q:q&|D ]ú}tƒ |_tƒ |_tƒ |_	|j
dd… }	t|ddƒrª|j|vrª|	 |¡ |	D ]¨}||jkrÀq®||vræt d||jf ¡ t d¡ || d	v rôq®|| d
krB||j d
krB|j d¡dkrBt d|j|f ¡ t d¡ || dkrð|j	 |¡ ||v r®t|| ƒD ]|}
t| |
ƒrŽ|j |
¡ n\||
 dkrª|j	 |
¡ n@||
 dv rÆ|j |
¡ n$t d|
|j||
 f ¡ t d¡ qpq®|  |¡}|du r(t d||| |jf ¡ t d¡ |jdv rB|j |¡ q®|jdv r®|j |¡ q®q^tdƒ dS )z=build the direct_objects and direct_libs sets for each targetr    r   rl   NÚsamba_use_global_depsFzUnknown dependency '%s' in '%s'r„   )r"   r!   r6   éÿÿÿÿz3ERROR: Target %s has dependency on python module %sÚSYSLIB)r4   ÚMODULEz)Implied dependency %s in %s is of type %szno task %s of type %s in %s)r%   ÚASN1r6   zdeps: built direct dependencies)r   r   r   r^   r'   r¬   r`   Údirect_objectsÚdirect_libsrI   r(   rB   rH   rC   r   r‹   rŒ   r   Úfindr   r
   r:   r   )r)   r”   r+   Zsyslib_depsZglobal_depsZglobal_deps_excluder   rQ   r/   r   Zimpliedr˜   r   r   r   Úbuild_direct_deps›  sd    








0
ÿ



rº   c                 C   sB   |j |krdS || vr tƒ | |< |j | | vr>| |  |j ¡ dS )z-add a dependency loop to the loops dictionaryN)rH   r^   r`   )ÚloopsrQ   r   r   r   r   Údependency_loop×  s    

r¼   c                 C   sú   t |ddƒ}|dur|S tƒ }|jD ]\}||v r>t|||ƒ q$| |¡ |  |¡}t| |||ƒ}| |¡ | |j	¡}| |¡}q$t
| |tƒ |ƒD ]\}||v r¬t|||ƒ q’| |¡ |  |¡}t| |||ƒ}| |¡ | |j	¡}| |¡}q’||_|S )z¡recursively calculate the indirect library dependencies for a target

    An indirect library is a library that results from a dependency on
    a subsystem
    Úindirect_libsN)rB   r^   r·   r¼   r`   r'   r½   rF   Úunionr¸   Úindirect_objects)r)   rQ   Úchainr»   r§   r—   r˜   Úr2r   r   r   r½   á  s4    






r½   c                 C   sŒ   t |ddƒ}|dur|S tƒ }|jD ]\}||v r>t|||ƒ q$| |¡ |  |¡}t| |||ƒ}| |¡ | |j¡}| |¡}q$||_|S )z£recursively calculate the indirect object dependencies for a target

    indirect objects are the set of objects from expanding the
    subsystem dependencies
    r¿   N)	rB   r^   r·   r¼   r`   r'   r¿   rF   r¾   )r)   rQ   rÀ   r»   r§   rP   r˜   rÁ   r   r   r   r¿     s    



r¿   c                 C   sŠ   t |ddƒ}|dur|S tƒ }| |j¡}|jD ]N}||v r>q0|  |¡}| |¡ t| ||ƒ}| |¡ | |j¡}| |¡}q0||_|S )zìrecursively calculate the extended object dependencies for a target

    extended objects are the union of:
       - direct objects
       - indirect objects
       - direct and indirect objects of all direct and indirect libraries
    Úextended_objectsN)	rB   r^   r¾   r?   r=   r'   r`   rÂ   rF   )r)   rQ   rÀ   r§   rP   r˜   rÁ   r   r   r   rÂ   "  s    	



rÂ   c           
      C   s6  t |ddƒ}|dur|S |j ¡ }| |j¡}|jD ]\}||v rNt|||ƒ q4| |¡ |  |¡}t| |||ƒ}| 	|¡ | |j¡}| |¡}q4|jD ]’}||v r²t|||ƒ q˜| |¡ |  |¡}|du rüt
| dƒ}	t d||	| |jf ¡ t d¡ t| |||ƒ}| 	|¡ | |j¡}| |¡}q˜||_|S )z“recursively calculate the includes object dependencies for a target

    includes dependencies come from either library or object dependencies
    r]   Nr    z4Target %s of type %s not found in direct_libs for %sr„   )rB   r·   rA   r¾   r¸   r¼   r`   r'   r]   rF   r   r   r‹   rH   rŒ   r   )
r)   rQ   rÀ   Ú	inc_loopsr§   r—   r˜   rÁ   rP   r+   r   r   r   r]   ?  sB    








ÿ

r]   c           
   	   C   s,  i }i }|D ]4}t | |tƒ |ƒ t| |tƒ |ƒ t| |tƒ |ƒ q|D ]>}|j|v rFdD ]*}t||tƒ ƒ}t||| ||j ¡ƒ qXqF|D ]}td||| ƒ qŠ|D ]}td||| ƒ q¤| 	¡ D ]0}|| D ]"}||v rÎ||  
|| ¡||< qÎqÂ| 	¡ D ]4}|| D ]&}||v r||  
|| ¡||< qqü| 	¡ D ]”}|  |¡}|jdv r|||  
|j ¡||< ||  
|j¡||< |jdv r°||  
|j¡||< ||  
|j¡||< ||| v r:||  |¡ q:| 	¡ D ]@}|  |¡}||  
|j¡||< ||| v rØ||  |¡ qØ|D ]}|D ]€}dD ]t}t||tƒ ƒ}||v r–||  |¡}	|j|	v rr|	 |j¡ |	r–td|j|j||	ƒ | 
|	¡}t|||ƒ q0q(|D ]t}t|dtƒ ƒ}||v r||  |¡}	|j|	v rð|	 |j¡ |	rtd	|j|j||	ƒ | 
|	¡}t|d|ƒ q®qd
S )zfind and break dependency loops)r·   r¿   r¸   r½   ú/deps: Found dependency loops for target %s : %sz,deps: Found include loops for target %s : %sr$   ©r4   r6   )r¿   r½   z6deps: Expanded target %s of type %s from loop %s by %sr]   z?deps: Expanded target %s includes of type %s from loop %s by %sN)r¿   r^   r½   r]   rH   rB   ÚsetattrÚ
differencer   rA   r¾   r'   r:   r·   r¸   rF   )
r)   r”   r»   rÃ   rQ   ÚattrÚobjsÚloopÚtgtÚdiffr   r   r   Úbreak_dependency_loopsj  sx    








rÍ   c              
   C   s*  i }|D ]
}d|_ qd}dD ]Ø}|D ]Î}|j|kr4q$|j ¡ }|jD ]¦}|  |¡}t | |tƒ ƒ}	| |	¡}
|j|v r„|
 	||j ¡}
|
rDt
t|
ƒƒ}t| |ƒr qDtd|j|j|
|j|ƒ | 	|
¡}d}||vrØtƒ ||< ||  |
¡||< qD||_q$q|sþdS |D ]"}|  |¡}|j || ¡|_qdS )z:reduce objects by looking for indirect object dependenciesNF)r5   r6   r4   z8deps: removing dups from %s of type %s: %s also in %s %sT)rÂ   r:   r?   rA   r=   r'   r^   ÚintersectionrH   rÇ   ÚnextÚiterr
   r   r¾   )r)   r”   Zrely_onrQ   Úchangedr-   ÚnewrR   r˜   Zt2_objÚdupr/   Úrr   r   r   Úreduce_objects»  sB    





ÿ



rÕ   c                 C   s†   |   |¡}|t|dtƒ ƒvr dS |jD ]Z}||v r4q&| |¡ |d | }||krft d| ¡  dS t| ||||ƒ | |¡ q&dS )z>show the detailed path of a library loop between lib1 and lib2r=   Nz=>zlibrary loop path: )	r'   rB   r^   r(   r`   r   r‘   Úshow_library_looprF   )r)   Zlib1Zlib2ra   ÚseenrQ   r/   Zpath2r   r   r   rÖ   é  s    


rÖ   c              	   C   sÎ  |D ]8}|j  t| |tƒ |ƒ¡|_|j t| |tƒ |ƒ¡|_q|D ]8}|j|jv r`|j 	|j¡ |j|jv rB|j 	|j¡ qB|D ]8}|j
dkr€|  |j¡r€t| dƒ}t| dƒ}|jD ]ú}|d }|  |¡}|du rìt d| ¡ t d¡ |j |¡ |j t| |tƒ ƒ¡|_||v r¶|| D ]Ž}	|	d }
||
 d	krD|
d }n||
 d
kr |
}nq |  |¡}|du rˆt d| ¡ t d¡ |j |¡ |j t| |tƒ ƒ¡|_q q¶tƒ |_q€|D ]Ð}|j
dv rÀ|j ¡ D ]²}|  |¡}|j|jv rÚt| jddƒr:t d|j|jf ¡ t|||jƒ |j 	|j¡ nPt d|j|jf ¡ t| |j|j|jtƒ ƒ t| |j|j|jtƒ ƒ t d¡ qÚqÀ|D ]}td||| ƒ q–dD ]ð}|D ]ä}|j
|krÎqº|D ]È}||jv rÒ||  |j¡}|j|v r
| 	|j¡ |j|v r"| 	|j¡ | ¡ D ]B}	|  |	¡}|j
d	kr*|j|jv r*td|	|jƒ | 	|	¡ q*|rÒtd|j||| |ƒ |j |¡|_qÒqºq²d}t| |ƒrØ|d7 }|dkr¨t d¡ qØq¨td|ƒ |D ]j}|j
dvrúqætƒ }|jD ]}	|  |	¡}| |j¡}q|jD ]}	|  |	¡}| |j¡}q*||_qæd}|D ]V}|j
dv rZ|j ¡ D ]8}|  |¡}|j|jv rtt d|j|jf ¡ d}qtqZ|rÂt d¡ tdƒ dS )z3calculate the final library and object dependenciesr5   r   r    rl   NzERROR: subsystem %s not foundr„   r#   r4   r%   rÅ   r   Fz&deps: removing library loop %s from %sz4ERROR: circular library dependency between %s and %srÄ   )r5   r6   r4   r5   z#deps: removing expansion %s from %sz:deps: Expanded target %s by loop %s libraries (loop %s) %sr   éd   z<WARNING: Unable to remove all inter-target object duplicatesz)deps: Object reduction took %u iterations)r5   r6   r4   r%   z)ERROR: Unresolved library loop %s from %sTz$deps: removed duplicate dependencies)r¸   r¾   r½   r^   r=   r·   r¿   r?   rH   rF   r:   ZNONSHARED_BINARYr   r'   r   r‹   rŒ   r   r`   rÂ   rA   rB   r   r‘   r¼   rÖ   r   rÇ   rÕ   rI   r<   )r)   r”   r»   rQ   r*   r+   rR   Zobjnamer˜   r/   r0   rÊ   r-   rÌ   ÚcountZsyslibsZlib_loop_errorr   r   r   Úcalculate_final_depsü  sÌ    












ÿ

ÿ









rÚ   c                 C   s˜   ||v rdS |   |¡}|du r6t d| ¡ t d¡ t d||jf ¡ t d||jf ¡ t d||jf ¡ | 	|¡ |jD ]}t
| ||ƒ q‚dS )z+recursively show the dependencies of targetNz!ERROR: Unable to find target '%s'r„   z%s(OBJECTS): %sz%s(LIBS): %sz%s(SYSLIBS): %s)r'   r   r‹   rŒ   r   Úinfor·   r¸   rI   r`   Úshow_dependencies)r)   r   r×   rQ   r˜   r   r   r   rÜ   ƒ  s    



rÜ   c           	      C   sö   t | dƒ}i }t d¡ |D ]T}||j dvr0qt|dtƒ ƒD ]0}|  |¡}||vr^tƒ ||< ||  |j¡ q>q|D ]*}t|| ƒdkrvt d||| f ¡ qvt d¡ dd	„ }t	||d
}|D ],}t|j
ƒdkrÄt d|jt|j
ƒf ¡ qÄdS )zTshow a list of object files that are included in more than
    one library or binaryr    zshowing duplicate objectsrÅ   r?   r„   ztarget '%s' is used by %sz4showing indirect dependency counts (sorted by count)c                 S   s   t |jƒt | jƒ S )N)rŽ   r¿   )Út1r˜   r   r   r   Úindirect_count±  s    z.show_object_duplicates.<locals>.indirect_count)Zcmpz!%s depends on %u indirect objectsN)r   r   rÛ   rH   rB   r^   r'   r`   rŽ   Úsortedr¿   )	r)   r”   r+   Zused_byrQ   Únr˜   rÞ   Zsorted_listr   r   r   Úshow_object_duplicates˜  s(    




rá   é   )r¬   rT   rU   rV   rq   rƒ   r®   r7   r8   Úuse_global_depsrY   )r9   r>   r@   rg   rM   rD   r(   r=   Z	INC_PATHS)ZNONSHARED_BINARIESr   ÚEXTRA_CFLAGSÚEXTRA_LDFLAGSrX   )r   r    r   r   z!buildtools/wafsamba/samba_deps.pyc                 C   s‚  t   ¡ }t|_t|_t|_i |_i |_i |_i |_i |_	i |_
tD ]&}t tj | j ¡ |¡¡j|j
|< qBtD ]}t| |ƒ|j|< qntD ]}| j| |j	|< qˆ|D ]À}i }tD ] }t||dƒ}	|	dur®|	||< q®|i krä||j|j< i }tD ] }t||dƒ}	|	durì|	||< qì|i kr$||j|j< i }tD ] }||jv r,|j| ||< q,|i kr¢||j|j< q¢tj | jd¡}
| |
¡ dS )zUsave the dependency calculations between builds, to make
       further builds fasterNÚ	sambadeps)r	   Úsavedeps_versionÚversionÚsavedeps_inputsÚsavedeps_outputsÚinputÚoutputÚoutenvÚcachesÚenvvarÚfilesÚsavedeps_filesrc   Ústatra   re   rf   rb   Úst_mtimeÚsavedeps_cachesr   Úsavedeps_envvarsr   rB   rH   Úsavedeps_outenvÚ	cache_dirZ
store_fast)r)   r”   ÚdenvrO   ÚcÚerQ   r¨   rÈ   ÚvÚdepsfiler   r   r   Úsave_samba_depsÇ  sN    $


rý   c                 C   s  t j | jd¡}t ¡ }z:tdƒ | |¡ |jtksJ|j	t	ksJ|j
t
krPW dS W n tyf   Y dS 0 tD ]@}||jvr€ dS |j| t  t j | j ¡ |¡¡jkrl dS qltD ](}||jvsÔ|j| t| |ƒkr² dS q²tD ]*}||jvs|j| | j| krà dS qà|D ]d}i }t	D ]$}	t||	dƒ}
|
dur|
||	< q|j|jv r^|j|j }ni }||kr dS q|D ]@}|j|jvrqz|j|j }|D ]}t|||| ƒ q qz|D ]>}|j|jvrÖqÀ|j|j }|D ]}|| |j|< qæqÀtdƒ dS )z5load a previous set of build dependencies if possibleræ   z!deps: checking saved dependenciesFNzdeps: loaded saved dependenciesT)rc   ra   re   r÷   r	   r   Z	load_fastrè   rç   ré   rê   Ú	Exceptionrñ   rð   rò   rf   rb   ró   rô   rî   r   rõ   rï   r   rB   rH   rë   rì   rÆ   rí   )r)   r”   rü   rø   rO   rù   rú   rQ   r¨   rÈ   rû   ZolddepsÚar   r   r   Úload_samba_depsþ  s^    

ÿþ

& 


r   c                 C   s  i }i }t | ƒ}t| |ƒ tjjp(tjj}|s<t| |ƒr<dS t ¡ }d| _	t
 d¡ tdƒ t| ƒ tdt|ƒ ƒ t| |ƒ tdt|ƒ ƒ t| |ƒ tdt|ƒ ƒ t| |ƒ tdt|ƒ ƒ tjjrÜt| tjjtƒ ƒ t| ||ƒ td	t|ƒ ƒ tjjrt| |ƒ tttfD ]8}td
|ƒ |D ]}||ƒ q(td|t|ƒf ƒ qtdƒ t| |ƒsxt
 d¡ t d¡ tdt|ƒ ƒ |  |¡s¨t
 d¡ t d¡ tdt|ƒ ƒ t| |ƒ tdt|ƒ ƒ tdt|ƒƒ | j sòt!| |ƒ tdt|ƒ ƒ t
 d¡ dS )z7check the project rules - ensuring the targets are saneNTzChecking project rules ...z$deps: project rules checking startedzdeps: expand_subsystem_deps: %sz$deps: replace_grouping_libraries: %szdeps: build_direct_deps: %sz deps: break_dependency_loops: %szdeps: calculate_final_deps: %szdeps: project rules checking %szdeps: %s: %sz$deps: project rules stage1 completedz$Duplicate sources present - abortingr„   z!deps: check_duplicate_sources: %szBad group ordering - abortingzdeps: check_group_ordering: %szdeps: show_final_deps: %sz;deps: project rules checking completed - %u targets checkedzdeps: save_samba_deps: %szProject rules pass)"r   r­   r   r   ZSHOWDEPSr   r   r   ÚTimerZ	new_rulesr   rÛ   r   r2   r‰   r±   rº   rÍ   rÜ   r^   rÚ   rá   rS   rk   r‚   r™   r‹   rŒ   r   r©   r«   rŽ   Ú
is_installrý   )r)   r»   rÃ   r”   Zforce_project_rulesÚtimerrO   rQ   r   r   r   Úcheck_project_rules?  sb    
ÿ











ÿ
r  c                 C   s"   | j jrdS d| j _|  t¡ dS )z-enable checking of project targets for sanityNT)r   Zadded_project_rulesÚadd_pre_funr  r¡   r   r   r   ÚCHECK_PROJECT_RULES“  s    r  );rc   rŒ   ÚreÚwaflibr   r   r   r   r   Úwaflib.Logsr   Úwaflib.Configurer   r	   Úsamba_bundledr
   Úsamba_utilsr   r   r   r   Úsamba_autoconfr   r   r   r   r2   rS   rk   r‚   r™   r©   ÚBuildContextr«   r­   r±   rº   r¼   r½   r¿   rÂ   r]   rÍ   rÕ   rÖ   rÚ   rÜ   rá   rç   ré   rê   rö   rõ   rô   rñ   rý   r   r  r  r   r   r   r   Ú<module>   s`   


'/N?.) <
'+Q. $7AT