
Ye                 @   sm  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 d d l m Z d d l m	 Z	 m
 Z
 m Z m Z i  Z e   Z Gd d   d e	  Z Gd	 d
   d
 e  Z Gd d   d  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d  Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d S)    N)Enum   )mlog)mesonlib)MesonException
Popen_safeflattenversion_compare_manyc               @   s   e  Z d  Z d Z d S)DependencyExceptionz3Exceptions raised while trying to find dependenciesN)__name__
__module____qualname____doc__ r   r   X/mnt/raid6/a/bak/reczko/tools/protein/utils/meson-0.42.1/mesonbuild/dependencies/base.pyr
   "   s   r
   c               @   s@   e  Z d  Z d Z d Z d Z d Z d Z d Z d Z	 d Z
 d	 S)
DependencyMethodsautoz
pkg-configZqmakesystemZ	sdlconfigzpcap-configZextraframework	sysconfigN)r   r   r   AUTO	PKGCONFIGZQMAKEZSYSTEMZ	SDLCONFIGZ
PCAPCONFIGZEXTRAFRAMEWORKZ	SYSCONFIGr   r   r   r   r   &   s   r   c               @   s   e  Z 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 d   Z d d   Z d d   Z d S)
Dependencyc             C   s   d |  _  d |  _ d  |  _ d |  _ | |  _ g  |  _ g  |  _ g  |  _ | j d d  } | d d   t	 D k r t
 d j |    n  t	 |  } | t	 j k r |  j   |  _ nd | |  j   k r | g |  _ nC t
 d	 j | j t j t d
 d   t	 j g |  j        d  S)NZnullnoneFmethodr   c             S   s   g  |  ] } | j   q Sr   )value).0er   r   r   
<listcomp>B   s   	 z'Dependency.__init__.<locals>.<listcomp>zmethod {!r} is invalidz8Unsupported detection method: {}, allowed methods are {}c             S   s   |  j  S)N)r   )xr   r   r   <lambda>P   s    z%Dependency.__init__.<locals>.<lambda>)nameversionlanguageis_found	type_namecompile_args	link_argssourcesgetr   r
   formatr   get_methodsmethodsr   r   format_listmap)selfr$   kwargsr   r   r   r   __init__8   s(    								zDependency.__init__c             C   s%   d } | j  |  j j |  j |  j  S)Nz<{0} {1}: {2}>)r)   	__class__r   r    r#   )r.   sr   r   r   __repr__R   s    zDependency.__repr__c             C   s   |  j  S)N)r%   )r.   r   r   r   get_compile_argsV   s    zDependency.get_compile_argsc             C   s   |  j  S)N)r&   )r.   r   r   r   get_link_argsY   s    zDependency.get_link_argsc             C   s   |  j  S)N)r#   )r.   r   r   r   found\   s    zDependency.foundc             C   s   |  j  S)zgSource files that need to be added to the target.
        As an example, gtest-all.cc when using GTest.)r'   )r.   r   r   r   get_sources_   s    zDependency.get_sourcesc             C   s
   t  j g S)N)r   r   )r.   r   r   r   r*   d   s    zDependency.get_methodsc             C   s   |  j  S)N)r    )r.   r   r   r   get_nameg   s    zDependency.get_namec             C   s   |  j  S)N)r!   )r.   r   r   r   get_versionj   s    zDependency.get_versionc             C   s   g  S)Nr   )r.   compilerr   r   r   get_exe_argsm   s    zDependency.get_exe_argsc             C   s   d S)NFr   )r.   r   r   r   need_threadsp   s    zDependency.need_threadsc             C   s   t  d j |  j    d  S)Nz"{!r} is not a pkgconfig dependency)NotImplementedErrorr)   r    )r.   variable_namer   r   r   get_pkgconfig_variables   s    z!Dependency.get_pkgconfig_variableN)r   r   r   r0   r3   r4   r5   r6   r7   r*   r8   r9   r;   r<   r?   r   r   r   r   r   7   s   r   c                   s"   e  Z d  Z   f d d   Z   S)InternalDependencyc                s_   t    j d i   | |  _ d |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _	 d  S)NinternalT)
