diff --git a/docs/markdown/i18n-module.md b/docs/markdown/i18n-module.md index b4e40d74b..9388be870 100644 --- a/docs/markdown/i18n-module.md +++ b/docs/markdown/i18n-module.md @@ -25,6 +25,7 @@ This function also defines targets for maintainers to use: This merges translations into a text file using `msgfmt`. See [custom_target](https://github.com/mesonbuild/meson/wiki/Reference%20manual#custom_target) for normal keywords. In addition it accepts these keywords: * `po_dir`: directory containing translations, relative to current directory +* `data_dirs`: (*Added 0.41.0*) list of directories for its files (See also `i18n.gettext()`) * `type`: type of file, valid options are `'xml'` (default) and `'desktop'` *Added 0.37.0* diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py index b997715e8..bce096567 100644 --- a/mesonbuild/mesonmain.py +++ b/mesonbuild/mesonmain.py @@ -222,6 +222,9 @@ def run_script_command(args): elif cmdname == 'gtkdoc': import mesonbuild.scripts.gtkdochelper as abc cmdfunc = abc.run + elif cmdname == 'msgfmthelper': + import mesonbuild.scripts.msgfmthelper as abc + cmdfunc = abc.run elif cmdname == 'regencheck': import mesonbuild.scripts.regen_checker as abc cmdfunc = abc.run diff --git a/mesonbuild/modules/i18n.py b/mesonbuild/modules/i18n.py index 5738cb3c4..c4e29cf13 100644 --- a/mesonbuild/modules/i18n.py +++ b/mesonbuild/modules/i18n.py @@ -49,6 +49,12 @@ PRESET_ARGS = { class I18nModule(ExtensionModule): + @staticmethod + def _get_data_dirs(state, dirs): + """Returns source directories of relative paths""" + src_dir = path.join(state.environment.get_source_dir(), state.subdir) + return [path.join(src_dir, d) for d in dirs] + def merge_file(self, state, args, kwargs): podir = kwargs.pop('po_dir', None) if not podir: @@ -60,8 +66,15 @@ class I18nModule(ExtensionModule): if file_type not in VALID_TYPES: raise MesonException('i18n: "{}" is not a valid type {}'.format(file_type, VALID_TYPES)) - kwargs['command'] = ['msgfmt', '--' + file_type, - '--template', '@INPUT@', '-d', podir, '-o', '@OUTPUT@'] + datadirs = self._get_data_dirs(state, mesonlib.stringlistify(kwargs.pop('data_dirs', []))) + datadirs = '--datadirs=' + ':'.join(datadirs) if datadirs else None + + command = [state.environment.get_build_command(), '--internal', 'msgfmthelper', + '@INPUT@', '@OUTPUT@', file_type, podir] + if datadirs: + command.append(datadirs) + + kwargs['command'] = command ct = build.CustomTarget(kwargs['output'] + '_merge', state.subdir, kwargs) return ModuleReturnValue(ct, [ct]) @@ -72,7 +85,7 @@ class I18nModule(ExtensionModule): raise coredata.MesonException('Can not do gettext because xgettext is not installed.') packagename = args[0] languages = mesonlib.stringlistify(kwargs.get('languages', [])) - datadirs = mesonlib.stringlistify(kwargs.get('data_dirs', [])) + datadirs = self._get_data_dirs(state, mesonlib.stringlistify(kwargs.get('data_dirs', []))) extra_args = mesonlib.stringlistify(kwargs.get('args', [])) preset = kwargs.pop('preset', None) diff --git a/mesonbuild/scripts/msgfmthelper.py b/mesonbuild/scripts/msgfmthelper.py new file mode 100644 index 000000000..d4deb0051 --- /dev/null +++ b/mesonbuild/scripts/msgfmthelper.py @@ -0,0 +1,35 @@ +# Copyright 2016 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import subprocess +import os + +parser = argparse.ArgumentParser() +parser.add_argument('input') +parser.add_argument('output') +parser.add_argument('type') +parser.add_argument('podir') +parser.add_argument('--datadirs', default='') + + +def run(args): + options = parser.parse_args(args) + env = None + if options.datadirs: + env = os.environ.copy() + env.update({'GETTEXTDATADIRS': options.datadirs}) + return subprocess.call(['msgfmt', '--' + options.type, '-d', options.podir, + '--template', options.input, '-o', options.output], + env=env)