a
    	”$aª@  ã                   @   s6  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 d dlmZmZmZ dd„ Zeej_edd„ ƒZed,d
d„ƒZed-dd„ƒZed.dd„ƒZed/dd„ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed0dd„ƒZed1dd „ƒZed2d"d#„ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZ ed*d+„ ƒZ!dS )3é    N)ÚBuildÚ	ConfigureÚUtilsÚOptionsÚLogsÚErrors)Úconf)ÚTO_LISTÚADD_LD_LIBRARY_PATHÚ
get_stringc                 O   s:   | t j_| dg ¡}|r|d= | jj|i |¤Ž}||_|S )ztsyntax help: provide the "match" attribute to opt.add_option() so that folders can be added to specific config testsÚmatch)r   ÚOptionsContextÚparserÚgetÚ
add_optionr   )ÚselfÚkÚkwr   Úopt© r   úp/home/jack/SDK/ZBT-AX3000-OpenWrt-21.02/build_dir/hostpkg/samba-4.14.12/./buildtools/wafsamba/samba_conftests.pyr   
   s    r   c           
   
   O   sx  d|vr| j  ¡ |d< g }d|v rp|d }tjjjjD ]8}t|ddƒr6||jv r6ttj|j	dƒ}|r6| 
|¡ q6dd„ }|||d ƒ |  |¡ |  |d ¡ d}z| j|i |¤Ž}W nl tjy" }	 zP|  |d d	¡ d
|v r|d
 rtjdkrü‚ n|  d| jj ¡ W Y d}	~	n4d}	~	0 0 ||d< |  |  |d |¡¡ ||| j ƒ | j|i |¤Ž | dd¡st|dkS |S )z<Override the waf defaults to inject --with-directory optionsÚenvÚmsgr   NÚ 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)ZCPPPATHÚosÚpathÚjoinÚLIBPATH)Údirsr   Úxr   r   r   Úadd_options_dir(   s
    

zcheck.<locals>.add_options_dirÚerrmsgÚYELLOWÚ	mandatoryé   z!the configuration failed (see %r)ÚsuccessÚokmsgÚexecuteFr   )r   Úderiver   r   r   Úoption_listÚgetattrr   ÚoptionsÚdestÚappendÚ
validate_cÚ	start_msgZ
run_c_coder   ÚConfigurationErrorÚend_msgr   ÚverboseÚfatalÚlogÚnameÚret_msgÚ
post_checkr   )
r   r   r   Zadditional_dirsr   r!   Údr"   ÚretÚer   r   r   Úcheck   s<    

(r=   ÚHAVE_NATIVE_ICONVc                 C   s&   | j dddddr"|  |d¡ dS dS )zGcheck if the iconv library is installed
       optionally pass a defineZ
iconv_openÚiconvTziconv.h)Ú	checklibcÚheadersr&   F)ÚCHECK_FUNCS_INÚDEFINE)r   Údefiner   r   r   ÚCHECK_ICONVJ   s    rE   ÚHAVE_LARGEFILEc                 C   sü   |   ddg¡}|durš| jddd|ddrš|  |¡ t|ƒ}|D ]X}|d	d
… dkr@|d
d	…  d¡}t|ƒdkr„|  |d d¡ q@|  |d |d ¡ q@| jd|dddr°dS | jd|ddddrÔ|  dd¡ dS | jd|ddddrø|  dd¡ dS dS )z&see what we need for largefile supportZgetconfZ
LFS_CFLAGSFzif (sizeof(off_t) < 8) return 1ZWORKING_GETCONF_LFS_CFLAGSTz.Checking getconf large file support flags work)rD   r)   Úcflagsr   Né   z-Dú=r&   r   Ú1z8Checking for large file support without additional flags)r)   r   z-D_FILE_OFFSET_BITS=64z#Checking for -D_FILE_OFFSET_BITS=64)r)   rG   r   Ú_FILE_OFFSET_BITSé@   z-D_LARGE_FILESzChecking for -D_LARGE_FILESZ_LARGE_FILES)ÚCHECK_COMMANDÚ
CHECK_CODEÚ
ADD_CFLAGSr	   ÚsplitÚlenrC   )r   rD   Zgetconf_cflagsZgetconf_cflags_listÚflagZ
flag_splitr   r   r   ÚCHECK_LARGEFILET   sN    ü
ýüürS   c              	   C   s>   | j ||dsdS |sd| }| jd||f |d|dd|dS )z?verify that a C prototype matches the one on the current system)rA   FzChecking C prototype for %sz%s; void *_x = (void *)%s)rD   Úlocal_includerA   Úlinkr)   r   )ÚCHECK_DECLSrN   )r   ÚfunctionZ	prototyperD   rA   r   r   r   r   ÚCHECK_C_PROTOTYPE€   s    úrX   úUCS-2LEc                 C   sF   d||f }|du r(d|  ¡  dd¡ }| jd||f |d|d|d	S )
zkcheck that a named charset is able to be used with iconv_open() for conversion
    to a target charset
    z(Checking if can we convert from %s to %sNzHAVE_CHARSET_%sú-Ú_z¤
                           iconv_t cd = iconv_open("%s", "%s");
                           if (cd == 0 || cd == (iconv_t)-1) return -1;
                           Tr?   )rD   r)   r   r   rA   )ÚupperÚreplacerN   )r   ÚcharsetZ