superr0   r!   r#   include_directoriesr%   r&   	librariesr'   ext_deps)r.   r!   incdirsr%   r&   rD   r'   rE   )r1   r   r   r0   x   s    							zInternalDependency.__init__)r   r   r   r0   r   r   )r1   r   r@   w   s   r@   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)ExternalDependencyc                s  t    j | |  | |  _ | |  _ d |  _ | |  _ | r | |  j j j k r |  j j   d } t	 | j
 | j      n  | j d d   |  _ | j d d  |  _ | j d d  |  _ | j d d  |  _ t |  j t  s t	 d   n  d	 | k r$|  j j   r$| d	 |  _ n |  j j   |  _ |  j rQ|  j j j } n |  j j j } | j |  j prd
 d   |  _ d  S)NFz requires a {} compilerr!   requiredTsilentstaticzStatic keyword must be booleannativec)rB   r0   envr    r#   r"   coredata	compilers
capitalizer
   r)   r(   version_reqsrH   rI   rJ   
isinstanceboolis_cross_build
want_crosscross_compilersr:   )r.   r$   environmentr"   r/   mrO   )r1   r   r   r0      s*    					zExternalDependency.__init__c             C   s   |  j  S)N)r:   )r.   r   r   r   get_compiler   s    zExternalDependency.get_compiler)r   r   r   r0   rY   r   r   )r1   r   rG      s   rG   c                   s   e  Z d  Z d Z   f 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 d   Z d d   Z   S)PkgConfigDependencyNc                s|  t    j d | d  |  | |  _ d |  _ d  |  _ |  j r d | j j d k rn |  j r t	 d   q q| j j d d } t
 | d d } | j   r | j   d |  _ |  j t _ qt j d | j  n9 t j d  k r|  j   |  _ |  j t _ n t j |  _ |  j s7|  j r3t	 d	   n  d  S|  j rLd
 |  _ n	 d |  _ t j d j | |  j   |  j d | g  \ } |  _ | d k r|  j rt	 d j |  j |    n  d  S|  j d t j |  d g } |  j d  k r d |  _ n/t |  j t t f  s't	 d   n  t |  j t  rK|  j g |  _ n  t |  j |  j  \ |  _ } }	 |  j s/| t j d  d j |  j  d j d d   | D  g 7} |	 r| d d j d d   |	 D  g 7} n  |  j st j  |   n  |  j r+d }
 t	 |
 j | | |  j    n  d  S| t j! d  |  j g 7} |  j"   |  j#   |  j sxt j  |   n  d  S)NZ	pkgconfigFbinariesz)Pkg-config binary missing from cross filerI   Tr   zCross pkg-config %s not found.zPkg-config not found.ZCrossZNativez;Determining dependency {!r} with pkg-config executable {!r}z--modversionz{} dependency {!r} not foundz dependencyzfound:z(Version argument must be string or list.NOzfound {!r} but need:z, c             S   s   g  |  ] } d  j  |   q S)z'{}')r)   )r   r   r   r   r   r      s   	 z0PkgConfigDependency.__init__.<locals>.<listcomp>z
; matched:c             S   s   g  |  ] } d  j  |   q S)z'{}')r)   )r   r   r   r   r   r      s   	 z9Invalid version of dependency, need {!r} {!r} found {!r}.YES)$rB   r0   r    
is_libtoolpkgbinrU   
cross_infoconfigrH   r
   ExternalProgramr6   get_commandrZ   class_pkgbinr   debugcheck_pkgconfigtype_stringr)   _call_pkgbinr!   boldrQ   r#   rR   strlistr	   redjoinrI   loggreen
_set_cargs	_set_libs)r.   r    rW   r/   ZpkgnameZpotential_pkgbinretZ	found_msg	not_foundr6   rX   )r1   r   r   r0      sv    										!	 #		!

	zPkgConfigDependency.__init__c             C   s+   d } | j  |  j j |  j |  j |  j  S)Nz<{0} {1}: {2} {3}>)r)   r1   r   r    r#   rQ   )r.   r2   r   r   r   r3      s    zPkgConfigDependency.__repr__c             C   sB   t  |  j g | d t j d d  \ } } | j | j   f S)NrM   r   r   )r   r_   osenviron
