123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- # 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 os
- import subprocess
- import shutil
- import argparse
- from .. import mlog
- from . import destdir_join
- from .gettext import read_linguas
- 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.warning('Media file "%s" did not exist in C directory' % m)
- continue
- 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)
- try:
- try:
- os.symlink(srcfile, outfile)
- except FileExistsError:
- os.remove(outfile)
- os.symlink(srcfile, outfile)
- continue
- except (NotImplementedError, OSError):
- mlog.warning('Symlinking not supported, falling back to copying')
- else:
- # Lang doesn't have media file so copy it over 'C' one
- infile = os.path.join(srcdir, 'C', 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 not langs:
- langs = read_linguas(src_subdir)
- 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)
|