aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Griffis <tingping@tingping.se>2016-10-14 22:58:12 -0400
committerPatrick Griffis <tingping@tingping.se>2016-10-19 18:44:19 -0400
commit1781129740973ed37adf5d753cfce1e2a8b2fcfe (patch)
tree7b8c28efd6fae68d7fa2220defa4c956602f5c9e
parent263cb6a5f0dcbffdf25e159b3bfa07988838aae9 (diff)
downloadmeson-1781129740973ed37adf5d753cfce1e2a8b2fcfe.zip
meson-1781129740973ed37adf5d753cfce1e2a8b2fcfe.tar.gz
meson-1781129740973ed37adf5d753cfce1e2a8b2fcfe.tar.bz2
gnome: Add yelp() function
Fixes #881 Mentioned in #295
-rw-r--r--mesonbuild/mesonmain.py3
-rw-r--r--mesonbuild/modules/gnome.py60
-rw-r--r--mesonbuild/scripts/yelphelper.py118
3 files changed, 181 insertions, 0 deletions
diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py
index 7f7ab43..943c087 100644
--- a/mesonbuild/mesonmain.py
+++ b/mesonbuild/mesonmain.py
@@ -227,6 +227,9 @@ def run_script_command(args):
elif cmdname == 'gettext':
import mesonbuild.scripts.gettext as abc
cmdfunc = abc.run
+ elif cmdname == 'yelphelper':
+ import mesonbuild.scripts.yelphelper as abc
+ cmdfunc = abc.run
else:
raise MesonException('Unknown internal command {}.'.format(cmdname))
return cmdfunc(cmdargs)
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index ea9b15a..1ae1527 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -17,6 +17,7 @@ functionality such as gobject-introspection and gresources.'''
from .. import build
import os
+import sys
import subprocess
from ..mesonlib import MesonException
from .. import dependencies
@@ -452,6 +453,65 @@ class GnomeModule:
target_g = build.CustomTarget(targetname, state.subdir, kwargs)
return target_g
+ def yelp(self, state, args, kwargs):
+ if len(args) < 1:
+ raise MesonException('Yelp requires a project id')
+
+ project_id = args[0]
+ sources = mesonlib.stringlistify(kwargs.pop('sources', []))
+ if not sources:
+ if len(args) > 1:
+ sources = mesonlib.stringlistify(args[1:])
+ if not sources:
+ raise MesonException('Yelp requires a list of sources')
+ source_str = '@@'.join(sources)
+
+ langs = mesonlib.stringlistify(kwargs.pop('languages', []))
+ media = mesonlib.stringlistify(kwargs.pop('media', []))
+ symlinks = kwargs.pop('symlink_media', False)
+
+ if not isinstance(symlinks, bool):
+ raise MesonException('symlink_media must be a boolean')
+
+ if kwargs:
+ raise MesonException('Unknown arguments passed: {}'.format(', '.join(kwargs.keys())))
+
+ install_cmd = [
+ sys.executable,
+ state.environment.get_build_command(),
+ '--internal',
+ 'yelphelper',
+ 'install',
+ '--subdir=' + state.subdir,
+ '--id=' + project_id,
+ '--installdir=' + os.path.join(state.environment.get_datadir(), 'help'),
+ '--sources=' + source_str,
+ ]
+ if symlinks:
+ install_cmd.append('--symlinks=true')
+ if media:
+ install_cmd.append('--media=' + '@@'.join(media))
+ if langs:
+ install_cmd.append('--langs=' + '@@'.join(langs))
+ inscript = build.InstallScript(install_cmd)
+
+ potargs = [state.environment.get_build_command(), '--internal', 'yelphelper', 'pot',
+ '--subdir=' + state.subdir,
+ '--id=' + project_id,
+ '--sources=' + source_str]
+ pottarget = build.RunTarget('help-' + project_id + '-pot', sys.executable,
+ potargs, [], state.subdir)
+
+ poargs = [state.environment.get_build_command(), '--internal', 'yelphelper', 'update-po',
+ '--subdir=' + state.subdir,
+ '--id=' + project_id,
+ '--sources=' + source_str,
+ '--langs=' + '@@'.join(langs)]
+ potarget = build.RunTarget('help-' + project_id + '-update-po', sys.executable,
+ poargs, [], state.subdir)
+
+ return [inscript, pottarget, potarget]
+
def gtkdoc(self, state, args, kwargs):
if len(args) != 1:
raise MesonException('Gtkdoc must have one positional argument.')
diff --git a/mesonbuild/scripts/yelphelper.py b/mesonbuild/scripts/yelphelper.py
new file mode 100644
index 0000000..00d713a
--- /dev/null
+++ b/mesonbuild/scripts/yelphelper.py
@@ -0,0 +1,118 @@
+# Copyright 2016 Patrick Griffis <tingping@tingping.se>
+
+# 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 sys, os
+import subprocess
+import shutil
+import argparse
+from mesonbuild import mlog
+from mesonbuild.mesonlib import MesonException
+from mesonbuild.scripts import destdir_join
+
+parser = argparse.ArgumentParser()
+parser.add_argument('command')
+parser.add_argument('--id', dest='project_id')
+parser.add_argument('--subdir', dest='subdir')
+parser.add_argument('--installdir', dest='install_dir')
+parser.add_argument('--sources', dest='sources')
+parser.add_argument('--media', dest='media', default='')
+parser.add_argument('--langs', dest='langs', default='')
+parser.add_argument('--symlinks', type=bool, dest='symlinks', default=False)
+
+def build_pot(srcdir, project_id, sources):
+ # Must be relative paths
+ sources = [os.path.join('C', source) for source in sources]
+ outfile = os.path.join(srcdir, project_id + '.pot')
+ subprocess.call(['itstool', '-o', outfile, *sources])
+
+def update_po(srcdir, project_id, langs):
+ potfile = os.path.join(srcdir, project_id + '.pot')
+ for lang in langs:
+ pofile = os.path.join(srcdir, lang, lang + '.po')
+ subprocess.call(['msgmerge', '-q', '-o', pofile, pofile, potfile])
+
+def build_translations(srcdir, blddir, langs):
+ for lang in langs:
+ outdir = os.path.join(blddir, lang)
+ os.makedirs(outdir, exist_ok=True)
+ subprocess.call([
+ 'msgfmt', os.path.join(srcdir, lang, lang + '.po'),
+ '-o', os.path.join(outdir, lang + '.gmo')
+ ])
+
+def merge_translations(blddir, sources, langs):
+ for lang in langs:
+ subprocess.call([
+ 'itstool', '-m', os.path.join(blddir, lang, lang + '.gmo'),
+ '-o', os.path.join(blddir, lang),
+ *sources,
+ ])
+
+def install_help(srcdir, blddir, sources, media, langs, install_dir, destdir, project_id, symlinks):
+ c_install_dir = os.path.join(install_dir, 'C', project_id)
+ for lang in langs + ['C']:
+ indir = destdir_join(destdir, os.path.join(install_dir, lang, project_id))
+ os.makedirs(indir, exist_ok=True)
+ for source in sources:
+ infile = os.path.join(srcdir if lang == 'C' else blddir, lang, source)
+ outfile = os.path.join(indir, source)
+ mlog.log('Installing %s to %s.' %(infile, outfile))
+ shutil.copyfile(infile, outfile)
+ shutil.copystat(infile, outfile)
+ for m in media:
+ infile = os.path.join(srcdir, lang, m)
+ outfile = os.path.join(indir, m)
+ if not os.path.exists(infile):
+ if lang == 'C':
+ mlog.log(mlog.bold('Warning:'), 'Media file "%s" did not exist in C directory' %m)
+ elif symlinks:
+ srcfile = os.path.join(c_install_dir, m)
+ mlog.log('Symlinking %s to %s.' %(outfile, srcfile))
+ if '/' in m or '\\' in m:
+ os.makedirs(os.path.dirname(outfile), exist_ok=True)
+ os.symlink(srcfile, outfile)
+ continue
+ symfile = os.path.join(install_dir, m)
+ mlog.log('Installing %s to %s.' %(infile, outfile))
+ if '/' in m or '\\' in m:
+ os.makedirs(os.path.dirname(outfile), exist_ok=True)
+ shutil.copyfile(infile, outfile)
+ shutil.copystat(infile, outfile)
+
+def run(args):
+ options = parser.parse_args(args)
+ langs = options.langs.split('@@') if options.langs else []
+ media = options.media.split('@@') if options.media else []
+ sources = options.sources.split('@@')
+ destdir = os.environ.get('DESTDIR', '')
+ src_subdir = os.path.join(os.environ['MESON_SOURCE_ROOT'], options.subdir)
+ build_subdir = os.path.join(os.environ['MESON_BUILD_ROOT'], options.subdir)
+ abs_sources = [os.path.join(src_subdir, 'C', source) for source in sources]
+
+ if options.command == 'pot':
+ build_pot(src_subdir, options.project_id, sources)
+ elif options.command == 'update-po':
+ build_pot(src_subdir, options.project_id, sources)
+ update_po(src_subdir, options.project_id, langs)
+ elif options.command == 'build':
+ if langs:
+ build_translations(src_subdir, build_subdir, langs)
+ elif options.command == 'install':
+ install_dir = os.path.join(os.environ['MESON_INSTALL_PREFIX'], options.install_dir)
+ if langs:
+ build_translations(src_subdir, build_subdir, langs)
+ merge_translations(build_subdir, abs_sources, langs)
+ install_help(src_subdir, build_subdir, sources, media, langs, install_dir,
+ destdir, options.project_id, options.symlinks)
+