returncodestrip)r.   argspoutr   r   r   rh     s    /z PkgConfigDependency._call_pkgbinc             C   sY   |  j  d |  j g  \ } } | d k rF t d |  j | f   n  | j   |  _ d  S)Nz--cflagsr   z$Could not generate cargs for %s:

%s)rh   r    r
   splitr%   )r.   rr   rz   r   r   r   rp     s
    zPkgConfigDependency._set_cargsc             C   sH  |  j  d g } |  j r( | j d  n  |  j |  \ } } | d k re t d |  j  | f   n  g  |  _ x | j   D] } | j d  r0|  j |  } t	 j
 j t	 j
 j |  |  } t	 j
 j |  s t	 j
 j t	 j
 j |  d |  } n  t	 j
 j |  st d |   n  | } d |  _ n  |  j j |  q{ Wd  S)	Nz--libsz--staticr   z#Could not generate libs for %s:

%sz.laz.libsz_Got a libtools specific "%s" dependenciesbut we could not compute the actual sharedlibrary pathT)r    rJ   appendrh   r
   r&   r{   endswithextract_libtool_shlibrt   pathrm   dirnameexistsr^   )r.   Zlibcmdrr   rz   libZshared_libnameZ
shared_libr   r   r   rq     s(    		!'zPkgConfigDependency._set_libsc             C   s   |  j  d | |  j g  \ } } d } | d k r_ |  j rk t d |  j |  j f   qk n | j   } t j d | | f  | S)Nz--variable= r   z%s dependency %s not found.zGot pkgconfig variable %s : %s)rh   r    rH   r
   rg   rw   r   re   )r.   r>   rr   rz   variabler   r   r   r?   $  s    "	z*PkgConfigDependency.get_pkgconfig_variablec             C   s
   t  j g S)N)r   r   )r.   r   r   r   r*   0  s    zPkgConfigDependency.get_methodsc             C   s"  d } | t  j k r+ t  j | j   } n d } y> t | d g  d d  \ } } | j d k rn d } n  Wn t t f k
 r d } Yn X| r t  j j |  r t	 j
 |  r t	 j
 |  } n  |  j s| rt j d t j |  d | j    qt j d	 t j d
   n  | S)NZ
PKG_CONFIGz
pkg-configz	--versionr   r   FzFound pkg-config:z(%s)zFound Pkg-config:r\   )rt   ru   rw   r   rv   FileNotFoundErrorPermissionErrorr   isabsshutilwhichrI   r   rn   ri   rl   )r.   evarr_   ry   rz   r   r   r   rf   3  s$    "(	z#PkgConfigDependency.check_pkgconfigc             C   sa   t  |  O } xE | D]= } | j   j d  } | d | k r | d d d  Sq WWd  QXd  S)N=r      )openrw   r{   )r.   la_fileZ	fieldnameflinearrr   r   r   extract_fieldM  s    z!PkgConfigDependency.extract_fieldc             C   s   |  j  | d  S)Ndlname)r   )r.   r   r   r   r   extract_dlname_fieldU  s    z(PkgConfigDependency.extract_dlname_fieldc             C   s   |  j  | d  S)Nlibdir)r   )r.   r   r   r   r   extract_libdir_fieldX  s    z(PkgConfigDependency.extract_libdir_fieldc             C   s   |  j  |  } | d k r d St j   ro t j j |  } |  j |  } | d k r\ | St j j | |  St j j |  S)z_
        Returns the path to the shared library
        corresponding to this .la file
        N)r   r   is_osxrt   r   basenamer   rm   )r.   r   r   Z
dlbasenamer   r   r   r   r~   [  s    z)PkgConfigDependency.extract_libtool_shlib)r   r   r   rd   r0   r3   rh   rp   rq   r?   r*   rf   r   r   r   r~   r   r   )r1   r   rZ      s   RrZ   c               @   s   e  Z d  Z d Z d d d d d  Z 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 d d   Z d S)rb   exemsccombatNFc             C   s   | |  _  | d  k	 r? t | t  s3 | g |  _ qT | |  _ n |  j | |  |  _ | s |  j   r t j d t j |  d t j	 d  d d j
 |  j   q t j d t j |  d t j d   n  d  S)NZProgramzfound:r]   z(%s) r\   )r    rR   rk   command_searchr6   r   rn   ri   ro   rm   rl   )r.   r    r   rI   
