From 098dc533d659a9ee6e987d46dfcd918bfb133ca3 Mon Sep 17 00:00:00 2001 From: Charles Brunet Date: Tue, 30 Sep 2025 12:10:55 -0400 Subject: Allow CustomTarget source for i18n.xgettext Fixes #15054 --- docs/markdown/i18n-module.md | 5 ++++- docs/markdown/snippets/xgettext-custom-tgt.md | 7 +++++++ mesonbuild/modules/i18n.py | 11 +++++++++-- test cases/frameworks/38 gettext extractor/src/lib3/foo.c | 0 .../frameworks/38 gettext extractor/src/lib3/meson.build | 4 ++++ test cases/frameworks/38 gettext extractor/src/meson.build | 1 + 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 docs/markdown/snippets/xgettext-custom-tgt.md create mode 100644 test cases/frameworks/38 gettext extractor/src/lib3/foo.c create mode 100644 test cases/frameworks/38 gettext extractor/src/lib3/meson.build diff --git a/docs/markdown/i18n-module.md b/docs/markdown/i18n-module.md index ac6146dd5..6cdd74a28 100644 --- a/docs/markdown/i18n-module.md +++ b/docs/markdown/i18n-module.md @@ -90,7 +90,7 @@ for each executable. Positional arguments are the following: * name `str`: the name of the resulting pot file. -* sources `array[str|File|build_tgt|custom_tgt]`: +* sources `array[str|File|build_tgt|custom_tgt|custom_idx]`: source files or targets. May be a list of `string`, `File`, [[@build_tgt]], or [[@custom_tgt]] returned from other calls to this function. @@ -120,4 +120,7 @@ included to generate the final pot file. Therefore, adding a dependency to source target will automatically add the translations of that dependency to the needed translations for that source target. +*New in 1.10.0* sources can be result of [[@custom_tgt]] or [[@custom_idx]]. +Before 1.10.0, custom targets were silently ignored. + *Added 1.8.0* diff --git a/docs/markdown/snippets/xgettext-custom-tgt.md b/docs/markdown/snippets/xgettext-custom-tgt.md new file mode 100644 index 000000000..37ec43823 --- /dev/null +++ b/docs/markdown/snippets/xgettext-custom-tgt.md @@ -0,0 +1,7 @@ +## `i18n.xgettext` now accepts CustomTarget and CustomTargetIndex as sources + +Previously, [[@custom_tgt]] were accepted but silently ignored, and +[[@custom_idx]] were not accepted. + +Now, they both can be used, and the generated outputs will be scanned to extract +translation strings. diff --git a/mesonbuild/modules/i18n.py b/mesonbuild/modules/i18n.py index 87baab203..8b8306584 100644 --- a/mesonbuild/modules/i18n.py +++ b/mesonbuild/modules/i18n.py @@ -75,7 +75,7 @@ if T.TYPE_CHECKING: install_dir: T.Optional[str] install_tag: T.Optional[str] - SourcesType = T.Union[str, mesonlib.File, build.BuildTarget, build.BothLibraries, build.CustomTarget] + SourcesType = T.Union[str, mesonlib.File, build.BuildTarget, build.BothLibraries, build.CustomTarget, build.CustomTargetIndex] _ARGS: KwargInfo[T.List[str]] = KwargInfo( @@ -202,6 +202,8 @@ class XgettextProgram: source_files.update(source.get_sources()) elif isinstance(source, build.BothLibraries): source_files.update(source.get('shared').get_sources()) + elif isinstance(source, (build.CustomTarget, build.CustomTargetIndex)): + source_files.update(mesonlib.File.from_built_file(source.get_subdir(), f) for f in source.get_outputs()) return source_files def _get_depends(self, sources: T.Iterable[SourcesType]) -> T.Set[build.CustomTarget]: @@ -531,7 +533,7 @@ class I18nModule(ExtensionModule): return ModuleReturnValue(ct, [ct]) @FeatureNew('i18n.xgettext', '1.8.0') - @typed_pos_args('i18n.xgettext', str, varargs=(str, mesonlib.File, build.BuildTarget, build.BothLibraries, build.CustomTarget), min_varargs=1) + @typed_pos_args('i18n.xgettext', str, varargs=(str, mesonlib.File, build.BuildTarget, build.BothLibraries, build.CustomTarget, build.CustomTargetIndex), min_varargs=1) @typed_kwargs( 'i18n.xgettext', _ARGS, @@ -541,6 +543,11 @@ class I18nModule(ExtensionModule): INSTALL_TAG_KW, ) def xgettext(self, state: ModuleState, args: T.Tuple[str, T.List[SourcesType]], kwargs: XgettextProgramT) -> build.CustomTarget: + if any(isinstance(a, build.CustomTarget) for a in args[1]): + FeatureNew.single_use('i18n.xgettext with custom_target is broken until 1.10', '1.10.0', self.interpreter.subproject, location=self.interpreter.current_node) + if any(isinstance(a, build.CustomTargetIndex) for a in args[1]): + FeatureNew.single_use('i18n.xgettext with custom_target index', '1.10.0', self.interpreter.subproject, location=self.interpreter.current_node) + toolname = 'xgettext' if self.tools[toolname] is None or not self.tools[toolname].found(): self.tools[toolname] = state.find_program(toolname, required=True, for_machine=mesonlib.MachineChoice.BUILD) diff --git a/test cases/frameworks/38 gettext extractor/src/lib3/foo.c b/test cases/frameworks/38 gettext extractor/src/lib3/foo.c new file mode 100644 index 000000000..e69de29bb diff --git a/test cases/frameworks/38 gettext extractor/src/lib3/meson.build b/test cases/frameworks/38 gettext extractor/src/lib3/meson.build new file mode 100644 index 000000000..34afeeb4a --- /dev/null +++ b/test cases/frameworks/38 gettext extractor/src/lib3/meson.build @@ -0,0 +1,4 @@ +fs = import('fs') + +foo = fs.copyfile('foo.c') +i18n.xgettext('test', foo[0]) diff --git a/test cases/frameworks/38 gettext extractor/src/meson.build b/test cases/frameworks/38 gettext extractor/src/meson.build index 27fc81326..b26646c1a 100644 --- a/test cases/frameworks/38 gettext extractor/src/meson.build +++ b/test cases/frameworks/38 gettext extractor/src/meson.build @@ -1,5 +1,6 @@ subdir('lib1') subdir('lib2') +subdir('lib3') main = executable('say', 'main.c', link_with: [lib2], include_directories: lib2_includes) -- cgit v1.2.3