Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Hörist <philipp@hoerist.com>2022-12-30 16:01:15 +0300
committerPhilipp Hörist <philipp@hoerist.com>2023-01-28 14:53:14 +0300
commit76c32a5d44d7bd197ccbc9e5a6955ff2e4022066 (patch)
tree4744438e15f409cf54f97c2a91c162342427fb2d /pep517build
parent4c57bd71c6665803be2c61445c90fa2295dd993a (diff)
new: Add custom PEP517 build backend
Diffstat (limited to 'pep517build')
-rw-r--r--pep517build/__init__.py0
-rw-r--r--pep517build/backend.py89
-rwxr-xr-xpep517build/build_metadata.py85
-rwxr-xr-xpep517build/install_metadata.py43
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)