search_dirr   r   r   r0   t  s    	$zExternalProgram.__init__c             C   s%   d } | j  |  j j |  j |  j  S)Nz<{} {!r} -> {!r}>)r)   r1   r   r    r   )r.   rr   r   r   r3     s    zExternalProgram.__repr__c             C   s.  yt  |    } | j   j   } Wd QX| j d  r| d d  j d  d j   j   } t j   r	| d j d  r | d j d  d | d <n  t |  d k r | d d k r | d d  } n  t |  d k r	| d d	 k r	t j	 | d <q	n  | |  g SWn t
 k
 r)Yn Xd
 S)z
        Check if the file has a shebang and manually parse it to figure out
        the interpreter to use. This is useful if the script is not executable
        or if we're on Windows (which does not understand shebangs).
        Nz#!r   #r   /r   rM   python3Fr   )r   readlinerw   
startswithr{   r   
is_windowslensys
executable	Exception)scriptr   Z
first_linecommandsr   r   r   _shebang_to_cmd  s     )""zExternalProgram._shebang_to_cmdc             C   sr   t  j j |  d j   d d   } t j   rH | |  j k rn d Sn& t  j | t  j  rn t  j j	 |  Sd S)Nr   TFr   )
rt   r   splitextlowerr   r   windows_extsaccessX_OKisdir)r.   r   suffixr   r   r   _is_executable  s    &zExternalProgram._is_executablec             C   s   | d  k r d St  j j | |  } t  j j |  rZ |  j |  rM | g S|  j |  St j   r x? |  j D]1 } d j	 | |  } t  j j |  rp | g Sqp Wn  d S)NFz{}.{})
rt   r   rm   r   r   r   r   r   r   r)   )r.   r    r   trialextZ	trial_extr   r   r   _search_dir  s    zExternalProgram._search_dirc             C   sB  |  j  | |  } | r | St j |  } t j   s> | g S| r t j j |  d } | d d  j   |  j	 k r | g S|  j
 |  } | r;| Sn t j j |  r x? |  j	 D]1 } d j | |  } t j j |  r | g Sq Wn  t j j d d  j d  } x* | D]" } |  j  | |  } | r| SqWd g S)zz
        Search in the specified dir for the specified executable by name
        and if not found search in PATH
        r   Nz{}.{}PATHr   ;)r   r   r   r   r   rt   r   r   r   r   r   r   r)   r   ru   r(   r{   )r.   r    r   r   r   Zname_extr   search_dirsr   r   r   r     s0    zExternalProgram._searchc             C   s   |  j  d d  k	 S)Nr   )r   )r.   r   r   r   r6     s    zExternalProgram.foundc             C   s   |  j  d  d   S)N)r   )r.   r   r   r   rc     s    zExternalProgram.get_commandc             C   s   |  j    r |  j d Sd  S)Nr   r   )r6   r   )r.   r   r   r   get_path  s    zExternalProgram.get_pathc             C   s   |  j  S)N)r    )r.   r   r   r   r8     s    zExternalProgram.get_name)zexer   zcomr   )r   r   r   r   r0   r3   staticmethodr   r   r   r   r6   rc   r   r8   r   r   r   r   rb   q  s   	/rb   c                   s4   e  Z d  Z d   f d d  Z d d d  Z   S)ExternalLibraryFc                s   t    j d | | i   | |  _ | |  _ d |  _ | rO d |  _ | |  _ n  | s |  j r t j d t j |  d t j	 d   q t j d t j |  d t j
 d   n  d  S)NZexternalFTLibraryzfound:r]   r\   )rB   r0   r    r"   r#   r&   r   rn   ri   ro   rl   )r.   r    r&   rW   r"   rI   )r1   r   r   r0      s    					+zExternalLibrary.__init__Nc             C   sA   |  j  d k r | d k s6 | d k r: |  j  d k r: g  S|  j S)ad  
        External libraries detected using a compiler must only be used with
        compatible code. For instance, Vala libraries (.vapi files) cannot be
        used with C code, and not all Rust library types can be linked with
        C-like code. Note that C++ libraries *can* be linked with C code with
        a C++ linker (and vice-versa).
        vala)r"   r&   )r.   r"   r   r   r   r5     s    
