subproject: fix version validation on lookup

Fixes a bug where the subproject version was not validated
when the subproject had already been processed.

The bug would cause inconsistent build results if the subproject was
referenced more than once (diamond) with conflicting version requirements.
pull/9817/head
Øyvind Aarrestad Aakre 3 years ago committed by Eli Schwartz
parent bc8c1f578f
commit 5b3094d43b
  1. 5
      mesonbuild/interpreter/interpreter.py
  2. 4
      test cases/failing/120 subproject version conflict/meson.build
  3. 4
      test cases/failing/120 subproject version conflict/subprojects/A/meson.build
  4. 3
      test cases/failing/120 subproject version conflict/subprojects/B/meson.build
  5. 7
      test cases/failing/120 subproject version conflict/test.json

@ -829,6 +829,11 @@ external dependencies (including libraries) must go to "dependencies".''')
subproject = self.subprojects[subp_name]
if required and not subproject.found():
raise InterpreterException(f'Subproject "{subproject.subdir}" required but not found.')
if 'version' in kwargs:
pv = self.build.subprojects[subp_name]
wanted = kwargs['version']
if pv == 'undefined' or not mesonlib.version_compare_many(pv, wanted)[0]:
raise InterpreterException(f'Subproject {subp_name} version is {pv} but {wanted} required.')
return subproject
r = self.environment.wrap_resolver

@ -0,0 +1,4 @@
project('120 subproject version conflict')
A_dep = subproject('A').get_variable('A_dep')
B_dep = subproject('B', version: '1').get_variable('B_dep')

@ -0,0 +1,4 @@
project('A')
B_dep = subproject('B').get_variable('B_dep')
A_dep = declare_dependency(dependencies: B_dep)

@ -0,0 +1,3 @@
project('B', version: '100')
B_dep = declare_dependency()

@ -0,0 +1,7 @@
{
"stdout": [
{
"line": "test cases/failing/120 subproject version conflict/meson.build:4:0: ERROR: Subproject B version is 100 but 1 required."
}
]
}
Loading…
Cancel
Save