
    ei                    D   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
mZmZmZmZmZmZmZ ddlmZmZ ddlmZ d d	lmZ d d
lmZ d dlZd dlZd dlZd dlZej>                  r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)  G d d      Z* G d de*      Z+ G d de      Z,y)    )annotations)Path   )ExternalDependencyDependencyExceptionsort_libpathsDependencyTypeName   )EnvironmentVariables	OptionKey
OrderedSet
PerMachine
Popen_safePopen_safe_loggedMachineChoice	join_args)find_external_programExternalProgram)mlog)PurePath)	lru_cacheN)Literal)ImmutableListProtocol)Environment)EnvironOrDict)PkgConfigDefineTypec                      e Zd ZU dZ edd      Zded<    edd      Zded<   edd       Z	eddd       Z
eddd	       Ze	 d	 	 	 dd
       ZddZddZddZ	 	 d	 	 	 ddZ	 	 d	 	 	 ddZ	 	 	 	 ddZd dZy)!PkgConfigInterfacez/Base class wrapping a pkg-config implementationFzCPerMachine[T.Union[Literal[False], T.Optional[PkgConfigInterface]]]
class_implz=PerMachine[T.Union[Literal[False], T.Optional[PkgConfigCLI]]]class_cli_implc                6   | j                         r|nt        j                  }t        j                  |   }|du r_t        | ||      }|j                         sd}|s+|s)t        j                  dt        j                  d             |t        j                  |<   |S )z,Return a pkg-config implementation singletonFNFound pkg-config:NO)
is_cross_buildr   HOSTr   r   PkgConfigCLIfoundr   logredenvfor_machinesilentimpls       C/usr/lib/python3/dist-packages/mesonbuild/dependencies/pkgconfig.pyinstancezPkgConfigInterface.instance+   s     &)%7%7%9k}?Q?Q!,,[95=[&9D::<,dhhtn=9=))+6    c                V   | j                         r|nt        j                  }t        j	                  | ||      }|rYt        |t              sIt        j                  |   }|du r2t        | ||      }|j                         sd}|t        j                  |<   t        j                  d|      S )zReturn the CLI pkg-config implementation singleton
        Even when we use another implementation internally, external tools might
        still need the CLI implementation.
        FNT.Optional[PkgConfigCLI])r$   r   r%   r   r0   
isinstancer&   r    r'   Tcastr*   s       r/   _clizPkgConfigInterface._cli9   s     &)%7%7%9k}?Q?Q!**3VD
46%44[ADu}#Cf=zz|DAE"11+>vv0$77r1   c                h    t         j                  | |      }|r|j                  |      S t               S N)r   r7   _get_envr   )r+   r,   uninstalledclis       r/   get_envzPkgConfigInterface.get_envK   s.     %%c;7,/s||K(K5I5KKr1   c                Z    t         j                  ||      }|r|j                  | |      S | S r9   )r   r7   
_setup_env)environr+   r,   r;   r<   s        r/   	setup_envzPkgConfigInterface.setup_envP   s.     !%%c;77:s~~g{3GGr1   c                     || _         || _        y r9   )r+   r,   )selfr+   r,   s      r/   __init__zPkgConfigInterface.__init__V   s    &r1   c                    t         )z&Return whether pkg-config is supportedNotImplementedErrorrC   s    r/   r'   zPkgConfigInterface.foundZ       !!r1   c                    t         )z*Return module version or None if not foundrF   )rC   names     r/   versionzPkgConfigInterface.version^   rI   r1   Nc                    t         )zeReturn module cflags
           @allow_system: If False, remove default system include paths
        rF   )rC   rK   allow_systemdefine_variables       r/   cflagszPkgConfigInterface.cflagsb   s
    
 "!r1   c                    t         )zReturn module libs
           @static: If True, also include private libraries
           @allow_system: If False, remove default system libraries search paths
        rF   )rC   rK   staticrN   rO   s        r/   libszPkgConfigInterface.libsi   s
     "!r1   c                    t         )z9Return module variable or None if variable is not definedrF   )rC   rK   variable_namerO   s       r/   variablezPkgConfigInterface.variableq   s
     "!r1   c                    t         )z'Return all available pkg-config modulesrF   rH   s    r/   list_allzPkgConfigInterface.list_allv   rI   r1   )r+   r   r,   r   r-   boolreturnzT.Optional[PkgConfigInterface]F)r+   r   r,   r   r-   rY   rZ   r3   )r+   r   r,   r   r;   rY   rZ   r   )
