From c1dd4ba2f0eb961af3ace5038b54bc41d7f94708 Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Sun, 23 Aug 2026 16:50:31 -0400 Subject: [PATCH] Special case meson.version().version_compare() in ternaries also This is a corollary to #7594, but in ternaries. --- mesonbuild/interpreterbase/interpreterbase.py | 16 +++++++++++++++- .../unit/81 meson version compare/meson.build | 8 ++++++-- .../subprojects/foo/meson.build | 4 ++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/mesonbuild/interpreterbase/interpreterbase.py b/mesonbuild/interpreterbase/interpreterbase.py index 247e25e83934..d998b77219de 100644 --- a/mesonbuild/interpreterbase/interpreterbase.py +++ b/mesonbuild/interpreterbase/interpreterbase.py @@ -415,6 +415,9 @@ def evaluate_arithmeticstatement(self, cur: mparser.ArithmeticNode) -> Interpret return self._holderify(res) def evaluate_ternary(self, node: mparser.TernaryNode) -> T.Optional[InterpreterObject]: + # Reset self.tmp_meson_version to know if it gets set during this + # statement evaluation. + self.tmp_meson_version = None result = self.evaluate_statement(node.condition) if result is None: raise mesonlib.MesonException('Cannot use a void statement as condition for ternary operator.') @@ -422,8 +425,19 @@ def evaluate_ternary(self, node: mparser.TernaryNode) -> T.Optional[InterpreterO return result result.current_node = node result_bool = result.operator_call(MesonOperator.BOOL, None) + prev_meson_version = mesonlib.project_meson_versions[self.subproject] + if self.tmp_meson_version and isinstance(prev_meson_version, mesonlib.Range): + always = prev_meson_version.always(self.tmp_meson_version) + if always is not None: + mlog.warning(f"Conditional on version '{self.tmp_meson_version}' always evaluates to {str(always).lower()}", + location=self.current_node) if result_bool: - return self.evaluate_statement(node.trueblock) + if self.tmp_meson_version and isinstance(prev_meson_version, mesonlib.Range): + mesonlib.project_meson_versions[self.subproject] = prev_meson_version.intersect(self.tmp_meson_version) + try: + return self.evaluate_statement(node.trueblock) + finally: + mesonlib.project_meson_versions[self.subproject] = prev_meson_version else: return self.evaluate_statement(node.falseblock) diff --git a/test cases/unit/81 meson version compare/meson.build b/test cases/unit/81 meson version compare/meson.build index 4affe21dfb3d..7b4a544c454a 100644 --- a/test cases/unit/81 meson version compare/meson.build +++ b/test cases/unit/81 meson version compare/meson.build @@ -7,12 +7,16 @@ elif meson.version().version_compare('>= 0.55') and false elif not meson.version().version_compare('>= 0.55') error('This should not be executed') elif meson.version().version_compare('>= 0.55') - # This Should not produce warning even when using function not available in - # meson 0.1. + # This should not produce a warning even when using a function not available + # in Meson 0.1. foo_dep = declare_dependency() meson.override_dependency('foo', foo_dep) endif +# This should not produce a warning even when using a function not available in +# Meson 0.1. +lib_suffix = meson.version().version_compare('>=1.12.0') ? default() : [] + # This will error out if elif cause did not enter assert(foo_dep.found(), 'meson.version_compare did not work') diff --git a/test cases/unit/81 meson version compare/subprojects/foo/meson.build b/test cases/unit/81 meson version compare/subprojects/foo/meson.build index 4c66b70b3e21..412543b570f0 100644 --- a/test cases/unit/81 meson version compare/subprojects/foo/meson.build +++ b/test cases/unit/81 meson version compare/subprojects/foo/meson.build @@ -1,8 +1,8 @@ project('foo', meson_version: '>= 0.1') if meson.version().version_compare('>= 0.55') - # This Should not produce warning even when using function not available in - # meson 0.1. + # This should not produce a warning even when using a function not available + # in Meson 0.1. foo_dep = declare_dependency() meson.override_dependency('foo2', foo_dep) endif