outcharsetrA   rD   r   r   r   r   ÚCHECK_CHARSET_EXISTS   s    ýør_   c                 C   sÈ   d}|dk rpt j | j ¡ d| ¡}zt |¡ W n tyD   Y n0 zt  |¡ W n   Y qpY n0 |d7 }qzt  	|¡ W n   |  
d| ¡ Y n0 zt  |¡ W n   |  
d| ¡ Y n0 |S )z find a directory to run tests inr   i'  z.conf_check_%dr&   z,cannot create a configuration test folder %rz+cannot use the configuration test folder %r)r   r   r   ÚbldnodeÚabspathÚshutilÚrmtreeÚOSErrorÚstatÚmakedirsr5   )r   r   Údirr   r   r   Úfind_config_dir¢   s*    

rh   c                 C   s   d}| j dd||ddS )zW
        check if the waf default flags for setting the name of lib
        are ok
    z&
int foo(int v) {
    return v * 2;
}
úc cshlibrJ   F)ÚfeaturesÚvnumÚfragmentr   r%   )r=   )r   r   Úsnipr   r   r   Ú CHECK_SHLIB_INTRASINC_NAME_FLAGS¼   s    rn   c                 C   s  t | ƒ}| j}tj |d¡}tj |¡s2t |¡ tj |d¡}t |¡ t tj |d¡d¡ t	 
¡ }| j|_|j | j¡ ||jd< |j ¡ |_| ||¡ | |j¡ |dd| jd d	d	d
 z| ¡  |  |dd¡ W dS    |  |dd¡ Y dS 0 dS )zcheck if we need -lcZ
testbuild2Z	liblctestzliblc1.czF#include <stdio.h>
int lib_func(void) { FILE *f = fopen("foo", "r");}
Údefaultri   zliblctest/liblc1.cÚEXTRA_LDFLAGSZliblc)rj   ÚsourceÚldflagsÚtargetr7   r   TFN)rh   r   r   r   r   Úexistsrf   r   Úwritefr   ÚBuildContextr6   Úall_envsÚupdateÚkeysÚlst_variantsÚ	load_dirsÚrescanÚsrcnodeÚcompileÚcheck_message)r   r   rg   r   ÚbdirÚsubdirÚbldr   r   r   ÚCHECK_NEED_LCÊ   s8    


ürƒ   c                 C   s    t | ƒ}d}| jdd||ddS )z*check if we need -undefined dynamic_lookupzù
#include <Python.h>
#include <crt_externs.h>
#define environ (*_NSGetEnviron())

