diff options
author | David Seifert <soap@gentoo.org> | 2018-08-08 22:01:58 +0200 |
---|---|---|
committer | Nirbheek Chauhan <nirbheek.chauhan@gmail.com> | 2018-08-09 06:27:53 -0700 |
commit | ab01db177b58fb2b190f9b193b42f2c714322f59 (patch) | |
tree | ed9508a9156d950cee98d90c23fdae83e77439a3 /mesonbuild/modules/python.py | |
parent | ab6929f64ad295fb42ca989d2beea023b1f37f7d (diff) | |
download | meson-ab01db177b58fb2b190f9b193b42f2c714322f59.zip meson-ab01db177b58fb2b190f9b193b42f2c714322f59.tar.gz meson-ab01db177b58fb2b190f9b193b42f2c714322f59.tar.bz2 |
Make python module more robust
* Lookup is now performed according to the following order:
1. use `pkg-config` with `PKG_CONFIG_LIBDIR=LIBPC` from python
2. use plain `PKG_CONFIG_{LIBDIR,PATH}` from the environment
3. try to extract the information from SYSCONFIG
The second step is necessary for relocated python installations
and cross compilation scenarios, where the value of `LIBPC` might
be wrong.
Diffstat (limited to 'mesonbuild/modules/python.py')
-rw-r--r-- | mesonbuild/modules/python.py | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 1195d8a..d9ec562 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -17,6 +17,7 @@ import json from pathlib import Path from .. import mesonlib +from ..mesonlib import MesonException from . import ExtensionModule from mesonbuild.modules import ModuleReturnValue from ..interpreterbase import ( @@ -64,29 +65,48 @@ class PythonDependency(ExternalDependency): else: self.major_version = 2 + # We first try to find the necessary python variables using pkgconfig if DependencyMethods.PKGCONFIG in self.methods and not python_holder.is_pypy: pkg_version = self.variables.get('LDVERSION') or self.version pkg_libdir = self.variables.get('LIBPC') - old_pkg_libdir = os.environ.get('PKG_CONFIG_LIBDIR') - old_pkg_path = os.environ.get('PKG_CONFIG_PATH') - os.environ.pop('PKG_CONFIG_PATH', None) + # If python-X.Y.pc exists in LIBPC, we will try to use it + if pkg_libdir is not None and Path(os.path.join(pkg_libdir, 'python-{}.pc'.format(pkg_version))).is_file(): + old_pkg_libdir = os.environ.get('PKG_CONFIG_LIBDIR') + old_pkg_path = os.environ.get('PKG_CONFIG_PATH') - if pkg_libdir: - os.environ['PKG_CONFIG_LIBDIR'] = pkg_libdir + os.environ.pop('PKG_CONFIG_PATH', None) - try: - self.pkgdep = PkgConfigDependency('python-{}'.format(pkg_version), environment, kwargs) - except Exception: - pass + if pkg_libdir: + os.environ['PKG_CONFIG_LIBDIR'] = pkg_libdir - if old_pkg_path is not None: - os.environ['PKG_CONFIG_PATH'] = old_pkg_path + try: + self.pkgdep = PkgConfigDependency('python-{}'.format(pkg_version), environment, kwargs) + mlog.debug('Found "python-{}" via pkgconfig lookup in LIBPC ({})'.format(pkg_version, pkg_libdir)) + py_lookup_method = 'pkgconfig' + except MesonException as e: + mlog.debug('"python-{}" could not be found in LIBPC ({})'.format(pkg_version, pkg_libdir)) + mlog.debug(e) - if old_pkg_libdir is not None: - os.environ['PKG_CONFIG_LIBDIR'] = old_pkg_libdir + if old_pkg_path is not None: + os.environ['PKG_CONFIG_PATH'] = old_pkg_path + + if old_pkg_libdir is not None: + os.environ['PKG_CONFIG_LIBDIR'] = old_pkg_libdir + else: + os.environ.pop('PKG_CONFIG_LIBDIR', None) else: - os.environ.pop('PKG_CONFIG_LIBDIR', None) + mlog.debug('"python-{}" could not be found in LIBPC ({}), this is likely due to a relocated python installation'.format(pkg_version, pkg_libdir)) + + # If lookup via LIBPC failed, try to use fallback PKG_CONFIG_LIBDIR/PKG_CONFIG_PATH mechanisms + if self.pkgdep is None or not self.pkgdep.found(): + try: + self.pkgdep = PkgConfigDependency('python-{}'.format(pkg_version), environment, kwargs) + mlog.debug('Found "python-{}" via fallback pkgconfig lookup in PKG_CONFIG_LIBDIR/PKG_CONFIG_PATH'.format(pkg_version)) + py_lookup_method = 'pkgconfig-fallback' + except MesonException as e: + mlog.debug('"python-{}" could not be found via fallback pkgconfig lookup in PKG_CONFIG_LIBDIR/PKG_CONFIG_PATH'.format(pkg_version)) + mlog.debug(e) if self.pkgdep and self.pkgdep.found(): self.compile_args = self.pkgdep.get_compile_args() @@ -96,14 +116,19 @@ class PythonDependency(ExternalDependency): else: self.pkgdep = None + # Finally, try to find python via SYSCONFIG as a final measure if DependencyMethods.SYSCONFIG in self.methods: if mesonlib.is_windows(): self._find_libpy_windows(environment) else: self._find_libpy(python_holder, environment) + if self.is_found: + mlog.debug('Found "python-{}" via SYSCONFIG module'.format(self.version)) + py_lookup_method = 'sysconfig' + if self.is_found: - mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.green('YES')) + mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.green('YES ({})'.format(py_lookup_method))) else: mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.red('NO')) |