r@   r   r+   r   r,   r   r;   rY   rZ   r   )r+   r   r,   r   rZ   NonerZ   rY   rK   strrZ   T.Optional[str]FNrK   r_   rN   rY   rO   r   rZ   ImmutableListProtocol[str]FFN
rK   r_   rR   rY   rN   rY   rO   r   rZ   rc   rK   r_   rU   r_   rO   r   rZ   r`   rZ   rc   )__name__
__module____qualname____doc__r   r   __annotations__r    staticmethodr0   r7   r=   rA   rD   r'   rL   rP   rS   rV   rX    r1   r/   r   r   %   s    9V`afhmVnJSnT^_dfkTlNQl  8 8" L L &+H#H0=H H
'"" 6;6:" 3"?Y" JO48"1"=W"""5":I"
"r1   r   c                  >    e Zd ZdZd fdZddZ ed      dd       Zedd       Z	 ed      	 	 d	 	 	 dd       Z
 ed      	 	 d	 	 	 dd	       Z ed      	 	 	 	 dd
       Z ed      dd       Zedd       ZddZddZdd dZdd!dZd"d#dZ xZS )$r&   zpkg-config CLI implementationc           	     T   t         |   ||       | j                          | j                  r{|sxt	        j
                  dt	        j                  d      t	        j                  d| j                  j                          d      t	        j                  | j                               y y y )Nr"   YES())superrD   _detect_pkgbinpkgbinr   r(   greenboldget_pathbluepkgbin_version)rC   r+   r,   r-   	__class__s       r/   rD   zPkgConfigCLI.__init__}   s    k*;;vHH($**U*;TYY4;;K_K_KaJbbcGd=egkgpgpqu  rE  rE  hF  G  &;r1   c                ,    t        | j                        S r9   )rY   rv   rH   s    r/   r'   zPkgConfigCLI.found   s    DKK  r1   N)maxsizec                    t        j                  d|d| j                  j                                | j	                  d|g      \  }}}|dk(  r|S d S )NzDetermining dependency z with pkg-config executable z--modversionr   )r   debugrv   ry   _call_pkgbin)rC   rK   retrL   _s        r/   rL   zPkgConfigCLI.version   sZ    

,TH4PQUQ\Q\QeQeQgPjkl++^T,BCWa(w,,r1   c                b    g }| r*| D ]%  }|j                  ddj                  |      z          ' |S )Nz--define-variable==)appendjoin)rO   r   pairs      r/   _define_variable_argsz"PkgConfigCLI._define_variable_args   s:    ' B

/#((4.@AB
r1   c                   d }|r#t         j                  j                         }d|d<   g }|| j                  |      z  }|d|gz  }| j	                  ||      \  }}}|dk7  rt        d| d| d      | j                  |      S )	N1PKG_CONFIG_ALLOW_SYSTEM_CFLAGSz--cflagsr+   r   zCould not generate cflags for :

)osr@   copyr   r   r   _split_args)	rC   rK   rN   rO   r+   argsr   outerrs	            r/   rP   zPkgConfigCLI.cflags   s     **//#C47C01**?;;T""))$C)8S#!8%(FtfCPSuTV&WXX$$r1   c                .   d }|r#t         j                  j                         }d|d<   g }|| j                  |      z  }|r|j	                  d       |d|gz  }| j                  ||      \  }}}	|dk7  rt        d| d|	 d	      | j                  |      S )
Nr   PKG_CONFIG_ALLOW_SYSTEM_LIBSz--staticz--libsr   r   zCould not generate libs for r   r   )r   r@   r   r   r   r   r   r   )
rC   rK   rR   rN   rO   r+   r   r   r   r   s
             r/   rS   zPkgConfigCLI.libs   s     **//#C25C./**?;;KK
