diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2024-04-14 12:58:30 +0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2025-02-13 15:26:44 +0200 |
commit | 518c732ea9b0f1975f6f28accff3286be4106538 (patch) | |
tree | 2be9544828545a2f9f0676efc6eb82ac197ec4bd /mesonbuild/build.py | |
parent | ea678ed82938ceac00682b2695b57193d36b71b4 (diff) | |
download | meson-optionrefactor3.zip meson-optionrefactor3.tar.gz meson-optionrefactor3.tar.bz2 |
Make all Meson level options overridable per subproject.optionrefactor3
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r-- | mesonbuild/build.py | 69 |
1 files changed, 14 insertions, 55 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 82d97fd..44241ec 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -49,7 +49,6 @@ if T.TYPE_CHECKING: from .mesonlib import ExecutableSerialisation, FileMode, FileOrString from .modules import ModuleState from .mparser import BaseNode - from .options import ElementaryOptionValues GeneratedTypes = T.Union['CustomTarget', 'CustomTargetIndex', 'GeneratedList'] LibTypes = T.Union['SharedLibrary', 'StaticLibrary', 'CustomTarget', 'CustomTargetIndex'] @@ -422,10 +421,6 @@ class ExtractedObjects(HoldableObject): recursive: bool = True pch: bool = False - def __post_init__(self) -> None: - if self.target.is_unity: - self.check_unity_compatible() - def __repr__(self) -> str: r = '<{0} {1!r}: {2}>' return r.format(self.__class__.__name__, self.target.name, self.srclist) @@ -537,12 +532,6 @@ class Target(HoldableObject, metaclass=abc.ABCMeta): pass def __post_init__(self, overrides: T.Optional[T.Dict[OptionKey, str]]) -> None: - if overrides: - ovr = {k.evolve(machine=self.for_machine) if k.lang else k: v - for k, v in overrides.items()} - else: - ovr = {} - self.options = coredata.OptionsView(self.environment.coredata.optstore, self.subproject, ovr) # XXX: this should happen in the interpreter if has_path_sep(self.name): # Fix failing test 53 when this becomes an error. @@ -657,34 +646,13 @@ class Target(HoldableObject, metaclass=abc.ABCMeta): # set, use the value of 'install' if it's enabled. self.build_by_default = True - self.set_option_overrides(self.parse_overrides(kwargs)) - - def is_compiler_option_hack(self, key): - # FIXME this method must be deleted when OptionsView goes away. - # At that point the build target only stores the original string. - # The decision on how to use those pieces of data is done elsewhere. - from .compilers import all_languages - if '_' not in key.name: - return False - prefix = key.name.split('_')[0] - return prefix in all_languages - - def set_option_overrides(self, option_overrides: T.Dict[OptionKey, str]) -> None: - self.options.overrides = {} - for k, v in option_overrides.items(): - if self.is_compiler_option_hack(k): - self.options.overrides[k.evolve(machine=self.for_machine)] = v - else: - self.options.overrides[k] = v - - def get_options(self) -> coredata.OptionsView: - return self.options + self.raw_overrides = self.parse_overrides(kwargs) - def get_option(self, key: OptionKey) -> ElementaryOptionValues: - return self.options.get_value(key) + def get_override(self, name: str) -> T.Optional[str]: + return self.raw_overrides.get(name, None) @staticmethod - def parse_overrides(kwargs: T.Dict[str, T.Any]) -> T.Dict[OptionKey, str]: + def parse_overrides(kwargs: T.Dict[str, T.Any]) -> T.Dict[str, str]: opts = kwargs.get('override_options', []) # In this case we have an already parsed and ready to go dictionary @@ -692,15 +660,13 @@ class Target(HoldableObject, metaclass=abc.ABCMeta): if isinstance(opts, dict): return T.cast('T.Dict[OptionKey, str]', opts) - result: T.Dict[OptionKey, str] = {} + result: T.Dict[str, str] = {} overrides = stringlistify(opts) for o in overrides: if '=' not in o: raise InvalidArguments('Overrides must be of form "key=value"') k, v = o.split('=', 1) - key = OptionKey.from_string(k.strip()) - v = v.strip() - result[key] = v + result[k] = v return result def is_linkable_target(self) -> bool: @@ -832,11 +798,6 @@ class BuildTarget(Target): def __str__(self): return f"{self.name}" - @property - def is_unity(self) -> bool: - unity_opt = self.get_option(OptionKey('unity')) - return unity_opt == 'on' or (unity_opt == 'subprojects' and self.subproject != '') - def validate_install(self): if self.for_machine is MachineChoice.BUILD and self.install: if self.environment.is_cross_build(): @@ -1020,8 +981,7 @@ class BuildTarget(Target): self.compilers['c'] = self.all_compilers['c'] if 'cython' in self.compilers: key = OptionKey('cython_language', machine=self.for_machine) - value = self.get_option(key) - + value = self.environment.coredata.optstore.get_value_for(key) try: self.compilers[value] = self.all_compilers[value] except KeyError: @@ -1057,7 +1017,7 @@ class BuildTarget(Target): 'Link_depends arguments must be strings, Files, ' 'or a Custom Target, or lists thereof.') - def extract_objects(self, srclist: T.List[T.Union['FileOrString', 'GeneratedTypes']]) -> ExtractedObjects: + def extract_objects(self, srclist: T.List[T.Union['FileOrString', 'GeneratedTypes']], is_unity: bool) -> ExtractedObjects: sources_set = set(self.sources) generated_set = set(self.generated) @@ -1080,7 +1040,10 @@ class BuildTarget(Target): obj_gen.append(src) else: raise MesonException(f'Object extraction arguments must be strings, Files or targets (got {type(src).__name__}).') - return ExtractedObjects(self, obj_src, obj_gen) + eobjs = ExtractedObjects(self, obj_src, obj_gen) + if is_unity: + eobjs.check_unity_compatible() + return eobjs def extract_all_objects(self, recursive: bool = True) -> ExtractedObjects: return ExtractedObjects(self, self.sources, self.generated, self.objects, @@ -1262,7 +1225,7 @@ class BuildTarget(Target): if kwargs.get(arg) is not None: val = T.cast('bool', kwargs[arg]) elif k in self.environment.coredata.optstore: - val = self.environment.coredata.optstore.get_value(k) + val = self.environment.coredata.optstore.get_value_for(k.name, k.subproject) else: val = False @@ -1973,7 +1936,7 @@ class Executable(BuildTarget): kwargs): key = OptionKey('b_pie') if 'pie' not in kwargs and key in environment.coredata.optstore: - kwargs['pie'] = environment.coredata.optstore.get_value(key) + kwargs['pie'] = environment.coredata.optstore.get_value_for(key) super().__init__(name, subdir, subproject, for_machine, sources, structured_sources, objects, environment, compilers, kwargs) self.win_subsystem = kwargs.get('win_subsystem') or 'console' @@ -2877,10 +2840,6 @@ class CompileTarget(BuildTarget): def type_suffix(self) -> str: return "@compile" - @property - def is_unity(self) -> bool: - return False - def _add_output(self, f: File) -> None: plainname = os.path.basename(f.fname) basename = os.path.splitext(plainname)[0] |