|
|
|
@ -62,7 +62,7 @@ class PythonDependency(ExternalDependency): |
|
|
|
|
else: |
|
|
|
|
self.major_version = 2 |
|
|
|
|
|
|
|
|
|
if DependencyMethods.PKGCONFIG in self.methods: |
|
|
|
|
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') |
|
|
|
@ -94,14 +94,46 @@ class PythonDependency(ExternalDependency): |
|
|
|
|
else: |
|
|
|
|
self.pkgdep = None |
|
|
|
|
|
|
|
|
|
if mesonlib.is_windows() and DependencyMethods.SYSCONFIG in self.methods: |
|
|
|
|
self._find_libpy_windows(environment) |
|
|
|
|
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.log('Dependency', mlog.bold(self.name), 'found:', mlog.green('YES')) |
|
|
|
|
else: |
|
|
|
|
mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.red('NO')) |
|
|
|
|
|
|
|
|
|
def _find_libpy(self, python_holder, environment): |
|
|
|
|
if python_holder.is_pypy: |
|
|
|
|
if self.major_version == 3: |
|
|
|
|
libname = 'pypy3-c' |
|
|
|
|
else: |
|
|
|
|
libname = 'pypy-c' |
|
|
|
|
libdir = os.path.join(self.variables.get('base'), 'bin') |
|
|
|
|
libdirs = [libdir] |
|
|
|
|
else: |
|
|
|
|
libname = 'python{}'.format(self.version) |
|
|
|
|
if 'DEBUG_EXT' in self.variables: |
|
|
|
|
libname += self.variables['DEBUG_EXT'] |
|
|
|
|
if 'ABIFLAGS' in self.variables: |
|
|
|
|
libname += self.variables['ABIFLAGS'] |
|
|
|
|
libdirs = [] |
|
|
|
|
|
|
|
|
|
largs = self.compiler.find_library(libname, environment, libdirs) |
|
|
|
|
|
|
|
|
|
self.is_found = largs is not None |
|
|
|
|
|
|
|
|
|
self.link_args = largs |
|
|
|
|
|
|
|
|
|
inc_paths = mesonlib.OrderedSet([ |
|
|
|
|
self.variables.get('INCLUDEPY'), |
|
|
|
|
self.paths.get('include'), |
|
|
|
|
self.paths.get('platinclude')]) |
|
|
|
|
|
|
|
|
|
self.compile_args += ['-I' + path for path in inc_paths if path] |
|
|
|
|
|
|
|
|
|
def get_windows_python_arch(self): |
|
|
|
|
if self.platform == 'mingw': |
|
|
|
|
pycc = self.variables.get('CC') |
|
|
|
@ -192,7 +224,7 @@ class PythonDependency(ExternalDependency): |
|
|
|
|
elif mesonlib.is_osx(): |
|
|
|
|
return [DependencyMethods.PKGCONFIG, DependencyMethods.EXTRAFRAMEWORK] |
|
|
|
|
else: |
|
|
|
|
return [DependencyMethods.PKGCONFIG] |
|
|
|
|
return [DependencyMethods.PKGCONFIG, DependencyMethods.SYSCONFIG] |
|
|
|
|
|
|
|
|
|
def get_pkgconfig_variable(self, variable_name, kwargs): |
|
|
|
|
if self.pkgdep: |
|
|
|
@ -225,6 +257,14 @@ print (json.dumps(sysconfig.get_paths(scheme='posix_prefix', vars={'base': '', ' |
|
|
|
|
''' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IS_PYPY_COMMAND = ''' |
|
|
|
|
import sys |
|
|
|
|
import json |
|
|
|
|
|
|
|
|
|
print (json.dumps('__pypy__' in sys.builtin_module_names)) |
|
|
|
|
''' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PythonInstallation(ExternalProgramHolder, InterpreterObject): |
|
|
|
|
def __init__(self, interpreter, python): |
|
|
|
|
InterpreterObject.__init__(self) |
|
|
|
@ -238,6 +278,7 @@ class PythonInstallation(ExternalProgramHolder, InterpreterObject): |
|
|
|
|
self.purelib_install_path = os.path.join(prefix, install_paths['purelib'][1:]) |
|
|
|
|
self.version = run_command(python, "import sysconfig; print (sysconfig.get_python_version())") |
|
|
|
|
self.platform = run_command(python, "import sysconfig; print (sysconfig.get_platform())") |
|
|
|
|
self.is_pypy = json.loads(run_command(python, IS_PYPY_COMMAND)) |
|
|
|
|
|
|
|
|
|
@permittedSnippetKwargs(mod_kwargs) |
|
|
|
|
def extension_module(self, interpreter, state, args, kwargs): |
|
|
|
@ -449,6 +490,8 @@ class PythonModule(ExtensionModule): |
|
|
|
|
version = run_command(python, "import sysconfig; print (sysconfig.get_python_version())") |
|
|
|
|
if not version: |
|
|
|
|
res = ExternalProgramHolder(NonExistingExternalProgram()) |
|
|
|
|
if required: |
|
|
|
|
raise mesonlib.MesonException('{} is not a valid python'.format(python)) |
|
|
|
|
else: |
|
|
|
|
res = PythonInstallation(interpreter, python) |
|
|
|
|
|
|
|
|
|