From 22dcb692adefea7d51e480e36a53446cc0777c01 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Sun, 19 Jun 2022 00:51:54 -0400 Subject: 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. --- docs/markdown/Python-module.md | 6 ++--- .../python-extension-module-implicit-dependency.md | 13 ++++++++++ mesonbuild/modules/python.py | 28 +++++++++++++++------- test cases/python/2 extmodule/ext/meson.build | 1 - .../python/2 extmodule/ext/nested/meson.build | 1 - .../python/2 extmodule/ext/wrongdir/meson.build | 1 - 6 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 docs/markdown/snippets/python-extension-module-implicit-dependency.md diff --git a/docs/markdown/Python-module.md b/docs/markdown/Python-module.md index 8809fd0..bf40ce4 100644 --- a/docs/markdown/Python-module.md +++ b/docs/markdown/Python-module.md @@ -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 default visibility). -`extension_module` does not add any dependencies to the library so -user may need to add `dependencies : py_installation.dependency()`, -see [[dependency]]. +*since 0.63.0* `extension_module` automatically adds a dependency to the library +if one is not explicitly provided. To support older versions, the user may need to +add `dependencies : py_installation.dependency()`, see [[dependency]]. **Returns**: a [[@build_tgt]] object diff --git a/docs/markdown/snippets/python-extension-module-implicit-dependency.md b/docs/markdown/snippets/python-extension-module-implicit-dependency.md new file mode 100644 index 0000000..1b98df8 --- /dev/null +++ b/docs/markdown/snippets/python-extension-module-implicit-dependency.md @@ -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. diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index e5509d9..47dc674 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -516,16 +516,26 @@ class PythonInstallation(ExternalProgramHolder): kwargs['install_dir'] = os.path.join(self.platlib_install_path, subdir) - # On macOS and some Linux distros (Debian) distutils doesn't link - # extensions against libpython. We call into distutils and mirror its - # behavior. See https://github.com/mesonbuild/meson/issues/4117 - if not self.link_libpython: - new_deps = [] - for dep in mesonlib.extract_as_list(kwargs, 'dependencies'): - if isinstance(dep, _PythonDependencyBase): + 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 + # extensions against libpython. We call into distutils and mirror its + # behavior. See https://github.com/mesonbuild/meson/issues/4117 + if not self.link_libpython: dep = dep.get_partial_dependency(compile_args=True) - new_deps.append(dep) - kwargs['dependencies'] = new_deps + 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 # msys2's python3 has "-cpython-36m.dll", we have to be clever # FIXME: explain what the specific cleverness is here diff --git a/test cases/python/2 extmodule/ext/meson.build b/test cases/python/2 extmodule/ext/meson.build index 799e9b0..14fa94a 100644 --- a/test cases/python/2 extmodule/ext/meson.build +++ b/test cases/python/2 extmodule/ext/meson.build @@ -1,6 +1,5 @@ pylib = py.extension_module('tachyon', 'tachyon_module.c', - dependencies : py_dep, c_args: '-DMESON_MODULENAME="tachyon"', install: true, ) diff --git a/test cases/python/2 extmodule/ext/nested/meson.build b/test cases/python/2 extmodule/ext/nested/meson.build index 38d3d3e..34c1192 100644 --- a/test cases/python/2 extmodule/ext/nested/meson.build +++ b/test cases/python/2 extmodule/ext/nested/meson.build @@ -1,6 +1,5 @@ py.extension_module('tachyon', '../tachyon_module.c', - dependencies : py_dep, c_args: '-DMESON_MODULENAME="nested.tachyon"', install: true, subdir: 'nested' diff --git a/test cases/python/2 extmodule/ext/wrongdir/meson.build b/test cases/python/2 extmodule/ext/wrongdir/meson.build index 1355d4f..5074701 100644 --- a/test cases/python/2 extmodule/ext/wrongdir/meson.build +++ b/test cases/python/2 extmodule/ext/wrongdir/meson.build @@ -1,6 +1,5 @@ py.extension_module('tachyon', '../tachyon_module.c', - dependencies : py_dep, c_args: '-DMESON_MODULENAME="tachyon"', install: true, install_dir: get_option('libdir') -- cgit v1.1