Currently meson implements the same logic as SCons for translations,
namely it doesn't do them. This patch changes meson to use logic more
like autotools, and generate translations. To do this we have to go
behind meson's back a bit, and wrap the whole thing up in a single
python script.

Meson has a module for gettext translations, but it assumes that one
will have a pot file, and then .mo translations will be generated and
checked into the source repo (or generated by hand using custom ninja
targets before building), mesa assumes that the targets will be
regenerated on each invocation of make or ninja. I think this can be
fixed upstream, but in the mean time this adds support for using
translations.

Signed-off-by: Dylan Baker <dylan.c.ba...@intel.com>
---
 src/util/xmlpool/gen_translations.py | 91 +++++++++++++++++++++++++++++-
 src/util/xmlpool/meson.build         | 31 +++++++---
 2 files changed, 114 insertions(+), 8 deletions(-)
 create mode 100644 src/util/xmlpool/gen_translations.py

diff --git a/src/util/xmlpool/gen_translations.py 
b/src/util/xmlpool/gen_translations.py
new file mode 100644
index 0000000..5d08590
--- /dev/null
+++ b/src/util/xmlpool/gen_translations.py
@@ -0,0 +1,91 @@
+# encoding=utf-8
+# Copyright © 2018 Intel Corporation
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Wraps gen_xmlpool.py and generates .mo files for use in meson.
+
+Currently meson and mesa have a mismatch in the way that they assume that
+translations should be generated. Meson assumes that translations are generated
+and checked into the tree, mesa assumes that they are generated at compile
+time. This script bridges that difference.
+"""
+
+from __future__ import print_function
+import argparse
+import os
+import subprocess
+import sys
+
+
+def arg_parser():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('inputfile', help='The template file (t_options.h)')
+    parser.add_argument('outputfile', help='The file to write.')
+    parser.add_argument('gen_xmlpool', help='The gen_xmlpool.py script')
+    parser.add_argument('sourcedir', help='The source directory')
+    parser.add_argument('builddir', help='The build directory')
+    parser.add_argument('python', help='The python binary to call 
gen_xmlpool.py with')
+    parser.add_argument('langs', nargs='+', help='langs to generate.')
+    return parser.parse_args()
+
+
+def gen_mo(lang, sourcedir, builddir):
+    """Generate an mo file from each po file using msgfmt."""
+    # TODO: Python actually provides a tool that serves the same purpose as
+    # msgfmt. It might make sense to fall back to that tool if msgfmt isn't
+    # available (or just use it since our po files aren't that complicated) for
+    # other oses (like macOS and Windows).
+
+    outdir = os.path.join(builddir, lang, 'LC_MESSAGES')
+    if not os.path.exists(outdir):
+        os.makedirs(outdir)
+
+    po_file = os.path.join(sourcedir, '{}.po'.format(lang))
+    mo_file = os.path.join(outdir, 'options.mo')
+
+    try:
+        subprocess.check_call(['msgfmt', '-o', mo_file, po_file])
+    except subprocess.CalledProcessError as e:
+        print(e.output, file=sys.stderr)
+        sys.exit(e.returncode)
+
+
+def main():
+    args = arg_parser()
+
+    for lang in args.langs:
+        gen_mo(lang, args.sourcedir, args.builddir)
+
+    try:
+        # We need to use subprocess since gen_xmlpool.py prints, and isn't safe
+        # to import since it doens't use the if __name__ == '__main__' idiom
+        out = subprocess.check_output(
+            [args.python, args.gen_xmlpool, args.inputfile, args.builddir] +
+            args.langs)
+    except subprocess.CalledProcessError as e:
+        print(e.output, file=sys.stderr)
+        sys.exit(e.returncode)
+
+    with open(args.outputfile, 'wb') as f:
+        f.write(out)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/src/util/xmlpool/meson.build b/src/util/xmlpool/meson.build
index 97693fa..93f9c44 100644
--- a/src/util/xmlpool/meson.build
+++ b/src/util/xmlpool/meson.build
@@ -18,11 +18,26 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-xmlpool_options_h = custom_target(
-  'xmlpool_options.h',
-  input : ['gen_xmlpool.py', 't_options.h'],
-  output : 'options.h',
-  command : [prog_python2, '@INPUT@', meson.current_source_dir()],
-  capture : true,
-  depend_files : files('ca.po', 'es.po', 'de.po', 'nl.po', 'sv.po', 'fr.po'),
-)
+prog_msgfmt = find_program('msgfmt', required : false)
+if prog_msgfmt.found()
+  xmlpool_options_h = custom_target(
+    'xmlpool_options.h',
+    input : ['gen_translations.py', 't_options.h', 'gen_xmlpool.py'],
+    output : ['options.h'],
+    command : [
+      prog_python2, '@INPUT0@', '@INPUT1@', '@OUTPUT@', '@INPUT2@',
+      meson.current_source_dir(), meson.current_build_dir(), prog_python2,
+      'ca', 'de', 'sv', 'es', 'nl', 'fr',
+    ],
+  )
+else
+  xmlpool_options_h = custom_target(
+    'xmlpool_options.h',
+    input : ['gen_xmlpool.py', 't_options.h'],
+    output : 'options.h',
+    command : [
+      prog_python2, '@INPUT0@', '@INPUT1@', meson.current_source_dir(),
+    ],
+    capture : true,
+  )
+endif

base-commit: 28c2d0d80b2ba15cc56651c0d3e6bc6eb31f9594
-- 
git-series 0.9.1
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to