zExternalLibrary.get_link_args)r   r   r   r0   r5   r   r   )r1   r   r     s   r   c                   sR   e  Z d  Z   f d d   Z d d   Z d d   Z d d   Z d	 d
   Z   S)ExtraFrameworkDependencyc                s   t    j d | | |  d  |  _ | |  _ |  j | |  |  j   r t j d t j |  d t j	 d  t
 j j |  j |  j   n t j d | d t j d   d  S)NZextraframeworksr   zfound:r]   r\   )rB   r0   r    rH   detectr6   r   rn   ri   ro   rt   r   rm   rl   )r.   r    rH   r   rM   langr/   )r1   r   r   r0     s    		$z!ExtraFrameworkDependency.__init__c             C   s  | j    } | d  k r' d d g } n	 | g } x | D] } x t j |  D]} } t j j | |  } | | j d  d j    k r qM n  t j t j |  j  s qM n  | |  _ | |  _	 d |  _
 d  SWq7 W|  j   r |  j r t d | f   n  d  S)Nz/System/Library/Frameworksz/Library/Frameworks.r   Tz"Framework dependency %s not found.)r   rt   listdirr   rm   r{   statS_ISDIRst_moder    r#   r6   rH   r
   )r.   r    r   lnamepathsry   dZfullpathr   r   r   r   *  s"    					zExtraFrameworkDependency.detectc             C   s3   |  j    r/ d t j j |  j |  j d  g Sg  S)Nz-IHeaders)r6   rt   r   rm   r    )r.   r   r   r   r4   >  s    #z)ExtraFrameworkDependency.get_compile_argsc             C   s4   |  j    r0 d |  j d |  j j d  d g Sg  S)Nz-Fz
-frameworkr   r   )r6   r   r    r{   )r.   r   r   r   r5   C  s    $z&ExtraFrameworkDependency.get_link_argsc             C   s   d S)Nunknownr   )r.   r   r   r   r9   H  s    z$ExtraFrameworkDependency.get_version)r   r   r   r0   r   r4   r5   r9   r   r   )r1   r   r     s
   r   c             C   s   t  | j d g    } t | t  r6 t |  } n  |  | | f } x` | j   D]R \ } } | d k rp qR n  t | t  r t t  |   } n  | | | f 7} qR W| S)Nr!   rK   rH   fallback)zversionznativezrequiredzfallback)r   r(   rR   rk   	frozensetitems)r    r/   rU   rQ   
identifierkeyr   r   r   r   get_dep_identifierL  s    r   c             C   s  | j  d d  } t | t  s0 t d   n  t | j  d d  t  sZ t d   n  |  j   } | t k r | t k r d | k r t d | f   n  t | | |  } | r | j   r t d	 |    n  | Sd | k r t d | f   n  d  } d  } y& t	 |  | |  } | j   r0| SWn+ t
 k
 r^} z | } WYd  d  } ~ Xn Xt j   rt |  d
 d  | d  |  }	 | r|	 j   rd t |  }
 t |
 j |     n  |	 S| d  k	 r|  n  t j d t j |   d t j d   | S)NrH   Tz%Keyword "required" must be a boolean.r   r   z"Keyword "method" must be a string.r"   z9%s dependency does not accept "language" keyword argumentzDependency "%s" not foundFzCDependency {!r} not found, tried Extra Frameworks and Pkg-Config:

r   zfound:r\   )r(   rR   rS   r
   rj   r   packages_packages_accept_languager6   rZ   r   r   r   r   r)   r   rn   ri   rl   )r    rM   r/   rH   r   depZpkg_excZpkgdepr   ZfwdeprX   r   r   r   find_external_dependency`  sD    	(r   )rt   r   r   r   Zenumr   r   r   r   r   r   r   r	   r   setr   r
   r   r   r@   rG   rZ   rb   r   r   r   r   r   r   r   r   <module>   s(   "	@!.