Skip to content

Commit 9d1746d

Browse files
committed
Special case meson.version().version_compare() in ternaries also
This is a corollary to mesonbuild#7594, but in ternaries.
1 parent e6bb7f2 commit 9d1746d

3 files changed

Lines changed: 29 additions & 16 deletions

File tree

mesonbuild/interpreterbase/interpreterbase.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from .operator import MesonOperator
3737
from ._unholder import _unholder
3838

39-
import os, copy, hashlib, re, pathlib
39+
import contextlib, copy, hashlib, os, pathlib, re
4040
import typing as T
4141
import textwrap
4242

@@ -103,6 +103,20 @@ def handle_meson_version_from_ast(self) -> None:
103103
# do nothing in an AST interpreter
104104
return
105105

106+
@contextlib.contextmanager
107+
def set_tmp_project_meson_version(self) -> T.Iterator[None]:
108+
prev_meson_version = mesonlib.project_meson_versions[self.subproject]
109+
if self.tmp_meson_version and isinstance(prev_meson_version, mesonlib.Range):
110+
always = prev_meson_version.always(self.tmp_meson_version)
111+
if always is not None:
112+
mlog.warning(f"Conditional on version '{self.tmp_meson_version}' always evaluates to {str(always).lower()}",
113+
location=self.current_node)
114+
mesonlib.project_meson_versions[self.subproject] = prev_meson_version.intersect(self.tmp_meson_version)
115+
try:
116+
yield
117+
finally:
118+
mesonlib.project_meson_versions[self.subproject] = prev_meson_version
119+
106120
def read_buildfile(self, fname: str, errname: str) -> str:
107121
try:
108122
with open(fname, encoding='utf-8') as f:
@@ -311,19 +325,10 @@ def evaluate_if(self, node: mparser.IfClauseNode) -> T.Optional[Disabler]:
311325
res = result.operator_call(MesonOperator.BOOL, None)
312326
if not isinstance(res, bool):
313327
raise InvalidCode(f'If clause {result!r} does not evaluate to true or false.')
314-
prev_meson_version = mesonlib.project_meson_versions[self.subproject]
315-
if self.tmp_meson_version and isinstance(prev_meson_version, mesonlib.Range):
316-
always = prev_meson_version.always(self.tmp_meson_version)
317-
if always is not None:
318-
mlog.warning(f"Conditional on version '{self.tmp_meson_version}' always evaluates to {str(always).lower()}",
319-
location=self.current_node)
320-
mesonlib.project_meson_versions[self.subproject] = prev_meson_version.intersect(self.tmp_meson_version)
321-
try:
328+
with self.set_tmp_project_meson_version():
322329
if res:
323330
self.evaluate_codeblock(i.block)
324331
return None
325-
finally:
326-
mesonlib.project_meson_versions[self.subproject] = prev_meson_version
327332
if not isinstance(node.elseblock, mparser.EmptyNode):
328333
self.evaluate_codeblock(node.elseblock.block)
329334
return None
@@ -415,6 +420,9 @@ def evaluate_arithmeticstatement(self, cur: mparser.ArithmeticNode) -> Interpret
415420
return self._holderify(res)
416421

417422
def evaluate_ternary(self, node: mparser.TernaryNode) -> T.Optional[InterpreterObject]:
423+
# Reset self.tmp_meson_version to know if it gets set during this
424+
# statement evaluation.
425+
self.tmp_meson_version = None
418426
result = self.evaluate_statement(node.condition)
419427
if result is None:
420428
raise mesonlib.MesonException('Cannot use a void statement as condition for ternary operator.')
@@ -423,7 +431,8 @@ def evaluate_ternary(self, node: mparser.TernaryNode) -> T.Optional[InterpreterO
423431
result.current_node = node
424432
result_bool = result.operator_call(MesonOperator.BOOL, None)
425433
if result_bool:
426-
return self.evaluate_statement(node.trueblock)
434+
with self.set_tmp_project_meson_version():
435+
return self.evaluate_statement(node.trueblock)
427436
else:
428437
return self.evaluate_statement(node.falseblock)
429438

test cases/unit/81 meson version compare/meson.build

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@ elif meson.version().version_compare('>= 0.55') and false
77
elif not meson.version().version_compare('>= 0.55')
88
error('This should not be executed')
99
elif meson.version().version_compare('>= 0.55')
10-
# This Should not produce warning even when using function not available in
11-
# meson 0.1.
10+
# This should not produce a warning even when using a function not available
11+
# in Meson 0.1.
1212
foo_dep = declare_dependency()
1313
meson.override_dependency('foo', foo_dep)
1414
endif
1515

16+
# This should not produce a warning even when using a function not available in
17+
# Meson 0.1.
18+
lib_suffix = meson.version().version_compare('>=1.12.0') ? default() : []
19+
1620
# This will error out if elif cause did not enter
1721
assert(foo_dep.found(), 'meson.version_compare did not work')
1822

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
project('foo', meson_version: '>= 0.1')
22

33
if meson.version().version_compare('>= 0.55')
4-
# This Should not produce warning even when using function not available in
5-
# meson 0.1.
4+
# This should not produce a warning even when using a function not available
5+
# in Meson 0.1.
66
foo_dep = declare_dependency()
77
meson.override_dependency('foo2', foo_dep)
88
endif

0 commit comments

Comments
 (0)