aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-08-09 11:24:38 -0400
committerNirbheek Chauhan <nirbheek@centricular.com>2021-08-10 16:06:45 +0530
commit1eded7025b74e392275008415d5c26c88dc4545e (patch)
tree556e7bd72b1f1fa2bff039d8819699e9ae498c70
parent69ced55e3e9fc4c4b8a329056d4d33e26200b2ba (diff)
downloadmeson-1eded7025b74e392275008415d5c26c88dc4545e.zip
meson-1eded7025b74e392275008415d5c26c88dc4545e.tar.gz
meson-1eded7025b74e392275008415d5c26c88dc4545e.tar.bz2
interpreter: Fix holder_map not being updated when subproject fails
Fixes: #9038
-rw-r--r--mesonbuild/interpreter/interpreter.py20
-rw-r--r--test cases/python/6 failing subproject/meson.build5
-rw-r--r--test cases/python/6 failing subproject/subprojects/bar/meson.build4
3 files changed, 17 insertions, 12 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 30d3c75..a5b2597 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -311,7 +311,6 @@ class Interpreter(InterpreterBase, HoldableObject):
subproject: str = '',
subdir: str = '',
subproject_dir: str = 'subprojects',
- modules: T.Optional[T.Dict[str, T.Union[ExtensionModule, NewExtensionModule, NotFoundExtensionModule]]] = None,
default_project_options: T.Optional[T.Dict[str, str]] = None,
mock: bool = False,
ast: T.Optional[mparser.CodeBlockNode] = None,
@@ -324,10 +323,7 @@ class Interpreter(InterpreterBase, HoldableObject):
self.coredata = self.environment.get_coredata()
self.backend = backend
self.summary = {}
- if modules is None:
- self.modules = {}
- else:
- self.modules = modules
+ self.modules = {}
# Subproject directory is usually the name of the subproject, but can
# be different for dependencies provided by wrap files.
self.subproject_directory_name = subdir.split(os.path.sep)[-1]
@@ -919,10 +915,14 @@ external dependencies (including libraries) must go to "dependencies".''')
with mlog.nested(subp_name):
new_build = self.build.copy()
subi = Interpreter(new_build, self.backend, subp_name, subdir, self.subproject_dir,
- self.modules, default_options, ast=ast, is_translated=is_translated)
+ default_options, ast=ast, is_translated=is_translated)
+ # Those lists are shared by all interpreters. That means that
+ # even if the subproject fails, any modification that the subproject
+ # made to those lists will affect the parent project.
subi.subprojects = self.subprojects
- subi.holder_map.update(self.holder_map)
- subi.bound_holder_map.update(self.bound_holder_map)
+ subi.modules = self.modules
+ subi.holder_map = self.holder_map
+ subi.bound_holder_map = self.bound_holder_map
subi.subproject_stack = self.subproject_stack + [subp_name]
current_active = self.active_projectname
@@ -953,10 +953,6 @@ external dependencies (including libraries) must go to "dependencies".''')
self.build.subprojects[subp_name] = subi.project_version
self.coredata.initialized_subprojects.add(subp_name)
self.summary.update(subi.summary)
- # Update the holder maps from the subproject. Additional entries to the
- # holder maps can be added through imported Meson modules
- self.holder_map.update(subi.holder_map)
- self.bound_holder_map.update(subi.bound_holder_map)
return self.subprojects[subp_name]
def _do_subproject_cmake(self, subp_name, subdir, subdir_abs, default_options, kwargs):
diff --git a/test cases/python/6 failing subproject/meson.build b/test cases/python/6 failing subproject/meson.build
new file mode 100644
index 0000000..cc33a1c
--- /dev/null
+++ b/test cases/python/6 failing subproject/meson.build
@@ -0,0 +1,5 @@
+project('foo', 'cpp')
+
+# Regression test for https://github.com/mesonbuild/meson/issues/9038
+dependency('bar', required: false, allow_fallback: true)
+python = import('python').find_installation('python3').dependency()
diff --git a/test cases/python/6 failing subproject/subprojects/bar/meson.build b/test cases/python/6 failing subproject/subprojects/bar/meson.build
new file mode 100644
index 0000000..21431ca
--- /dev/null
+++ b/test cases/python/6 failing subproject/subprojects/bar/meson.build
@@ -0,0 +1,4 @@
+project('bar', 'cpp')
+
+python = import('python').find_installation('python3')
+dependency('nonexistant-dependency')