static PyObject *ldb_module = NULL;
int foo(int v) {
    extern char **environ;
    environ[0] = 1;
    ldb_module = PyImport_ImportModule("ldb");
    return v * 2;
}
ri   ZPYEMBEDF)rj   Úuselibrl   r   r%   )rh   r=   )r   r   rg   rm   r   r   r   ÚCHECK_SHLIB_W_PYTHONõ   s    r…   Fc                 C   sT  |du r|rd}nd}t | ƒ}tj |d¡}tj |¡sBt |¡ | j}tj |d¡}t |¡ t tj |d¡d¡ t tj |d¡d	¡ t	 
¡ }| j|_|j | j¡ ||jd
< |j ¡ |_| ||¡ | |j¡ g }	|r|	 d|j ¡  ¡ t tj |d¡d¡ |ddd|	dd |ddddd}
|rDtj |d¡|
_z| ¡  W n   |  |dd¡ Y dS 0 |
jjd  |¡}|s´dtjv ržtjd }nd}ttj |d¡ƒ | j|d}tjj|g| tjjtjjd}|  ¡ \}}| jj!}|t"|ƒƒ |dƒ |t"|ƒƒ |d|j# ƒ |j#dk}|sB|p:dtjd< |  |d|¡ |S )z/see if the platform supports building librariesNzrpath library supportzbuilding library supportÚ	testbuildÚlibdirzlib1.cz"int lib_func(void) { return 42; }
zmain.czAint lib_func(void);
int main(void) {return !(lib_func() == 42);}
ro   z-Wl,--version-script=%s/vscriptÚvscriptzTEST_1.0A2 { global: *; };
ri   zlibdir/lib1.czlibdir/lib1Úlib1)rj   rq   rs   rr   r7   z
c cprogramZprog1)rj   rq   rs   Úuselib_localzdefault/libdirr   Fr   ÚLD_LIBRARY_PATH©r   ©ÚstdoutÚstderrÚ
z
returncode %r
)$rh   r   r   r   rt   rf   r   r   ru   r   rv   r6   rw   rx   ry   rz   r{   r|   r}   r/   ra   Úrpathr~   r   Ú	link_taskÚoutputsÚenvironr
   ÚSAMBA_CROSS_ARGSÚ
subprocessÚPopenÚPIPEÚcommunicateÚwriteÚstrÚ
returncode)r   r‘   Úversion_scriptr   rg   r€   r   r   r‚   rr   ÚoZlastprogZold_ld_library_pathÚargsÚprocÚoutÚerrÚwr;   r   r   r   ÚCHECK_LIBRARY_SUPPORT  s‚    

ÿ
üýÿ
r¤   c                 C   s8  |du r|rd| }nd}|   |¡ t| ƒ}tj |d¡}tj |¡sPt |¡ t tj |d¡d¡ tj 	d¡}t 
|¡ tjjddgtjjtjjd	}| ¡ \}}t 
|¡ |jd
k}	|	sÐ| jddd dS |r*t tj |d¡¡}
t d| |
¡}|s| jddd dS | d¡}|  |¡ |S |  d¡ dS )z.work out what extension perl uses for manpagesNzperl man%s extensionzperl manpage generationr†   zMakefile.PLzi
use ExtUtils::MakeMaker;
WriteMakefile(
    'NAME'    => 'WafTest',
    'EXE_FILES' => [ 'WafTest' ]
);
Ú.Úperlr   r   z	not foundr$   )ÚcolorZMakefilezMAN%sEXT\s+=\s+(\w+)r&   ÚokT)r1   rh   r   r   r   rt   rf   r   ru   ra   Úchdirr–   r—   r˜   r™   rœ   r3   ÚreadfÚreÚsearchÚgroup)r   r   Úsectionrg   r€   Úbackr    r¡   r¢   r;   ZmanÚmÚextr   r   r   ÚCHECK_PERL_MANPAGEh  sB    



þ




