python module: implicitly add python dep to extensions
If there isn't a preexisting dependency on python, append one. It's almost assuredly needed, so just do the right thing out of the box.
This commit is contained in:
parent
43c60318fd
commit
22dcb692ad
|
@ -99,9 +99,9 @@ Additionally, the following diverge from [[shared_module]]'s default behavior:
|
||||||
of Python that support this (the python headers define `PyMODINIT_FUNC` has
|
of Python that support this (the python headers define `PyMODINIT_FUNC` has
|
||||||
default visibility).
|
default visibility).
|
||||||
|
|
||||||
`extension_module` does not add any dependencies to the library so
|
*since 0.63.0* `extension_module` automatically adds a dependency to the library
|
||||||
user may need to add `dependencies : py_installation.dependency()`,
|
if one is not explicitly provided. To support older versions, the user may need to
|
||||||
see [[dependency]].
|
add `dependencies : py_installation.dependency()`, see [[dependency]].
|
||||||
|
|
||||||
**Returns**: a [[@build_tgt]] object
|
**Returns**: a [[@build_tgt]] object
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
## Python extension modules now depend on the python library by default
|
||||||
|
|
||||||
|
Python extension modules are usually expected to link to the python library
|
||||||
|
and/or its headers in order to build correctly (via the default `embed: false`,
|
||||||
|
which may not actually link to the library itself). This means that every
|
||||||
|
single use of `.extension_module()` needed to include the `dependencies:
|
||||||
|
py_installation.dependency()` kwarg explicitly.
|
||||||
|
|
||||||
|
In the interest of doing the right thing out of the box, this is now the
|
||||||
|
default for extension modules that don't already include a dependency on
|
||||||
|
python. This is not expected to break anything, because it should always be
|
||||||
|
needed. Nevertheless, `py_installation.dependency().partial_dependency()` will
|
||||||
|
be detected as already included while providing no compile/link args.
|
|
@ -516,15 +516,25 @@ class PythonInstallation(ExternalProgramHolder):
|
||||||
|
|
||||||
kwargs['install_dir'] = os.path.join(self.platlib_install_path, subdir)
|
kwargs['install_dir'] = os.path.join(self.platlib_install_path, subdir)
|
||||||
|
|
||||||
|
new_deps = []
|
||||||
|
has_pydep = False
|
||||||
|
for dep in mesonlib.extract_as_list(kwargs, 'dependencies'):
|
||||||
|
if isinstance(dep, _PythonDependencyBase):
|
||||||
|
has_pydep = True
|
||||||
# On macOS and some Linux distros (Debian) distutils doesn't link
|
# On macOS and some Linux distros (Debian) distutils doesn't link
|
||||||
# extensions against libpython. We call into distutils and mirror its
|
# extensions against libpython. We call into distutils and mirror its
|
||||||
# behavior. See https://github.com/mesonbuild/meson/issues/4117
|
# behavior. See https://github.com/mesonbuild/meson/issues/4117
|
||||||
if not self.link_libpython:
|
if not self.link_libpython:
|
||||||
new_deps = []
|
|
||||||
for dep in mesonlib.extract_as_list(kwargs, 'dependencies'):
|
|
||||||
if isinstance(dep, _PythonDependencyBase):
|
|
||||||
dep = dep.get_partial_dependency(compile_args=True)
|
dep = dep.get_partial_dependency(compile_args=True)
|
||||||
new_deps.append(dep)
|
new_deps.append(dep)
|
||||||
|
if not has_pydep:
|
||||||
|
pydep = self._dependency_method_impl({})
|
||||||
|
if not pydep.found():
|
||||||
|
raise mesonlib.MesonException('Python dependency not found')
|
||||||
|
new_deps.append(pydep)
|
||||||
|
FeatureNew.single_use('python_installation.extension_module with implicit dependency on python',
|
||||||
|
'0.63.0', self.subproject, 'use python_installation.dependency()',
|
||||||
|
self.current_node)
|
||||||
kwargs['dependencies'] = new_deps
|
kwargs['dependencies'] = new_deps
|
||||||
|
|
||||||
# msys2's python3 has "-cpython-36m.dll", we have to be clever
|
# msys2's python3 has "-cpython-36m.dll", we have to be clever
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
pylib = py.extension_module('tachyon',
|
pylib = py.extension_module('tachyon',
|
||||||
'tachyon_module.c',
|
'tachyon_module.c',
|
||||||
dependencies : py_dep,
|
|
||||||
c_args: '-DMESON_MODULENAME="tachyon"',
|
c_args: '-DMESON_MODULENAME="tachyon"',
|
||||||
install: true,
|
install: true,
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
py.extension_module('tachyon',
|
py.extension_module('tachyon',
|
||||||
'../tachyon_module.c',
|
'../tachyon_module.c',
|
||||||
dependencies : py_dep,
|
|
||||||
c_args: '-DMESON_MODULENAME="nested.tachyon"',
|
c_args: '-DMESON_MODULENAME="nested.tachyon"',
|
||||||
install: true,
|
install: true,
|
||||||
subdir: 'nested'
|
subdir: 'nested'
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
py.extension_module('tachyon',
|
py.extension_module('tachyon',
|
||||||
'../tachyon_module.c',
|
'../tachyon_module.c',
|
||||||
dependencies : py_dep,
|
|
||||||
c_args: '-DMESON_MODULENAME="tachyon"',
|
c_args: '-DMESON_MODULENAME="tachyon"',
|
||||||
install: true,
|
install: true,
|
||||||
install_dir: get_option('libdir')
|
install_dir: get_option('libdir')
|
||||||
|
|
Loading…
Reference in New Issue