diff options
author | Philipp Hörist <philipp@hoerist.com> | 2022-12-30 16:01:15 +0300 |
---|---|---|
committer | Philipp Hörist <philipp@hoerist.com> | 2023-01-28 14:53:14 +0300 |
commit | 76c32a5d44d7bd197ccbc9e5a6955ff2e4022066 (patch) | |
tree | 4744438e15f409cf54f97c2a91c162342427fb2d /pep517build | |
parent | 4c57bd71c6665803be2c61445c90fa2295dd993a (diff) |
new: Add custom PEP517 build backend
Diffstat (limited to 'pep517build')
-rw-r--r-- | pep517build/__init__.py | 0 | ||||
-rw-r--r-- | pep517build/backend.py | 89 | ||||
-rwxr-xr-x | pep517build/build_metadata.py | 85 | ||||
-rwxr-xr-x | pep517build/install_metadata.py | 43 |
4 files changed, 217 insertions, 0 deletions
diff --git a/pep517build/__init__.py b/pep517build/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/pep517build/__init__.py diff --git a/pep517build/backend.py b/pep517build/backend.py new file mode 100644 index 000000000..1592ccb57 --- /dev/null +++ b/pep517build/backend.py @@ -0,0 +1,89 @@ +from __future__ import annotations + +from typing import Any + +import logging +import subprocess +from pathlib import Path + +import setuptools.build_meta as _orig + +logging.basicConfig(level='INFO', format='%(message)s') + +ALLOWED_CONFIG_SETTINGS = {'target'} +MAN_FILES = [ + Path('data/gajim.1'), + Path('data/gajim-remote.1') +] +META_FILES = [ + (Path('data/org.gajim.Gajim.desktop.in'), '--desktop'), + (Path('data/org.gajim.Gajim.appdata.xml.in'), '--xml') +] +ICONS = [ + Path('gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg'), + Path('gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim-symbolic.svg'), +] + + +def build_translations() -> None: + # Compile translation files and place them into "gajim/data/locale" + + source_dir = Path.cwd() + translation_dir = source_dir / 'po' + locale_dir = source_dir / 'gajim' / 'data' / 'locale' + + langs = sorted([lang.stem for lang in translation_dir.glob('*.po')]) + + for lang in langs: + po_file = source_dir / 'po' / f'{lang}.po' + mo_file = locale_dir / lang / 'LC_MESSAGES' / 'gajim.mo' + mo_file.parent.mkdir(parents=True, exist_ok=True) + + logging.info('Compile %s >> %s', po_file, mo_file) + + subprocess.run(['msgfmt', + str(po_file), + '-o', + str(mo_file)], + check=True) + + +def _check_config_settings(config_settings: dict[str, str]) -> None: + settings = set(config_settings.keys()) - ALLOWED_CONFIG_SETTINGS + if settings: + raise ValueError('Unknown config setting %s' % settings) + + +def get_requires_for_build_sdist(*args: Any, **kwargs: Any) -> str: + return _orig.get_requires_for_build_sdist(*args, **kwargs) + + +def build_sdist(*args: Any, **kwargs: Any) -> str: + return _orig.build_sdist(*args, **kwargs) + + +def get_requires_for_build_wheel(*args: Any, **kwargs: Any) -> str: + return _orig.get_requires_for_build_wheel(*args, **kwargs) + + +def prepare_metadata_for_build_wheel(*args: Any, **kwargs: Any) -> str: + return _orig.prepare_metadata_for_build_wheel(*args, **kwargs) + + +def build_wheel(wheel_directory: str, + config_settings: dict[str, str] | None = None, + metadata_directory: str | None = None + ) -> str: + + if config_settings is not None: + _check_config_settings(config_settings) + + build_translations() + + basename = _orig.build_wheel( + wheel_directory, + config_settings=config_settings, + metadata_directory=metadata_directory, + ) + + return basename diff --git a/pep517build/build_metadata.py b/pep517build/build_metadata.py new file mode 100755 index 000000000..7e7d53f4b --- /dev/null +++ b/pep517build/build_metadata.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import argparse +import gzip +import logging +import shutil +import subprocess +from pathlib import Path + +logging.basicConfig(level='INFO', format='%(message)s') + +DEFAULT_METADATA_PATH = Path('dist/metadata') + +MAN_FILES = [ + Path('data/gajim.1'), + Path('data/gajim-remote.1') +] +META_FILES = [ + (Path('data/org.gajim.Gajim.desktop.in'), '--desktop'), + (Path('data/org.gajim.Gajim.appdata.xml.in'), '--xml') +] +ICONS = [ + Path('gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg'), + Path('gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim-symbolic.svg'), +] + + +def build_man(target_path: Path) -> None: + # Build man files in target path + + for man_path in MAN_FILES: + data = man_path.read_bytes() + man_file_name = man_path.name + + man_out_path = target_path / f'{man_file_name}.gz' + logging.info('Compress %s >> %s', man_file_name, man_out_path) + + with gzip.open(man_out_path, 'wb') as f_out: + f_out.write(data) + + + +def build_intl(target_path: Path) -> None: + # Merge translation files into desktop and metadata files + + for file_path, option in META_FILES: + out_path = target_path / file_path.name + out_path = out_path.with_suffix('') + + logging.info('Compile %s >> %s', file_path, out_path) + + subprocess.run(['msgfmt', + option, + '-d', + 'po', + '--template', + str(file_path), + '-o', + str(out_path)], + check=True) + + +def build_app_icons(target_path: Path) -> None: + for file_path in ICONS: + out_path = target_path / file_path.name + + logging.info('Copy %s >> %s', file_path, out_path) + shutil.copy2(file_path, out_path) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Build metadata files') + parser.add_argument('-o', + '--output-dir', + type=Path, + default=DEFAULT_METADATA_PATH) + args = parser.parse_args() + + args.output_dir.mkdir(parents=True, exist_ok=True) + + build_man(args.output_dir) + build_intl(args.output_dir) + build_app_icons(args.output_dir) diff --git a/pep517build/install_metadata.py b/pep517build/install_metadata.py new file mode 100755 index 000000000..17a5a2104 --- /dev/null +++ b/pep517build/install_metadata.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +from __future__ import annotations + +import argparse +import logging +import shutil +from pathlib import Path + +logging.basicConfig(level='INFO', format='%(message)s') + +DEFAULT_METADATA_PATH = Path('dist/metadata') + +FILES = { + 'gajim-remote.1.gz': 'share/man/man1', + 'gajim.1.gz': 'share/man/man1', + 'org.gajim.Gajim.desktop': 'share/applications', + 'org.gajim.Gajim-symbolic.svg': 'share/icons/hicolor/scalable/apps', + 'org.gajim.Gajim.svg': 'share/icons/hicolor/scalable/apps', + 'org.gajim.Gajim.appdata.xml': 'share/metainfo', +} + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Install metadata files') + parser.add_argument('input', + type=Path, + default=DEFAULT_METADATA_PATH, + help='Path to the metadata folder, ' + 'default: dist/metadata') + parser.add_argument('--prefix', + type=Path, + required=True, + help='The path prefix, for example "/usr"') + + args = parser.parse_args() + + for file, path in FILES.items(): + src = args.input / file + dest_dir = args.prefix / path + logging.info('Copy %s to %s', src, dest_dir) + if not dest_dir.exists(): + dest_dir.mkdir(parents=True) + shutil.copy(src, dest_dir / file) |