r²   Tc                 C   s¸   |du rdd  |¡ }|  |¡ |dd… }|rB| | j|d¡ ztt |¡ƒ}W n   |  d¡ Y dS 0 |rŽ|  d¡ |r´|  |d¡ n&| 	¡ }|  |¡ |r´| j||dd	 |S )
zrun a command and return resultNzChecking %sú rŒ   Fr¨   rJ   T©Úquote)
r   ÚCOMPOUND_STARTÚextendr•   r   r   Ú
cmd_outputÚCOMPOUND_ENDrC   Ústrip)r   Úcmdr   rD   Ú	on_targetÚbooleanr;   r   r   r   rM   œ  s(    



rM   c                 C   sD   d}d  ¡ D ]2}| jd| d| ¡  dddddd| dsd}q|S )	zsetup SYSTEM_UNAME_* definesTzsysname machine release versiona  
                               int printf(const char *format, ...);
                               struct utsname n;
                               if (uname(&n) == -1) return -1;
                               printf("%%s", n.%s);
                               zSYSTEM_UNAME_%szsys/utsname.hFzChecking uname %s type)rD   r)   Ú
define_retrµ   rA   rT   r   )rP   rN   r\   )r   r;   Úvr   r   r   ÚCHECK_UNAME¶  s    û
ôrÀ   c                 C   sl   |   d¡ dD ]>}| jd||f dddd}|r|dkrH| jd|dd  qNq|s^|  |¡ n
|  |¡ |S )	z$check for the right value for inlinezChecking for inline)ÚinlineÚ
__inline__Ú__inlinezt
        typedef int foo_t;
        static %s foo_t static_foo () {return 0; }
        %s foo_t foo () {return 0; }
ÚINLINE_MACROF)rD   ÚaddmainrU   rÁ   r´   )r¶   rN   rC   r¹   )r   Úir;   r   r   r   ÚCHECK_INLINEË  s"    
ýú
rÇ   c                 C   sh   |   d¡s| jddd |   d¡s&dS d}| jd| j d¡|f d| ddd	d
 |   d¡sdtdƒ dS )z4check if xsltproc can run with the given stylesheetsÚXSLTPROCÚxsltproc)ÚvarFzGhttp://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xslz%s --nonet %s 2> /dev/nullzChecking for stylesheet %sÚXSLTPROC_MANPAGEST)r   rD   r¼   r½   zhA local copy of the docbook.xsl wasn't found on your system consider installing package like docbook-xslN)Ú
CONFIG_SETÚfind_programrM   r   Úget_flatÚprint)r   Úsr   r   r   ÚCHECK_XSLTPROC_MANPAGESá  s    

ý
rÑ   c                 C   s®   z&| j jdg }tt |¡ƒ d¡}W n2 ty@   ddg}Y nb   t d| ¡‚Y nJ0 g }|D ]>}| 	¡ }| 
d¡rb|tdƒd … }dd„ | d	¡D ƒ} q¢qb|| j _d S )
Nz-print-search-dirsr   z/usr/libz
/usr/lib64zUnexpected error running "%s"zlibraries: =c                 S   s   g | ]}t j |¡‘qS r   )r   r   Únormpath)Ú.0r!   r   r   r   Ú
<listcomp>  ó    z*CHECK_STANDARD_LIBPATH.<locals>.<listcomp>ú:)r   ÚCCr   r   r¸   rP   Ú
ValueErrorr   ÚWafErrorrº   Ú
startswithrQ   ÚSTANDARD_LIBPATH)r   r»   r¡   ÚdirlistÚlineZ
dirliststrr   r   r   ÚCHECK_STANDARD_LIBPATHû  s    
rÞ   )r>   )rF   )NN)rY   NN)FFN)NN)NNTF)"r   rb   r«   Úwaflibr   r   r   r   r   r   Úwaflib.Configurer   Úsamba_utilsr	   r
   r   r   r   r=   rE   rS   rX   r_   rh   rn   rƒ   r…   r¤   r²   rM   rÀ   rÇ   rÑ   rÞ   r   r   r   r   Ú<module>   sH    	
4	+

*
[3


