summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2025-03-12 11:14:28 -0700
committerDylan Baker <dylan@pnwbakers.com>2025-04-08 10:00:16 -0700
commitaa8f9229fc76e5d89da04495f3b188f4438de32e (patch)
tree35113b05aba6c7ea82c6fe3559782107ffffd879
parent9d1837e1afc919d18645c8fd6788cf44ac7d078d (diff)
downloadmeson-aa8f9229fc76e5d89da04495f3b188f4438de32e.tar.gz
coredata: delete set_default_options
This was only being used by the introspection interpreter, which meant the two interpreters had different behavior. They still do, which is really bad because the IntrospectionInterpreter doesn't have the command line options or project_default_options. I have a plan to fix that later, and I don't want to spend time on it here, as it's not a regression of this patch, it's just the status quo. This also fixes an issue caused by dead code being left, and hit, due to the option refactor branch. Fixes: #14382
-rw-r--r--mesonbuild/ast/introspection.py14
-rw-r--r--mesonbuild/coredata.py45
-rw-r--r--unittests/rewritetests.py1
3 files changed, 13 insertions, 47 deletions
diff --git a/mesonbuild/ast/introspection.py b/mesonbuild/ast/introspection.py
index 0d6470adc..4eb3fec3e 100644
--- a/mesonbuild/ast/introspection.py
+++ b/mesonbuild/ast/introspection.py
@@ -119,7 +119,19 @@ class IntrospectionInterpreter(AstInterpreter):
string_dict = cdata.create_options_dict(_project_default_options, self.subproject)
self.project_default_options = {OptionKey(s): v for s, v in string_dict.items()}
self.default_options.update(self.project_default_options)
- self.coredata.set_default_options(self.default_options, self.subproject, self.environment)
+ if self.environment.first_invocation or (self.subproject != '' and self.subproject not in self.coredata.initialized_subprojects):
+ if self.subproject == '':
+ self.coredata.optstore.initialize_from_top_level_project_call(
+ T.cast('T.Dict[T.Union[OptionKey, str], str]', string_dict),
+ {}, # TODO: not handled by this Interpreter.
+ self.environment.options)
+ else:
+ self.coredata.optstore.initialize_from_subproject_call(
+ self.subproject,
+ {}, # TODO: this isn't handled by the introspection interpreter...
+ T.cast('T.Dict[T.Union[OptionKey, str], str]', string_dict),
+ {}) # TODO: this isn't handled by the introspection interpreter...
+ self.coredata.initialized_subprojects.add(self.subproject)
if not self.is_subproject() and 'subproject_dir' in kwargs:
spdirname = kwargs['subproject_dir']
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index ba57821cc..f165fde10 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -565,51 +565,6 @@ class CoreData:
return dirty
- def set_default_options(self, default_options: T.MutableMapping[OptionKey, str], subproject: str, env: 'Environment') -> None:
- # Main project can set default options on subprojects, but subprojects
- # can only set default options on themselves.
- # Preserve order: if env.options has 'buildtype' it must come after
- # 'optimization' if it is in default_options.
- options_: T.MutableMapping[OptionKey, T.Any] = OrderedDict()
- for k, v in default_options.items():
- if isinstance(k, str):
- k = OptionKey.from_string(k)
- if not subproject or k.subproject == subproject:
- options_[k] = v
- options_.update(env.options)
- env.options = options_
-
- # Create a subset of options, keeping only project and builtin
- # options for this subproject.
- # Language and backend specific options will be set later when adding
- # languages and setting the backend (builtin options must be set first
- # to know which backend we'll use).
- options_ = OrderedDict()
-
- for k, v in env.options.items():
- if isinstance(k, str):
- k = OptionKey.from_string(k)
- # If this is a subproject, don't use other subproject options
- if k.subproject and k.subproject != subproject:
- continue
- # If the option is a builtin and is yielding then it's not allowed per subproject.
- #
- # Always test this using the HOST machine, as many builtin options
- # are not valid for the BUILD machine, but the yielding value does
- # not differ between them even when they are valid for both.
- if subproject and self.optstore.is_builtin_option(k) and self.optstore.get_value_object(k.evolve(subproject=None, machine=MachineChoice.HOST)).yielding:
- continue
- # Skip base, compiler, and backend options, they are handled when
- # adding languages and setting backend.
- if self.optstore.is_compiler_option(k) or self.optstore.is_backend_option(k):
- continue
- if self.optstore.is_base_option(k) and k.evolve(subproject=None) in options.COMPILER_BASE_OPTIONS:
- # set_options will report unknown base options
- continue
- options_[k] = v
-
- self.set_options(options_, subproject=subproject, first_invocation=env.first_invocation)
-
def add_compiler_options(self, c_options: MutableKeyedOptionDictType, lang: str, for_machine: MachineChoice,
env: Environment, subproject: str) -> None:
for k, o in c_options.items():
diff --git a/unittests/rewritetests.py b/unittests/rewritetests.py
index dfd69c83a..169c0350c 100644
--- a/unittests/rewritetests.py
+++ b/unittests/rewritetests.py
@@ -408,7 +408,6 @@ class RewriterTests(BasePlatformTests):
for orig_line, new_line in zip_longest(original_contents.splitlines(), new_contents.splitlines()):
self.assertEqual(orig_line, new_line)
- @unittest.expectedFailure
def test_rewrite_prefix(self) -> None:
self.prime('7 prefix')
out = self.rewrite_raw(self.builddir, ['kwargs', 'info', 'project', '/'])