From 6562a69531d7025d4f3ffcb77baefbd0f4fd9f93 Mon Sep 17 00:00:00 2001 From: Tristan Partin Date: Fri, 18 Aug 2023 01:51:47 -0500 Subject: [PATCH] Add support for BuildTargetTypes to various fs module functions The new support was added to fs.name, fs.parent, fs.replace_suffix, and fs.stem. --- .../additional_types_for_fs_module.md | 9 +++ mesonbuild/modules/fs.py | 56 +++++++++---------- test cases/common/220 fs module/btgt.c | 5 ++ test cases/common/220 fs module/ctgt.txt | 0 test cases/common/220 fs module/meson.build | 19 +++++++ 5 files changed, 61 insertions(+), 28 deletions(-) create mode 100644 docs/markdown/snippets/additional_types_for_fs_module.md create mode 100644 test cases/common/220 fs module/btgt.c create mode 100644 test cases/common/220 fs module/ctgt.txt diff --git a/docs/markdown/snippets/additional_types_for_fs_module.md b/docs/markdown/snippets/additional_types_for_fs_module.md new file mode 100644 index 000000000000..86f2de9f438a --- /dev/null +++ b/docs/markdown/snippets/additional_types_for_fs_module.md @@ -0,0 +1,9 @@ +## Added support for `[[@build_tgt]]`, `[[@custom_tgt]]`, and `[[@custom_idx]]` to certain FS module functions + +Support for `[[@build_tgt]]`, `[[@custom_tgt]]`, and `[[@custom_idx]]` was +added to the following FS module APIs: + +- `fs.name` +- `fs.parent` +- `fs.replace_suffix` +- `fs.stem` diff --git a/mesonbuild/modules/fs.py b/mesonbuild/modules/fs.py index b977b99c07a8..1fa368e1fef3 100644 --- a/mesonbuild/modules/fs.py +++ b/mesonbuild/modules/fs.py @@ -72,6 +72,18 @@ def _absolute_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path: return Path(arg.absolute_path(state.source_root, state.environment.get_build_dir())) return Path(state.source_root) / Path(state.subdir) / Path(arg).expanduser() + @staticmethod + def _obj_to_path(feature_new_prefix: str, obj: T.Union[FileOrString, BuildTargetTypes], state: ModuleState) -> PurePath: + if isinstance(obj, str): + return PurePath(obj) + + if isinstance(obj, File): + FeatureNew(f'{feature_new_prefix} with file', '0.59.0').use(state.subproject, location=state.current_node) + return PurePath(str(obj)) + + FeatureNew(f'{feature_new_prefix} with build_tgt, custom_tgt, and custom_idx', '1.4.0').use(state.subproject, location=state.current_node) + return PurePath(state.backend.get_target_filename(obj)) + def _resolve_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path: """ resolves symlinks and makes absolute a directory relative to calling meson.build, @@ -178,41 +190,29 @@ def is_samepath(self, state: 'ModuleState', args: T.Tuple['FileOrString', 'FileO return False @noKwargs - @typed_pos_args('fs.replace_suffix', (str, File), str) - def replace_suffix(self, state: 'ModuleState', args: T.Tuple['FileOrString', str], kwargs: T.Dict[str, T.Any]) -> str: - if isinstance(args[0], File): - FeatureNew('fs.replace_suffix with file', '0.59.0').use(state.subproject, location=state.current_node) - original = PurePath(str(args[0])) - new = original.with_suffix(args[1]) - return str(new) + @typed_pos_args('fs.replace_suffix', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), str) + def replace_suffix(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], str], kwargs: T.Dict[str, T.Any]) -> str: + path = self._obj_to_path('fs.replace_suffix', args[0], state) + return str(path.with_suffix(args[1])) @noKwargs - @typed_pos_args('fs.parent', (str, File)) - def parent(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> str: - if isinstance(args[0], File): - FeatureNew('fs.parent_file', '0.59.0').use(state.subproject, location=state.current_node) - original = PurePath(str(args[0])) - new = original.parent - return str(new) + @typed_pos_args('fs.parent', (str, File, CustomTarget, CustomTargetIndex, BuildTarget)) + def parent(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str: + path = self._obj_to_path('fs.parent', args[0], state) + return str(path.parent) @noKwargs - @typed_pos_args('fs.name', (str, File)) - def name(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> str: - if isinstance(args[0], File): - FeatureNew('fs.name with file', '0.59.0').use(state.subproject, location=state.current_node) - original = PurePath(str(args[0])) - new = original.name - return str(new) + @typed_pos_args('fs.name', (str, File, CustomTarget, CustomTargetIndex, BuildTarget)) + def name(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str: + path = self._obj_to_path('fs.name', args[0], state) + return str(path.name) @noKwargs - @typed_pos_args('fs.stem', (str, File)) + @typed_pos_args('fs.stem', (str, File, CustomTarget, CustomTargetIndex, BuildTarget)) @FeatureNew('fs.stem', '0.54.0') - def stem(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> str: - if isinstance(args[0], File): - FeatureNew('fs.stem with file', '0.59.0').use(state.subproject, location=state.current_node) - original = PurePath(str(args[0])) - new = original.stem - return str(new) + def stem(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str: + path = self._obj_to_path('fs.stem', args[0], state) + return str(path.stem) @FeatureNew('fs.read', '0.57.0') @typed_pos_args('fs.read', (str, File)) diff --git a/test cases/common/220 fs module/btgt.c b/test cases/common/220 fs module/btgt.c new file mode 100644 index 000000000000..8479e67d1090 --- /dev/null +++ b/test cases/common/220 fs module/btgt.c @@ -0,0 +1,5 @@ +int +main(void) +{ + return 0; +} diff --git a/test cases/common/220 fs module/ctgt.txt b/test cases/common/220 fs module/ctgt.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test cases/common/220 fs module/meson.build b/test cases/common/220 fs module/meson.build index 80019631f6bc..afa578e2c424 100644 --- a/test cases/common/220 fs module/meson.build +++ b/test cases/common/220 fs module/meson.build @@ -5,6 +5,8 @@ is_windows = build_machine.system() == 'windows' fs = import('fs') f = files('meson.build') +btgt = executable('btgt', 'btgt.c') +ctgt = fs.copyfile('ctgt.txt') assert(fs.exists('meson.build'), 'Existing file reported as missing.') assert(not fs.exists('nonexisting'), 'Nonexisting file was found.') @@ -88,6 +90,13 @@ new_check = is_windows ? 'j:\\foo\\bar.ini' : '/foo/bar.ini' new = fs.replace_suffix(original, '.ini') assert(new == new_check, 'absolute path replace_suffix failed') +new = fs.replace_suffix(btgt, '.ini') +assert(new == 'btgt.ini', 'replace_suffix failed for build target') +new = fs.replace_suffix(ctgt, '.ini') +assert(new == 'ctgt.ini', 'replace_suffix failed for custom target') +new = fs.replace_suffix(ctgt[0], '.ini') +assert(new == 'ctgt.ini', 'replace_suffix failed for custom target index') + # -- hash md5 = fs.hash('subdir/subdirfile.txt', 'md5') @@ -135,11 +144,21 @@ assert(fs.parent(f[1]) == 'subdir/..', 'failed to get dirname') else assert(fs.parent(f[1]) == 'subdir\..', 'failed to get dirname') endif +assert(fs.parent(btgt) == '.', 'failed to get dirname for build target') +assert(fs.parent(ctgt) == '.', 'failed to get dirname for custom target') +assert(fs.parent(ctgt[0]) == '.', 'failed to get dirname for custom target index') + assert(fs.name('foo/bar') == 'bar', 'failed to get basename') assert(fs.name(f[1]) == 'meson.build', 'failed to get basename') assert(fs.name('foo/bar/baz.dll.a') == 'baz.dll.a', 'failed to get basename with compound suffix') +assert(fs.name(btgt) == 'btgt', 'failed to get basename of build target') +assert(fs.name(ctgt) == 'ctgt.txt', 'failed to get basename of custom target') +assert(fs.name(ctgt[0]) == 'ctgt.txt', 'failed to get basename of custom target index') assert(fs.stem('foo/bar/baz.dll') == 'baz', 'failed to get stem with suffix') assert(fs.stem('foo/bar/baz.dll.a') == 'baz.dll', 'failed to get stem with compound suffix') +assert(fs.stem(btgt) == 'btgt', 'failed to get stem of build target') +assert(fs.stem(ctgt) == 'ctgt', 'failed to get stem of custom target') +assert(fs.stem(ctgt[0]) == 'ctgt', 'failed to get stem of custom target index') # relative_to if build_machine.system() == 'windows'