From 162697475973d02210795b7507da3d67bf78d7cc Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Sun, 22 Dec 2024 18:33:06 +0300 Subject: [PATCH] [+] update packaging 1. update cli and cli_bootstrap; 1.1. use /meson and /pyproject build dirs to fix collision for install step; --- deps/com.github.aiortc.aiortc | 2 +- .../fxreader/pr34/commands_typed/cli.py | 28 +++++-- .../pr34/commands_typed/cli_bootstrap.py | 75 +++++++++++++++---- 3 files changed, 82 insertions(+), 23 deletions(-) diff --git a/deps/com.github.aiortc.aiortc b/deps/com.github.aiortc.aiortc index 64d8fec..857be4a 160000 --- a/deps/com.github.aiortc.aiortc +++ b/deps/com.github.aiortc.aiortc @@ -1 +1 @@ -Subproject commit 64d8fecc5740fb77dcd40ef45a8b3c74c2187ba0 +Subproject commit 857be4a1fb1c07e2a239b61ce49b34cdd1698467 diff --git a/python/online/fxreader/pr34/commands_typed/cli.py b/python/online/fxreader/pr34/commands_typed/cli.py index 6a25d5c..98826d1 100644 --- a/python/online/fxreader/pr34/commands_typed/cli.py +++ b/python/online/fxreader/pr34/commands_typed/cli.py @@ -1,6 +1,7 @@ import dataclasses import io import glob +import os import pathlib import logging import sys @@ -13,6 +14,7 @@ from .os import shutil_which from typing import ( Optional, Literal, + Any, ) logger = logging.getLogger(__name__) @@ -130,6 +132,7 @@ class CLI(abc.ABC): argv: Optional[list[str]] = None, output_dir: Optional[pathlib.Path] = None, force: Optional[bool] = None, + env: Optional[dict[str, str]] = None, ) -> None: project = self.projects[project_name] @@ -147,12 +150,16 @@ class CLI(abc.ABC): force=force, ) + if env is None: + env = dict() + cmd = [ sys.executable, '-m', 'build', '-w', '-n', '-Csetup-args=-Dmodes=pyproject', + '-Cbuild-dir=%s' % str(project.build_dir / 'pyproject'), '-Csetup-args=-Dinstall_path=%s' % str(project.dest_dir), # '-Cbuild-dir=%s' % str(project.build_dir), str(project.source_dir), @@ -161,7 +168,12 @@ class CLI(abc.ABC): if not output_dir is None: cmd.extend(['-o', str(output_dir)]) - subprocess.check_call(cmd) + logger.info(dict(env=env)) + + subprocess.check_call( + cmd, + env=dict(list(os.environ.items())) | env, + ) def meson_install( self, @@ -184,7 +196,7 @@ class CLI(abc.ABC): shutil_which('meson', True,), 'install', '-C', - project.build_dir, + project.build_dir / 'meson', '--destdir', project.dest_dir, *argv, ]) @@ -218,7 +230,7 @@ class CLI(abc.ABC): subprocess.check_call([ shutil_which('ninja', True), '-C', - str(project.build_dir), + str(project.build_dir / 'meson'), *argv, ]) @@ -236,7 +248,7 @@ class CLI(abc.ABC): shutil_which('meson', True,), 'compile', '-C', - project.build_dir, + project.build_dir / 'meson', *argv, ]) @@ -252,15 +264,15 @@ class CLI(abc.ABC): argv = [] if force: - if project.build_dir.exists(): - logger.info(dict(action='removing build dir', path=project.build_dir)) - shutil.rmtree(project.build_dir) + if (project.build_dir / 'meson').exists(): + logger.info(dict(action='removing build dir', path=project.build_dir / 'meson')) + shutil.rmtree(project.build_dir / 'meson') cmd = [ shutil_which('meson', True,), 'setup', str(project.source_dir), - str(project.build_dir), + str(project.build_dir / 'meson'), '-Dmodes=["meson"]', # '-Dpkgconfig.relocatable=true', '-Dprefix=/', diff --git a/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py b/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py index eef4e17..60ac95f 100644 --- a/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py +++ b/python/online/fxreader/pr34/commands_typed/cli_bootstrap.py @@ -1,17 +1,43 @@ #!/usr/bin/env python3 import glob +import dataclasses import pathlib import sys import subprocess import os +import logging -env_path = pathlib.Path(__file__).parent / '.venv' -python_path = env_path / 'bin' / 'python3' +from typing import (Self, Optional,) + +logger = logging.getLogger(__name__) + +@dataclasses.dataclass +class BootstrapSettings: + env_path: pathlib.Path + python_path: pathlib.Path + + @classmethod + def get( + cls, + base_dir: Optional[pathlib.Path] = None, + ) -> Self: + if base_dir is None: + base_dir = pathlib.Path.cwd() + + env_path = base_dir / '.venv' + python_path = env_path / 'bin' / 'python3' + + return cls( + env_path=env_path, + python_path=python_path, + ) + +def env_bootstrap() -> None: + bootstrap_settings = BootstrapSettings.get() -if not env_path.exists(): subprocess.check_call([ 'uv', 'venv', '--seed', '--offline', - str(env_path) + str(bootstrap_settings.env_path) ]) subprocess.check_call([ @@ -19,13 +45,13 @@ if not env_path.exists(): 'pip', 'install', '-p', - python_path, + bootstrap_settings.python_path, '--offline', 'uv', ]) subprocess.check_call([ - python_path, + bootstrap_settings.python_path, '-m', 'uv', 'pip', 'install', '--offline', @@ -39,29 +65,50 @@ if not env_path.exists(): ) if len(early_wheels) > 0: subprocess.check_call([ - python_path, + bootstrap_settings.python_path, '-m', 'uv', 'pip', 'install', '--offline', *early_wheels, ]) +def paths_equal( + a: pathlib.Path | str, + b: pathlib.Path | str +) -> bool: + return ( + os.path.abspath(str(a)) == + os.path.abspath(str(b)) + ) -if __name__ == '__main__': - if pathlib.Path(sys.executable).absolute() != python_path.absolute(): +def run() -> None: + bootstrap_settings = BootstrapSettings.get() + + logging.basicConfig(level=logging.INFO) + + if not bootstrap_settings.env_path.exists(): + env_bootstrap() + + logger.info([sys.executable, sys.argv, bootstrap_settings.python_path]) + + if not paths_equal(sys.executable, bootstrap_settings.python_path): os.execv( - str(python_path), + str(bootstrap_settings.python_path), [ - str(python_path), + str(bootstrap_settings.python_path), *sys.argv, ] ) os.execv( - str(python_path), + str(bootstrap_settings.python_path), [ - str(python_path), + str(bootstrap_settings.python_path), pathlib.Path(__file__).parent / 'cli.py', *sys.argv[1:], ] - ) \ No newline at end of file + ) + + +if __name__ == '__main__': + run() \ No newline at end of file