@@ -116,6 +116,13 @@ 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+ return self .build_config ['language' ]['version' ]
123+ else :
124+ return self .info ['variables' ].get ('LDVERSION' ) or self .info ['version' ]
125+
119126 def _check_version (self , version : str ) -> bool :
120127 if self .name == 'python2' :
121128 return mesonlib .version_compare (version , '< 3.0' )
@@ -357,19 +364,28 @@ def find_libpy_windows(self, env: 'Environment', limited_api: bool = False) -> N
357364
358365class PythonPkgConfigDependency (PkgConfigDependency , _PythonDependencyBase ):
359366
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' )
367+ def __init__ (self , environment : 'Environment' , kwargs : T .Dict [str , T .Any ],
368+ installation : 'BasicPythonExternalProgram' , embed : bool ):
369+ pkg_embed = '-embed' if embed and mesonlib .version_compare (installation .info ['version' ], '>=3.8' ) else ''
370+ pkg_name = f'python-{ installation .version } { pkg_embed } '
371+
372+ if installation .build_config :
373+ pkg_libdir = installation .build_config ['c_api' ]['pkgconfig_path' ]
374+ pkg_libdir_origin = 'c_api.pkgconfig_path from the Python build config'
365375 else :
366- mlog .debug (f'Searching for { name !r} via fallback pkgconfig lookup in default paths' )
376+ pkg_libdir = installation .info ['variables' ].get ('LIBPC' )
377+ pkg_libdir_origin = 'LIBPC' if pkg_libdir else 'the default paths'
378+ mlog .debug (f'Searching for { pkg_libdir !r} via pkgconfig lookup in { pkg_libdir_origin } ' )
379+ pkgconfig_paths = [pkg_libdir ] if pkg_libdir else []
367380
368- PkgConfigDependency .__init__ (self , name , environment , kwargs )
381+ PkgConfigDependency .__init__ (self , pkg_name , environment , kwargs , extra_paths = pkgconfig_paths )
369382 _PythonDependencyBase .__init__ (self , installation , kwargs .get ('embed' , False ))
370383
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' )
384+ if pkg_libdir and not self .is_found :
385+ mlog .debug (
386+ f'{ pkg_name !r} could not be found in { pkg_libdir_origin } , '
387+ 'this is likely due to a relocated python installation'
388+ )
373389
374390 # pkg-config files are usually accurate starting with python 3.8
375391 if not self .link_libpython and mesonlib .version_compare (self .version , '< 3.8' ):
@@ -438,48 +454,9 @@ def python_factory(env: 'Environment', for_machine: 'MachineChoice',
438454 installation = BasicPythonExternalProgram ('python3' , mesonlib .python_command )
439455 installation .sanity ()
440456
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-
446457 if DependencyMethods .PKGCONFIG in methods :
447458 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 ))
459+ candidates .append (functools .partial (PythonPkgConfigDependency , env , kwargs , installation , embed ))
483460 else :
484461 candidates .append (functools .partial (PkgConfigDependency , 'python3' , env , kwargs ))
485462
@@ -488,7 +465,7 @@ def set_env(name: str, value: str) -> None:
488465
489466 if DependencyMethods .EXTRAFRAMEWORK in methods :
490467 nkwargs = kwargs .copy ()
491- if mesonlib .version_compare (pkg_version , '>= 3' ):
468+ if mesonlib .version_compare (installation . version , '>= 3' ):
492469 # There is a python in /System/Library/Frameworks, but that's python 2.x,
493470 # Python 3 will always be in /Library
494471 nkwargs ['paths' ] = ['/Library/Frameworks' ]
0 commit comments