88import  typing  as  T 
99
1010from  .. import  mesonlib , mlog 
11- from  .base  import  process_method_kw , DependencyException , DependencyMethods , DependencyTypeName ,  ExternalDependency , SystemDependency 
11+ from  .base  import  process_method_kw , DependencyException , DependencyMethods , ExternalDependency , SystemDependency 
1212from  .configtool  import  ConfigToolDependency 
1313from  .detect  import  packages 
1414from  .factory  import  DependencyFactory 
@@ -116,6 +116,15 @@ def __init__(self, name: str, command: T.Optional[T.List[str]] = None,
116116        }
117117        self .pure : bool  =  True 
118118
119+     @property  
120+     def  version (self ) ->  str :
121+         if  self .build_config :
122+             value  =  self .build_config ['language' ]['version' ]
123+         else :
124+             value  =  self .info ['variables' ].get ('LDVERSION' ) or  self .info ['version' ]
125+         assert  isinstance (value , str )
126+         return  value 
127+ 
119128    def  _check_version (self , version : str ) ->  bool :
120129        if  self .name  ==  'python2' :
121130            return  mesonlib .version_compare (version , '< 3.0' )
@@ -357,19 +366,28 @@ def find_libpy_windows(self, env: 'Environment', limited_api: bool = False) -> N
357366
358367class  PythonPkgConfigDependency (PkgConfigDependency , _PythonDependencyBase ):
359368
360-     def  __init__ (self , name : str , environment : 'Environment' ,
361-                  kwargs : T .Dict [str , T .Any ], installation : 'BasicPythonExternalProgram' ,
362-                  libpc : bool  =  False ):
363-         if  libpc :
364-             mlog .debug (f'Searching for { name !r}   via pkgconfig lookup in LIBPC' )
369+     def  __init__ (self , environment : 'Environment' , kwargs : T .Dict [str , T .Any ],
370+                  installation : 'BasicPythonExternalProgram' , embed : bool ):
371+         pkg_embed  =  '-embed'  if  embed  and  mesonlib .version_compare (installation .info ['version' ], '>=3.8' ) else  '' 
372+         pkg_name  =  f'python-{ installation .version } { pkg_embed }  ' 
373+ 
374+         if  installation .build_config :
375+             pkg_libdir  =  installation .build_config ['c_api' ]['pkgconfig_path' ]
376+             pkg_libdir_origin  =  'c_api.pkgconfig_path from the Python build config' 
365377        else :
366-             mlog .debug (f'Searching for { name !r}   via fallback pkgconfig lookup in default paths' )
378+             pkg_libdir  =  installation .info ['variables' ].get ('LIBPC' )
379+             pkg_libdir_origin  =  'LIBPC'  if  pkg_libdir  else  'the default paths' 
380+         mlog .debug (f'Searching for { pkg_libdir !r}   via pkgconfig lookup in { pkg_libdir_origin }  ' )
381+         pkgconfig_paths  =  [pkg_libdir ] if  pkg_libdir  else  []
367382
368-         PkgConfigDependency .__init__ (self , name , environment , kwargs )
383+         PkgConfigDependency .__init__ (self , pkg_name , environment , kwargs ,  extra_paths = pkgconfig_paths )
369384        _PythonDependencyBase .__init__ (self , installation , kwargs .get ('embed' , False ))
370385
371-         if  libpc  and  not  self .is_found :
372-             mlog .debug (f'"python-{ self .version }  " could not be found in LIBPC, this is likely due to a relocated python installation' )
386+         if  pkg_libdir  and  not  self .is_found :
387+             mlog .debug (
388+                 f'{ pkg_name !r}   could not be found in { pkg_libdir_origin }  , ' 
389+                 'this is likely due to a relocated python installation' 
390+             )
373391
374392        # pkg-config files are usually accurate starting with python 3.8 
375393        if  not  self .link_libpython  and  mesonlib .version_compare (self .version , '< 3.8' ):
@@ -438,48 +456,9 @@ def python_factory(env: 'Environment', for_machine: 'MachineChoice',
438456        installation  =  BasicPythonExternalProgram ('python3' , mesonlib .python_command )
439457        installation .sanity ()
440458
441-     if  installation .build_config :
442-         pkg_version  =  installation .build_config ['language' ]['version' ]
443-     else :
444-         pkg_version  =  installation .info ['variables' ].get ('LDVERSION' ) or  installation .info ['version' ]
445- 
446459    if  DependencyMethods .PKGCONFIG  in  methods :
447460        if  from_installation :
448-             if  installation .build_config :
449-                 pkg_libdir  =  installation .build_config ['c_api' ]['pkgconfig_path' ]
450-             else :
451-                 pkg_libdir  =  installation .info ['variables' ].get ('LIBPC' )
452-             pkg_embed  =  '-embed'  if  embed  and  mesonlib .version_compare (installation .info ['version' ], '>=3.8' ) else  '' 
453-             pkg_name  =  f'python-{ pkg_version } { pkg_embed }  ' 
454- 
455-             # If python-X.Y.pc exists in LIBPC, we will try to use it 
456-             def  wrap_in_pythons_pc_dir (name : str , env : 'Environment' , kwargs : T .Dict [str , T .Any ],
457-                                        installation : 'BasicPythonExternalProgram' ) ->  'ExternalDependency' :
458-                 if  not  pkg_libdir :
459-                     # there is no LIBPC, so we can't search in it 
460-                     empty  =  ExternalDependency (DependencyTypeName ('pkgconfig' ), env , {})
461-                     empty .name  =  'python' 
462-                     return  empty 
463- 
464-                 old_pkg_libdir  =  os .environ .pop ('PKG_CONFIG_LIBDIR' , None )
465-                 old_pkg_path  =  os .environ .pop ('PKG_CONFIG_PATH' , None )
466-                 os .environ ['PKG_CONFIG_LIBDIR' ] =  pkg_libdir 
467-                 try :
468-                     return  PythonPkgConfigDependency (name , env , kwargs , installation , True )
469-                 finally :
470-                     def  set_env (name : str , value : str ) ->  None :
471-                         if  value  is  not   None :
472-                             os .environ [name ] =  value 
473-                         elif  name  in  os .environ :
474-                             del  os .environ [name ]
475-                     set_env ('PKG_CONFIG_LIBDIR' , old_pkg_libdir )
476-                     set_env ('PKG_CONFIG_PATH' , old_pkg_path )
477- 
478-             candidates .append (functools .partial (wrap_in_pythons_pc_dir , pkg_name , env , kwargs , installation ))
479-             # We only need to check both, if a python install has a LIBPC. It might point to the wrong location, 
480-             # e.g. relocated / cross compilation, but the presence of LIBPC indicates we should definitely look for something. 
481-             if  pkg_libdir  is  not   None :
482-                 candidates .append (functools .partial (PythonPkgConfigDependency , pkg_name , env , kwargs , installation ))
461+             candidates .append (functools .partial (PythonPkgConfigDependency , env , kwargs , installation , embed ))
483462        else :
484463            candidates .append (functools .partial (PkgConfigDependency , 'python3' , env , kwargs ))
485464
@@ -488,7 +467,7 @@ def set_env(name: str, value: str) -> None:
488467
489468    if  DependencyMethods .EXTRAFRAMEWORK  in  methods :
490469        nkwargs  =  kwargs .copy ()
491-         if  mesonlib .version_compare (pkg_version , '>= 3' ):
470+         if  mesonlib .version_compare (installation . version , '>= 3' ):
492471            # There is a python in /System/Library/Frameworks, but that's python 2.x, 
493472            # Python 3 will always be in /Library 
494473            nkwargs ['paths' ] =  ['/Library/Frameworks' ]
0 commit comments