diff options
author | Angelos Mouzakitis <a.mouzakitis@virtualopensystems.com> | 2023-10-10 14:33:42 +0000 |
---|---|---|
committer | Angelos Mouzakitis <a.mouzakitis@virtualopensystems.com> | 2023-10-10 14:33:42 +0000 |
commit | af1a266670d040d2f4083ff309d732d648afba2a (patch) | |
tree | 2fc46203448ddcc6f81546d379abfaeb323575e9 /meson/mesonbuild/scripts/yelphelper.py | |
parent | e02cda008591317b1625707ff8e115a4841aa889 (diff) |
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'meson/mesonbuild/scripts/yelphelper.py')
-rw-r--r-- | meson/mesonbuild/scripts/yelphelper.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/meson/mesonbuild/scripts/yelphelper.py b/meson/mesonbuild/scripts/yelphelper.py new file mode 100644 index 000000000..374104bea --- /dev/null +++ b/meson/mesonbuild/scripts/yelphelper.py @@ -0,0 +1,133 @@ +# 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 ..mesonlib import has_path_sep +from . import destdir_join +from .gettext import read_linguas +import typing as T + +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: str, project_id: str, sources: T.List[str]) -> None: + # 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: str, project_id: str, langs: T.List[str]) -> None: + 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: str, blddir: str, langs: T.List[str]) -> None: + 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: str, sources: T.List[str], langs: T.List[str]) -> None: + 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: str, blddir: str, sources: T.List[str], media: T.List[str], langs: T.List[str], install_dir: str, destdir: str, project_id: str, symlinks: bool) -> None: + 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(f'Installing {infile} to {outfile}') + shutil.copy2(infile, outfile) + for m in media: + infile = os.path.join(srcdir, lang, m) + outfile = os.path.join(indir, m) + c_infile = os.path.join(srcdir, 'C', m) + if not os.path.exists(infile): + if not os.path.exists(c_infile): + 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(f'Symlinking {outfile} to {srcfile}.') + if has_path_sep(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') + infile = c_infile + else: + # Lang doesn't have media file so copy it over 'C' one + infile = c_infile + mlog.log(f'Installing {infile} to {outfile}') + if has_path_sep(m): + os.makedirs(os.path.dirname(outfile), exist_ok=True) + shutil.copyfile(infile, outfile) + shutil.copystat(infile, outfile) + +def run(args: T.List[str]) -> int: + 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) + return 0 |