#4  ))$C)8S#!8%(DTF#cURT&UVV$$r1   c                z   g }|| j                  |      z  }|d|z   |gz  }| j                  |      \  }}}|dk7  rt        d| d| d      |j                         }|sA| j                  d|g      \  }}}	t	        j
                  d| d|t        j                        sy t        j                  d	| d
|        |S )Nz--variable=r   zCould not get variable for r   r   z--print-variables^$zGot pkg-config variable z : )	r   r   r   stripresearch	MULTILINEr   r   )
rC   rK   rU   rO   r   r   r   r   rV   r   s
             r/   rV   zPkgConfigCLI.variable   s     **?;;.55))$/S#!8%(CD6SEQS&TUU99; ++-@$,GHKCa99-2CF

-m_CzJKr1   c                    | j                  dg      \  }}}|dk7  rt        d| d      |j                         D cg c]  }|j                  dd      d    c}S c c}w )Nz
--list-allr   zcould not list modules:
r    r   )r   r   
splitlinessplit)rC   r   r   r   is        r/   rX   zPkgConfigCLI.list_all   s`    ))<.9S#!8%(A#b&IJJ,/NN,<=qQ"===s   Ac                ,    t        j                  |       S r9   )shlexr   )cmds    r/   r   zPkgConfigCLI._split_args   s     {{3r1   c                    t        | j                  | j                  dd| j                  j                  d      D ]%  }| j	                  |      }|s|| _        || _         y  d | _        y )Nz
pkg-configz
Pkg-configF)allow_default_for_cross)r   r+   r,   default_pkgconfig_check_pkgconfigrv   r{   )rC   potential_pkgbinversion_if_oks      r/   ru   zPkgConfigCLI._detect_pkgbin   sk     5$**L,**E!K 	 !112BCM.&3#	 r1   c                   |j                         s#t        j                  d|j                         y dj	                  |j                               }	 t        |j                         dgz         d   }d|v rt        j                  d|d       y t        |j                         dgz         d	d
 \  }}|j                  d	k7  rt        j                  d|d       y 	 |j                         S # t        $ r t        j                  d|d       Y y t        $ rQ d|d}| j                  j                  j                  j                         s|dz  }t        j                  |       Y y w xY w)Nz Did not find pkg-config by name r   z--helpr   z	Pure-PerlzFound pkg-config z7 but it is Strawberry Perl and thus broken. Ignoring...z	--versionr   r
   z but it failed when ranzWe thought we found pkg-config z! but now it's not there. How odd!z' but didn't have permissions to run it.zO

On Unix-like systems this is often caused by scripts that are not executable.)r'   r   r(   rK   r   get_commandr   
returncodewarningFileNotFoundErrorPermissionErrorr+   machinesbuild
is_windowsr   )rC   rv   command_as_stringhelptextpr   msgs          r/   r   zPkgConfigCLI._check_pkgconfig   sb   ||~HH7GHHHV%7%7%9:	!&"4"4"6("CDQGHh&,->,AAxyz 2 2 4} DEaJFAs||q 01B0EE\]^ ! yy{ ! 	LL:;L:OOqrs 	%&7%::bcC88$$**557jjLL	s    =C/ AC/ /"E,AE,+E,c                   t               }t        d| j                        }| j                  j                  j
                  |   j                  d d  }|rGt        | j                  j                         d      j                         }||vr|j                  |       |j                  d|       | j                  j                  | j                     j                         }|r|j                  d|g       | j                  j                  | j                     j                         }|r|j                  d|       |j                  dt        | j                   j#                               g       |S )Npkg_config_pathmachinezmeson-uninstalledPKG_CONFIG_PATHPKG_CONFIG_SYSROOT_DIRPKG_CONFIG_LIBDIR
PKG_CONFIG)r   r   r,   r+   coredataoptionsvaluer   get_build_diras_posixr   set
propertiesget_sys_rootget_pkg_config_libdirr   rv   r   )rC   r;   r+   keyextra_pathsuninstalled_pathsysrootpkg_config_libdir_props           r/   r:   zPkgConfigCLI._get_env   s%   "$)43C3CD#'88#4#4#<#<S#A#G#G#J#DHH$:$:$<>QR[[]{2""#34!;/((%%d&6&67DDFGG,wi8!%!4!4T5E5E!F!\!\!^!GG')?@y)@)@)BCDE
r1   c                    | j                  |      }|j                  |      }|j                         D ]2  \  }}|j                  d      st	        j
                  d| d|        4 |S )NPKG_zenv[z]: )r:   r=   items
startswithr   r   )rC   r+   r;   envvarsr   r   s         r/   r?   zPkgConfigCLI._setup_env
  sc    --,ooc"))+ 	3JC~~f%

T#c%12	3 
r1   c                6   t        | j                  t              sJ |xs t        j                  }| j                  |      }| j                  j                         |z   }t        ||      \  }}}|j                  |j                         |j                         fS )Nr   )
r4   rv   r   r   r@   r?   r   r   r   r   )rC   r   r+   r   r   r   r   s          r/   r   zPkgConfigCLI._call_pkgbin  sx    $++777RZZooc"kk%%'$.'53||SYY[#))+55r1   )r+   r   r,   r   r-   rY   rZ   r\   r]   r^   )rO   r   rZ   T.List[str]ra   rb   rd   re   rf   rg   )r   r_   rZ   r   rZ   r\   )rv   r   rZ   r`   r[   )r;   rY   rZ   r   )r+   r   r;   rY   rZ   zT.Dict[str, str]r9   )r   r   r+   zT.Optional[EnvironOrDict]rZ   zT.Tuple[int, str, str])rh   ri   rj   rk   rD   r'   r   rL   rm   r   rP   rS   rV   rX   r   ru   r   r:   r?   r   __classcell__r|   s   @r/   r&   r&   z   s   'G! t- -
   t5:6:% 3%?Y% % tIN48%1%=W% %  t"5:I $ t> >    
	2$6 6r1   r&   c                       e Zd Zdd f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edd       Zddddddd	 	 	 	 	 	 	 	 	 ddZ xZS )PkgConfigDependencyNc                   t         |   t        d      |||       || _        d| _        t
        j                  | j                  | j                  | j                        | _
        | j                  s=d| j                   d}| j                  rt        |      t        j                  |       y | j                  j                  |      }|y || _        d| _        	 | j#                          | j%                          y # t        $ rN}t        j                  d| d|        | j                  r g | _        g | _        d| _        || _        Y d }~y d }~ww xY w)	N	pkgconfig)languageFzPkg-config for machine z not found. Giving up.TzPkg-config error with 'z': )rt   rD   r	   rK   
