summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Brunet <charles.brunet@optelgroup.com>2024-02-27 21:47:50 -0500
committerDylan Baker <dylan@pnwbakers.com>2024-03-01 12:09:22 -0800
commit76f6874e4841954a63ac9fb79deec353f50648d1 (patch)
treedb25d7a591629dae4d82e6fdabc0e7a0c779b03e
parent4ed6d75d962b3d43a9f7e8f5154e48d0bef01cc9 (diff)
downloadmeson-76f6874e4841954a63ac9fb79deec353f50648d1.tar.gz
Fix base and compiler options not reconfigurable.
Fixes #12920.
-rw-r--r--mesonbuild/compilers/detect.py2
-rw-r--r--mesonbuild/coredata.py17
-rw-r--r--mesonbuild/interpreter/interpreter.py3
-rwxr-xr-xrun_project_tests.py2
-rw-r--r--test cases/unit/122 reconfigure base options/meson.build5
-rw-r--r--unittests/platformagnostictests.py10
6 files changed, 29 insertions, 10 deletions
diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py
index d8f48f3e0..dbc2b4879 100644
--- a/mesonbuild/compilers/detect.py
+++ b/mesonbuild/compilers/detect.py
@@ -106,7 +106,7 @@ def detect_compiler_for(env: 'Environment', lang: str, for_machine: MachineChoic
if comp is None:
return comp
assert comp.for_machine == for_machine
- env.coredata.process_new_compiler(lang, comp, env)
+ env.coredata.process_compiler_options(lang, comp, env)
if not skip_sanity_check:
comp.sanity_check(env.get_scratch_dir(), env)
env.coredata.compilers[comp.for_machine][lang] = comp
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index 25a506848..b2b966b7d 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -1017,6 +1017,7 @@ class CoreData:
value = env.options.get(k)
if value is not None:
o.set_value(value)
+ self.options[k] = o # override compiler option on reconfigure
self.options.setdefault(k, o)
def add_lang_args(self, lang: str, comp: T.Type['Compiler'],
@@ -1028,20 +1029,20 @@ class CoreData:
# `self.options.update()`` is perfectly safe.
self.options.update(compilers.get_global_options(lang, comp, for_machine, env))
- def process_new_compiler(self, lang: str, comp: 'Compiler', env: 'Environment') -> None:
+ def process_compiler_options(self, lang: str, comp: 'Compiler', env: 'Environment') -> None:
from . import compilers
self.add_compiler_options(comp.get_options(), lang, comp.for_machine, env)
enabled_opts: T.List[OptionKey] = []
for key in comp.base_options:
- if key in self.options:
- continue
- oobj = copy.deepcopy(compilers.base_options[key])
- if key in env.options:
- oobj.set_value(env.options[key])
- enabled_opts.append(key)
- self.options[key] = oobj
+ if key not in self.options:
+ self.options[key] = copy.deepcopy(compilers.base_options[key])
+ if key in env.options:
+ self.options[key].set_value(env.options[key])
+ enabled_opts.append(key)
+ elif key in env.options:
+ self.options[key].set_value(env.options[key])
self.emit_base_options_warnings(enabled_opts)
def emit_base_options_warnings(self, enabled_opts: T.List[OptionKey]) -> None:
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 79a61ed0e..e5a201e05 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -1518,6 +1518,9 @@ class Interpreter(InterpreterBase, HoldableObject):
continue
else:
raise
+ else:
+ # update new values from commandline, if it applies
+ self.coredata.process_compiler_options(lang, comp, self.environment)
# Add per-subproject compiler options. They inherit value from main project.
if self.subproject:
diff --git a/run_project_tests.py b/run_project_tests.py
index 60ff56f70..6fc9cb7f7 100755
--- a/run_project_tests.py
+++ b/run_project_tests.py
@@ -981,7 +981,7 @@ def have_working_compiler(lang: str, use_tmp: bool) -> bool:
return False
if not compiler:
return False
- env.coredata.process_new_compiler(lang, compiler, env)
+ env.coredata.process_compiler_options(lang, compiler, env)
try:
compiler.sanity_check(env.get_scratch_dir(), env)
except mesonlib.MesonException:
diff --git a/test cases/unit/122 reconfigure base options/meson.build b/test cases/unit/122 reconfigure base options/meson.build
new file mode 100644
index 000000000..67e83d1e4
--- /dev/null
+++ b/test cases/unit/122 reconfigure base options/meson.build
@@ -0,0 +1,5 @@
+project('reconfigure', 'c',
+default_options: ['c_std=c89'])
+
+message('b_ndebug: ' + get_option('b_ndebug'))
+message('c_std: ' + get_option('c_std'))
diff --git a/unittests/platformagnostictests.py b/unittests/platformagnostictests.py
index 581ecaccc..6884da42e 100644
--- a/unittests/platformagnostictests.py
+++ b/unittests/platformagnostictests.py
@@ -275,3 +275,13 @@ class PlatformAgnosticTests(BasePlatformTests):
self.assertIn('first statement must be a call to project()', out)
# provide guidance diagnostics by finding a file whose first AST statement is project()
self.assertIn(f'Did you mean to run meson from the directory: "{testdir}"?', out)
+
+ def test_reconfigure_base_options(self):
+ testdir = os.path.join(self.unit_test_dir, '122 reconfigure base options')
+ out = self.init(testdir, extra_args=['-Db_ndebug=true'])
+ self.assertIn('\nMessage: b_ndebug: true\n', out)
+ self.assertIn('\nMessage: c_std: c89\n', out)
+
+ out = self.init(testdir, extra_args=['--reconfigure', '-Db_ndebug=if-release', '-Dc_std=c99'])
+ self.assertIn('\nMessage: b_ndebug: if-release\n', out)
+ self.assertIn('\nMessage: c_std: c99\n', out)