aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/python.py
diff options
context:
space:
mode:
authorDavid Seifert <soap@gentoo.org>2018-08-08 22:01:58 +0200
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>2018-08-09 06:27:53 -0700
commitab01db177b58fb2b190f9b193b42f2c714322f59 (patch)
treeed9508a9156d950cee98d90c23fdae83e77439a3 /mesonbuild/modules/python.py
parentab6929f64ad295fb42ca989d2beea023b1f37f7d (diff)
downloadmeson-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.py55
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'))