is_libtoolr   r0   r+   r,   r-   r   requiredr   r   r   rL   is_found
_set_cargs	_set_libscompile_args	link_argsreason)	rC   rK   environmentkwargsr   r   rL   er|   s	           r/   rD   zPkgConfigDependency.__init__  s(   +K8+vX`a	+44TXXt?O?OQUQ\Q\]~~+D,<,<+==STC}})#..JJsO..((.?	 OONN" 	 JJ0c!=>}}$&!!# %	 s    C= =	EAEEc                    d}|j                  | j                  j                  | j                  | j                  | j
                        S )Nz<{0} {1}: {2} {3}>)formatr|   rh   rK   r   version_reqs)rC   ss     r/   __repr__zPkgConfigDependency.__repr__@  s9     xx//DMM))+ 	+r1   c           	        | j                   j                  j                  j                         s|j	                         S g }|D ]  }t               }|j                  d      rt        |dd       j                  }d}n|j                  d      rt        |dd       j                  }d}nb|j                  d      rt        |      j                  }d}n9|j                  d	      st        |      dkD  r|d
   dk(  r|j                  dd      }t        |      d
kD  r8t        |d
         d
k(  r'j                  |d
   dj                  |dd             }|j                  |       ! |S )a$  
        Both MSVC and native Python on Windows cannot handle MinGW-esque /c/foo
        paths so convert them to C:/foo. We cannot resolve other paths starting
        with / like /home/foo so leave them as-is so that the user gets an
        error/warning from the compiler/linker.
        z-L/r
   Nz-L{}:/{}z-I/z-I{}:/{}/z{}:/{})-Lz-Ir   :z\ r   )r+   r   r   r   r   tupler   r   partslenreplacer   r   r   )rC   r   	convertedargpargstmpls         r/   _convert_mingw_pathsz(PkgConfigDependency._convert_mingw_pathsE  s8    xx  &&11399;	 	"C',wE~~e$ QR)//!& QR)//!$ ++-#c(Q,3q6S=kk%-5zA~#eAh-1"4kk%(CHHU12Y,?@S!%	"& r1   c                    d}| j                   dk(  rd}| j                  j                  | j                  |      }| j	                  |      | _        y )NFfortranT)r   r   rP   rK   r   r   )rC   rN   rP   s      r/   r   zPkgConfigDependency._set_cargsd  sG    ==I%  L&&tyy,? 55f=r1   c                <	   t               }| j                  |      }|D ]  }|j                  d      s|j                  d      r'|dd }t        j                  j                  |      s8t        j                  j                  | j                  j                         |      }|j                  |        | j                  j                  j                  t        d| j                           j                  }| j                  |      }t        t        t!        |      |            }t               }| j                  |      }	|	D ]B  }|j                  d      r|j                  d      s'|dd |vs/|j                  |dd        D t!        |      t!        |      z   }
t               }g }g }|	D ]  }|j                  d      rn|j                  d      r)|j                  d      r||v r?|dd }d}|
D ]E  }t        j                  j                  ||      }t        j                  j#                  |      sC|} n |G||v rt%        j&                  d	j)                  || j*                               |j-                  |       n|}n|j                  d
      r||v r| j.                  r8| j.                  j1                  |dd | j                  |
| j2                  d      }nd}|1|j                  |       |r|d   j                  d
      sX|d   }nQl||v rr| j4                  r2t%        j&                  dj)                  |dd | j*                               |j-                  |       n|j7                  d      r| j9                  |      }t        j                  j                  t        j                  j;                  |      |      }t        j                  j#                  |      s>t        j                  j                  t        j                  j;                  |      d|      }t        j                  j#                  |      st=        d| d      d| _        |}||v r|j-                  |        |r|D cg c]  }d|z   	 c}|z   }||fS c c}w )aQ  
        @libs_in: PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 pkg-config --libs
        @raw_libs_in: pkg-config --libs

        We always look for the file ourselves instead of depending on the
        compiler to find it with -lfoo or foo.lib (if possible) because:
        1. We want to be able to select static or shared
        2. We need the full path of the library to calculate RPATH values
        3. De-dup of libraries is easier when we have absolute paths

        Libraries that are provided by the toolchain or are not found by
        find_library() will be added with -L -l pairs.
        r   )z-L-lz-L-Lr
   Nr   r   z-l:   zJLibrary {!r} not found for dependency {!r}, may not be successfully linkedz-lF)lib_prefix_warningr   zOStatic library {!r} not found for dependency {!r}, may not be statically linkedz.laz.libszGot a libtools specific "zD" dependenciesbut we could not compute the actual sharedlibrary pathT) r   r   r   r   pathisabsr   r+   r   addr   r   r   r,   r   r   listexistsr   r   r   rK   r   clib_compilerfind_librarylibtyperR   endswithextract_libtool_shlibdirnamer   r   )rC   libs_inraw_libs_inprefix_libpathsraw_link_argsr   r  r   system_libpaths	full_argslibpaths
libs_foundlibs_notfoundr   liblibfilename	foundnamelibdirtargetr   shared_libname
shared_liblps                          r/   _search_libsz PkgConfigDependency._search_libsm  s%   2 ,6<11+>  	*C~~d#CNN;K,L12www}}T*77<<(>(>(@$GD##D)	*  (,xx'8'8'@'@K\fjfvfvAw'x'~'~33OD$]43H/%Z[+5<--g6	 	-C~~./~~d#AB(F##CG,	- (4+@@&0l
	 Q	"C~~./%& *$!!"g 	& FWW\\&+>Fww~~f-$*		
 $m+  &BBH&VZV_V_B`b!((-#C%*$%%--::3qr7DHH;CT\\NS ; UD  D#NN3' #Aw11$7"&q'C  m+ {{ &@@Fs12wPTPYPY@Z\!((-e$!%!;!;C!@WW\\"''//#*>O
ww~~j1!#bggooc.BG^!\Jww~~j1-0I# O= /= > > #' )#S!cQ	"f  .==r=	II-'' >s   Rc                
   | j                   j                  | j                  | j                  d      }| j                   j                  | j                  | j                  d      }| j	                  ||      \  | _        | _        y )NT)rN   F)r   rS   rK   rR   r  r   r  )rC   rS   raw_libss      r/   r   zPkgConfigDependency._set_libs  sh     ~~""499dkk"M >>&&tyy$++E&R-1->->tX-N**r1   c                    t        |d      5 }|D ]<  }|j                         j                  d      }|d   |k(  s+|d   dd c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nzutf-8)encodingr   r   r   )openr   r   )rC   la_file	fieldnameflinearrs         r/   extract_fieldz!PkgConfigDependency.extract_field  ss    'G, 	( (jjl((-q6Y&q6!B<'		( 	((	(
 	(
 s   -A	AAA#c                &    | j                  |d      S )Ndlnamer)  rC   r$  s     r/   extract_dlname_fieldz(PkgConfigDependency.extract_dlname_field      !!'844r1   c                &    | j                  |d      S )Nr  r,  r-  s     r/   extract_libdir_fieldz(PkgConfigDependency.extract_libdir_field  r/  r1   c                r   | j                  |      }|y| j                  j                  | j                     j	                         rTt
        j                  j                  |      }| j                  |      }||S t
        j                  j                  ||      S t
        j                  j                  |      S )z_
        Returns the path to the shared library
        corresponding to this .la file
        N)
r.  r+   r   r,   	is_darwinr   r  basenamer1  r   )rC   r$  r+  
dlbasenamer  s        r/   r
  z)PkgConfigDependency.extract_libtool_shlib  s    
 **73> 88T--.88:))&1J..w7F~!!77<<
33 ww''r1   c                      y)Nr   rn   rn   r1   r/   	log_triedzPkgConfigDependency.log_tried2  s    r1   )cmaker   
configtoolinternaldefault_valuepkgconfig_definec                   |r-	 | j                   j                  | j                  ||      }||S 	 ||S t        d|       # t        $ r Y w xY w)Nz>Could not get pkg-config variable and no default provided for )r   rV   rK   r   )rC   r8  r   r9  r:  r;  r<  rV   s           r/   get_variablez PkgConfigDependency.get_variable6  sp     >>22499iIYZ'#O ( $  !$bcgbj"kll	 ' s   *A 	AAr9   )
rK   r_   r   r   r   zT.Dict[str, T.Any]r   r`   rZ   r\   )rZ   r_   )r   rc   rZ   r   r   )r  rc   r  rc   rZ   z!T.Tuple[T.List[str], T.List[str]])r$  r_   r%  r_   rZ   r`   )r$  r_   rZ   r`   )r8  r`   r   r`   r9  r`   r:  r`   r;  r`   r<  r   rZ   r_   )rh   ri   rj   rD   r   r   r   r  r   r)  r.  r1  r
  rm   r7  r>  r   r   s   @r/   r   r     s      D+
>>V(pO55(*   8<Z^37UY6:=Am!0mCRm$3m (;m GJmr1   r   )-
__future__r   pathlibr   baser   r   r   r	   mesonlibr   r   r   r   r   r   r   r   programsr   r    r   r   	functoolsr   r   r   r   typingr5   TYPE_CHECKINGtyping_extensionsr   _typingr   r   r   
utils.corer   interpreter.type_checkingr   r   r&   r   rn   r1   r/   <module>rL     s    #  \ \ H  H  H =    	 	  ??)/)*?S" S"j_6% _6Dgm, gmr1   