From e5182a4bc9c867d6f17e638cc426abd4bf45e6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 19 Mar 2021 20:06:28 +0000 Subject: [PATCH] Install setup requires before invoking setup.py. --- ognibuild/__init__.py | 1 + ognibuild/__main__.py | 19 +++---------------- ognibuild/buildlog.py | 18 ++++++++++++++++++ ognibuild/buildsystem.py | 11 +++++++++++ ognibuild/fix_build.py | 1 - ognibuild/session/schroot.py | 13 +++++++++++-- 6 files changed, 44 insertions(+), 19 deletions(-) diff --git a/ognibuild/__init__.py b/ognibuild/__init__.py index 366f1f8..c7e0bc6 100644 --- a/ognibuild/__init__.py +++ b/ognibuild/__init__.py @@ -69,3 +69,4 @@ class UpstreamOutput(object): def get_declared_dependencies(self): raise NotImplementedError(self.get_declared_dependencies) + diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index 47e2f75..ff876b1 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -20,7 +20,7 @@ import os import shlex import sys from . import UnidentifiedError, DetailedFailure -from .buildlog import InstallFixer, ExplainInstallFixer, ExplainInstall +from .buildlog import InstallFixer, ExplainInstallFixer, ExplainInstall, install_missing_reqs from .buildsystem import NoBuildToolsFound, detect_buildsystems from .resolver import ( auto_resolver, @@ -60,21 +60,8 @@ def install_necessary_declared_requirements(session, resolver, fixers, buildsyst relevant.extend( get_necessary_declared_requirements(resolver, declared_reqs, stages) ) - missing = [] - for req in relevant: - try: - if not req.met(session): - missing.append(req) - except NotImplementedError: - missing.append(req) - if missing: - if explain: - commands = resolver.explain(missing) - if not commands: - raise UnsatisfiedRequirements(missing) - raise ExplainInstall(commands) - else: - resolver.install(missing) + + install_missing_reqs(session, resolver, relevant, explain=explain) # Types of dependencies: diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index 16ed253..a44bef9 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -232,3 +232,21 @@ class ExplainInstallFixer(BuildFixer): if not explanations: return False raise ExplainInstall(explanations) + + +def install_missing_reqs(session, resolver, reqs, explain=False): + missing = [] + for req in reqs: + try: + if not req.met(session): + missing.append(req) + except NotImplementedError: + missing.append(req) + if missing: + if explain: + commands = resolver.explain(missing) + if not commands: + raise UnsatisfiedRequirements(missing) + raise ExplainInstall(commands) + else: + resolver.install(missing) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 2b6404d..f3679b5 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -159,6 +159,7 @@ def run_setup(script_name, script_args=None, stop_after="run"): _setup_wrapper = """\ +import distutils from distutils import core import sys @@ -333,6 +334,16 @@ class SetupPy(BuildSystem): raise NotImplementedError def _run_setup(self, session, resolver, args, fixers): + from .buildlog import install_missing_reqs + distribution = self._extract_setup(session, fixers) + if distribution is not None: + # Install the setup_requires beforehand, since otherwise + # setuptools might fetch eggs instead of our preferred resolver. + install_missing_reqs( + session, + resolver, + [PythonPackageRequirement.from_requirement_str(require) + for require in distribution['setup_requires']]) interpreter = shebang_binary(os.path.join(self.path, 'setup.py')) if interpreter is not None: run_with_build_fixers(session, ["./setup.py"] + args, fixers) diff --git a/ognibuild/fix_build.py b/ognibuild/fix_build.py index 348d7fe..4489fe3 100644 --- a/ognibuild/fix_build.py +++ b/ognibuild/fix_build.py @@ -64,7 +64,6 @@ class DependencyContext(object): def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildFixer]): - logging.info("Running %r", args) fixed_errors = [] while True: try: diff --git a/ognibuild/session/schroot.py b/ognibuild/session/schroot.py index c0d0f06..e44be57 100644 --- a/ognibuild/session/schroot.py +++ b/ognibuild/session/schroot.py @@ -52,11 +52,20 @@ class SchrootSession(Session): .decode() ) - def _end_session(self) -> None: + def _end_session(self) -> bool: if self.session_id is None: raise NoSessionOpen(self) - subprocess.check_output(["schroot", "-c", "session:" + self.session_id, "-e"]) + try: + subprocess.check_output(["schroot", "-c", "session:" + self.session_id, "-e"], stderr=subprocess.PIPE) + except subprocess.CalledProcessError as e: + for line in e.stderr.splitlines(False): + if line.startswith(b'E: '): + logging.error('%s', line[3:].decode(errors='replace')) + logging.warning('Failed to close schroot session %s, leaving stray.', self.session_id) + self.session_id = None + return False self.session_id = None + return True def __enter__(self) -> "Session": if self.session_id is not None: