diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2020-10-16 14:02:53 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2020-12-16 12:23:23 -0800 |
commit | 7ffc678514e6d86ba7072d726f0ccc99a0ccdbc5 (patch) | |
tree | df50d647c852359641d1244094d02fbb155143ab | |
parent | d32d0d6b53dc84e35f6b26fbcfaf23a37ab6b002 (diff) | |
download | meson-7ffc678514e6d86ba7072d726f0ccc99a0ccdbc5.zip meson-7ffc678514e6d86ba7072d726f0ccc99a0ccdbc5.tar.gz meson-7ffc678514e6d86ba7072d726f0ccc99a0ccdbc5.tar.bz2 |
build/interpreter: split representation of Headers
This was all layering violations before. Now we have Headers in the
build module, and a holder in the interpreter. All of the type
validation is done in interpreter method for `install_headers`.
-rw-r--r-- | mesonbuild/build.py | 31 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 50 |
2 files changed, 57 insertions, 24 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 5b7a679..ca1d86f 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -39,6 +39,7 @@ from .interpreterbase import FeatureNew if T.TYPE_CHECKING: from .interpreter import Test + from .mesonlib import FileMode pch_kwargs = set(['c_pch', 'cpp_pch']) @@ -122,6 +123,34 @@ class DependencyOverride: self.node = node self.explicit = explicit +class Headers: + + def __init__(self, sources: T.List[File], install_subdir: T.Optional[str], + install_dir: T.Optional[str], install_mode: T.Optional['FileMode']): + self.sources = sources + self.install_subdir = install_subdir + self.custom_install_dir = install_dir + self.custom_install_mode = install_mode + + # TODO: we really don't need any of these methods, but they're preserved to + # keep APIs relying on them working. + + def set_install_subdir(self, subdir: str) -> None: + self.install_subdir = subdir + + def get_install_subdir(self) -> str: + return self.install_subdir + + def get_sources(self) -> T.List[File]: + return self.sources + + def get_custom_install_dir(self) -> T.Optional[str]: + return self.custom_install_dir + + def get_custom_install_mode(self) -> T.Optional['FileMode']: + return self.custom_install_mode + + class Build: """A class that holds the status of one build including all dependencies and so on. @@ -140,7 +169,7 @@ class Build: self.projects_link_args = PerMachine({}, {}) # type: PerMachine[T.Dict[str, T.List[str]]] self.tests = [] # type: T.List['Test'] self.benchmarks = [] # type: T.List['Test'] - self.headers = [] + self.headers: T.List[Headers] = [] self.man = [] self.data = [] self.static_linker = PerMachine(None, None) # type: PerMachine[StaticLinker] diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 59e29be..3433915 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -716,34 +716,26 @@ class IncludeDirsHolder(InterpreterObject, ObjectHolder): InterpreterObject.__init__(self) ObjectHolder.__init__(self, idobj) -class Headers(InterpreterObject): +class HeadersHolder(InterpreterObject, ObjectHolder): - def __init__(self, sources, kwargs): + def __init__(self, obj: build.Headers): InterpreterObject.__init__(self) - self.sources = sources - self.install_subdir = kwargs.get('subdir', '') - if os.path.isabs(self.install_subdir): - mlog.deprecation('Subdir keyword must not be an absolute path. This will be a hard error in the next release.') - self.custom_install_dir = kwargs.get('install_dir', None) - self.custom_install_mode = kwargs.get('install_mode', None) - if self.custom_install_dir is not None: - if not isinstance(self.custom_install_dir, str): - raise InterpreterException('Custom_install_dir must be a string.') + ObjectHolder.__init__(self, obj) def set_install_subdir(self, subdir): - self.install_subdir = subdir + self.held_object.install_subdir = subdir def get_install_subdir(self): - return self.install_subdir + return self.held_object.install_subdir def get_sources(self): - return self.sources + return self.held_object.sources def get_custom_install_dir(self): - return self.custom_install_dir + return self.held_object.custom_install_dir def get_custom_install_mode(self): - return self.custom_install_mode + return self.held_object.custom_install_mode class DataHolder(InterpreterObject, ObjectHolder): def __init__(self, data): @@ -4189,10 +4181,22 @@ This will become a hard error in the future.''' % kwargs['input'], location=self @permittedKwargs(permitted_kwargs['install_headers']) def func_install_headers(self, node, args, kwargs): source_files = self.source_strings_to_files(args) - kwargs['install_mode'] = self._get_kwarg_install_mode(kwargs) - h = Headers(source_files, kwargs) + install_mode = self._get_kwarg_install_mode(kwargs) + + install_subdir = kwargs.get('subdir', '') + if not isinstance(install_subdir, str): + raise InterpreterException('subdir keyword argument must be a string') + elif os.path.isabs(install_subdir): + mlog.deprecation('Subdir keyword must not be an absolute path. This will be a hard error in the next release.') + + install_dir = kwargs.get('install_dir', None) + if install_dir is not None and not isinstance(install_dir, str): + raise InterpreterException('install_dir keyword argument must be a string if provided') + + h = build.Headers(source_files, install_subdir, install_dir, install_mode) self.build.headers.append(h) - return h + + return HeadersHolder(h) @FeatureNewKwargs('install_man', '0.47.0', ['install_mode']) @permittedKwargs(permitted_kwargs['install_man']) @@ -4251,10 +4255,10 @@ This will become a hard error in the future.''' % kwargs['input'], location=self pass self.subdir = prev_subdir - def _get_kwarg_install_mode(self, kwargs): + def _get_kwarg_install_mode(self, kwargs: T.Dict[str, T.Any]) -> T.Optional[FileMode]: if kwargs.get('install_mode', None) is None: return None - install_mode = [] + install_mode: T.List[str] = [] mode = mesonlib.typeslistify(kwargs.get('install_mode', []), (str, int)) for m in mode: # We skip any arguments that are set to `false` @@ -4806,11 +4810,11 @@ Try setting b_lundef to false instead.'''.format(self.coredata.base_options['b_s if sproj_name != self.subproject_directory_name: raise InterpreterException('Sandbox violation: Tried to grab file %s from a different subproject.' % plain_filename) - def source_strings_to_files(self, sources): - results = [] + def source_strings_to_files(self, sources: T.List[str]) -> T.List[mesonlib.File]: mesonlib.check_direntry_issues(sources) if not isinstance(sources, list): sources = [sources] + results: T.List[mesonlib.File] = [] for s in sources: if isinstance(s, (mesonlib.File, GeneratedListHolder, TargetHolder, CustomTargetIndexHolder, |