diff --git a/ognibuild/__init__.py b/ognibuild/__init__.py index cc0310e..684c6c1 100644 --- a/ognibuild/__init__.py +++ b/ognibuild/__init__.py @@ -50,7 +50,7 @@ def shebang_binary(p): return os.path.basename(args[0].decode()).strip() -class UpstreamRequirement(object): +class Requirement(object): # Name of the family of requirements - e.g. "python-package" family: str diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index 143ade7..b657e6b 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -62,9 +62,9 @@ STAGE_MAP = { } def determine_fixers(session, resolver): - from .buildlog import UpstreamRequirementFixer + from .buildlog import RequirementFixer from .resolver.apt import AptResolver - return [UpstreamRequirementFixer(resolver)] + return [RequirementFixer(resolver)] def main(): # noqa: C901 @@ -136,6 +136,7 @@ def main(): # noqa: C901 if not args.ignore_declared_dependencies and not args.explain: stages = STAGE_MAP[args.subcommand] if stages: + logging.info('Checking that declared requirements are present') for bs in bss: install_necessary_declared_requirements(resolver, bs, stages) fixers = determine_fixers(session, resolver) @@ -166,7 +167,7 @@ def main(): # noqa: C901 if args.subcommand == "info": from .info import run_info run_info(session, buildsystems=bss) - except UnidentifiedError: + except UnidentifiedError as e: return 1 except NoBuildToolsFound: logging.info("No build tools found.") diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index 2743ff9..2401ddf 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -173,7 +173,7 @@ def problem_to_upstream_requirement(problem): return None -class UpstreamRequirementFixer(BuildFixer): +class RequirementFixer(BuildFixer): def __init__(self, resolver): self.resolver = resolver diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 0211613..5ef2e17 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -118,6 +118,8 @@ class SetupPy(BuildSystem): def __init__(self, path): self.path = path from distutils.core import run_setup + # TODO(jelmer): Perhaps run this in session, so we can install + # missing dependencies? try: self.result = run_setup(os.path.abspath(path), stop_after="init") except RuntimeError as e: @@ -421,6 +423,10 @@ class Make(BuildSystem): self.setup(session, resolver, fixers) run_with_build_fixers(session, ["make", "all"], fixers) + def clean(self, session, resolver, fixers): + self.setup(session, resolver, fixers) + run_with_build_fixers(session, ["make", "clean"], fixers) + def test(self, session, resolver, fixers): self.setup(session, resolver, fixers) run_with_build_fixers(session, ["make", "check"], fixers) diff --git a/ognibuild/debian/apt.py b/ognibuild/debian/apt.py index 1b33327..4ff00c1 100644 --- a/ognibuild/debian/apt.py +++ b/ognibuild/debian/apt.py @@ -39,11 +39,9 @@ def run_apt(session: Session, args: List[str]) -> None: match, error = find_apt_get_failure(lines) if error is not None: raise DetailedFailure(retcode, args, error) - if match is not None: - raise UnidentifiedError(retcode, args, lines, secondary=(match.lineno, match.line)) while lines and lines[-1] == "": lines.pop(-1) - raise UnidentifiedError(retcode, args, lines) + raise UnidentifiedError(retcode, args, lines, secondary=match) class FileSearcher(object): diff --git a/ognibuild/debian/fix_build.py b/ognibuild/debian/fix_build.py index 15335f2..e6e2b2e 100644 --- a/ognibuild/debian/fix_build.py +++ b/ognibuild/debian/fix_build.py @@ -81,7 +81,7 @@ from buildlog_consultant.sbuild import ( ) from ..fix_build import BuildFixer, resolve_error, DependencyContext -from ..buildlog import UpstreamRequirementFixer +from ..buildlog import RequirementFixer from ..resolver.apt import ( AptRequirement, get_package_for_python_module, @@ -525,7 +525,7 @@ def apt_fixers(apt) -> List[BuildFixer]: SimpleBuildFixer(MissingPythonModule, fix_missing_python_module), SimpleBuildFixer(MissingPythonDistribution, fix_missing_python_distribution), SimpleBuildFixer(AptFetchFailure, retry_apt_failure), - UpstreamRequirementFixer(resolver), + RequirementFixer(resolver), ] diff --git a/ognibuild/dist.py b/ognibuild/dist.py index 87b2da0..31baf21 100644 --- a/ognibuild/dist.py +++ b/ognibuild/dist.py @@ -125,7 +125,7 @@ def create_dist_schroot( ) -> str: from .buildsystem import detect_buildsystems from .resolver.apt import AptResolver - from .buildlog import UpstreamRequirementFixer + from .buildlog import RequirementFixer if subdir is None: subdir = "package" @@ -151,7 +151,7 @@ def create_dist_schroot( buildsystems = list(detect_buildsystems(export_directory)) resolver = AptResolver.from_session(session) - fixers = [UpstreamRequirementFixer(resolver)] + fixers = [RequirementFixer(resolver)] with DistCatcher(export_directory) as dc: oldcwd = os.getcwd() diff --git a/ognibuild/fix_build.py b/ognibuild/fix_build.py index d46016d..efea8d7 100644 --- a/ognibuild/fix_build.py +++ b/ognibuild/fix_build.py @@ -89,11 +89,12 @@ def run_with_build_fixers( return match, error = find_build_failure_description(lines) if error is None: - logging.warning("Build failed with unidentified error. Giving up.") - if match is not None: - raise UnidentifiedError( - retcode, args, lines, secondary=(match.lineno, match.line)) - raise UnidentifiedError(retcode, args, lines) + if match: + logging.warning("Build failed with unidentified error:") + logging.warning('%s', match.line.rstrip('\n')) + else: + logging.warning("Build failed and unable to find cause. Giving up.") + raise UnidentifiedError(retcode, args, lines, secondary=match) logging.info("Identified error: %r", error) if error in fixed_errors: diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 44c9f27..a1d752d 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -19,10 +19,10 @@ import posixpath from typing import Optional, List, Tuple -from . import UpstreamRequirement +from . import Requirement -class PythonPackageRequirement(UpstreamRequirement): +class PythonPackageRequirement(Requirement): package: str @@ -41,7 +41,7 @@ class PythonPackageRequirement(UpstreamRequirement): return "python package: %s" % self.package -class BinaryRequirement(UpstreamRequirement): +class BinaryRequirement(Requirement): binary_name: str @@ -50,7 +50,7 @@ class BinaryRequirement(UpstreamRequirement): self.binary_name = binary_name -class PerlModuleRequirement(UpstreamRequirement): +class PerlModuleRequirement(Requirement): module: str filename: Optional[str] @@ -66,7 +66,7 @@ class PerlModuleRequirement(UpstreamRequirement): return self.module.replace("::", "/") + ".pm" -class NodePackageRequirement(UpstreamRequirement): +class NodePackageRequirement(Requirement): package: str @@ -75,7 +75,7 @@ class NodePackageRequirement(UpstreamRequirement): self.package = package -class CargoCrateRequirement(UpstreamRequirement): +class CargoCrateRequirement(Requirement): crate: str @@ -84,7 +84,7 @@ class CargoCrateRequirement(UpstreamRequirement): self.crate = crate -class PkgConfigRequirement(UpstreamRequirement): +class PkgConfigRequirement(Requirement): module: str @@ -94,7 +94,7 @@ class PkgConfigRequirement(UpstreamRequirement): self.minimum_version = minimum_version -class PathRequirement(UpstreamRequirement): +class PathRequirement(Requirement): path: str @@ -103,7 +103,7 @@ class PathRequirement(UpstreamRequirement): self.path = path -class CHeaderRequirement(UpstreamRequirement): +class CHeaderRequirement(Requirement): header: str @@ -112,14 +112,14 @@ class CHeaderRequirement(UpstreamRequirement): self.header = header -class JavaScriptRuntimeRequirement(UpstreamRequirement): +class JavaScriptRuntimeRequirement(Requirement): def __init__(self): super(JavaScriptRuntimeRequirement, self).__init__( 'javascript-runtime') -class ValaPackageRequirement(UpstreamRequirement): +class ValaPackageRequirement(Requirement): package: str @@ -128,7 +128,7 @@ class ValaPackageRequirement(UpstreamRequirement): self.package = package -class RubyGemRequirement(UpstreamRequirement): +class RubyGemRequirement(Requirement): gem: str minimum_version: Optional[str] @@ -139,7 +139,7 @@ class RubyGemRequirement(UpstreamRequirement): self.minimum_version = minimum_version -class GoPackageRequirement(UpstreamRequirement): +class GoPackageRequirement(Requirement): package: str @@ -148,7 +148,7 @@ class GoPackageRequirement(UpstreamRequirement): self.package = package -class DhAddonRequirement(UpstreamRequirement): +class DhAddonRequirement(Requirement): path: str @@ -157,7 +157,7 @@ class DhAddonRequirement(UpstreamRequirement): self.path = path -class PhpClassRequirement(UpstreamRequirement): +class PhpClassRequirement(Requirement): php_class: str @@ -166,7 +166,7 @@ class PhpClassRequirement(UpstreamRequirement): self.php_class = php_class -class RPackageRequirement(UpstreamRequirement): +class RPackageRequirement(Requirement): package: str minimum_version: Optional[str] @@ -177,7 +177,7 @@ class RPackageRequirement(UpstreamRequirement): self.minimum_version = minimum_version -class LibraryRequirement(UpstreamRequirement): +class LibraryRequirement(Requirement): library: str @@ -186,7 +186,7 @@ class LibraryRequirement(UpstreamRequirement): self.library = library -class RubyFileRequirement(UpstreamRequirement): +class RubyFileRequirement(Requirement): filename: str @@ -195,7 +195,7 @@ class RubyFileRequirement(UpstreamRequirement): self.filename = filename -class XmlEntityRequirement(UpstreamRequirement): +class XmlEntityRequirement(Requirement): url: str @@ -204,7 +204,7 @@ class XmlEntityRequirement(UpstreamRequirement): self.url = url -class SprocketsFileRequirement(UpstreamRequirement): +class SprocketsFileRequirement(Requirement): content_type: str name: str @@ -215,7 +215,7 @@ class SprocketsFileRequirement(UpstreamRequirement): self.name = name -class JavaClassRequirement(UpstreamRequirement): +class JavaClassRequirement(Requirement): classname: str @@ -224,7 +224,7 @@ class JavaClassRequirement(UpstreamRequirement): self.classname = classname -class HaskellPackageRequirement(UpstreamRequirement): +class HaskellPackageRequirement(Requirement): package: str @@ -233,7 +233,7 @@ class HaskellPackageRequirement(UpstreamRequirement): self.package = package -class MavenArtifactRequirement(UpstreamRequirement): +class MavenArtifactRequirement(Requirement): artifacts: List[Tuple[str, str, str]] @@ -242,13 +242,13 @@ class MavenArtifactRequirement(UpstreamRequirement): self.artifacts = artifacts -class GnomeCommonRequirement(UpstreamRequirement): +class GnomeCommonRequirement(Requirement): def __init__(self): super(GnomeCommonRequirement, self).__init__('gnome-common') -class JDKFileRequirement(UpstreamRequirement): +class JDKFileRequirement(Requirement): jdk_path: str filename: str @@ -263,7 +263,7 @@ class JDKFileRequirement(UpstreamRequirement): return posixpath.join(self.jdk_path, self.filename) -class PerlFileRequirement(UpstreamRequirement): +class PerlFileRequirement(Requirement): filename: str @@ -272,7 +272,7 @@ class PerlFileRequirement(UpstreamRequirement): self.filename = filename -class AutoconfMacroRequirement(UpstreamRequirement): +class AutoconfMacroRequirement(Requirement): macro: str @@ -281,7 +281,7 @@ class AutoconfMacroRequirement(UpstreamRequirement): self.macro = macro -class PythonModuleRequirement(UpstreamRequirement): +class PythonModuleRequirement(Requirement): module: str python_version: Optional[str] diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 4439bfa..17c2968 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -23,11 +23,12 @@ from ..debian.apt import AptManager from . import Resolver, UnsatisfiedRequirements from ..requirements import ( + Requirement, BinaryRequirement, CHeaderRequirement, PkgConfigRequirement, PathRequirement, - UpstreamRequirement, + Requirement, JavaScriptRuntimeRequirement, ValaPackageRequirement, RubyGemRequirement, @@ -53,9 +54,10 @@ from ..requirements import ( ) -class AptRequirement(object): +class AptRequirement(Requirement): def __init__(self, package, minimum_version=None): + super(AptRequirement, self).__init__('apt') self.package = package self.minimum_version = minimum_version @@ -493,7 +495,7 @@ APT_REQUIREMENT_RESOLVERS = [ ] -def resolve_requirement_apt(apt_mgr, req: UpstreamRequirement) -> AptRequirement: +def resolve_requirement_apt(apt_mgr, req: Requirement) -> AptRequirement: for rr_class, rr_fn in APT_REQUIREMENT_RESOLVERS: if isinstance(req, rr_class): return rr_fn(apt_mgr, req) @@ -538,5 +540,5 @@ class AptResolver(Resolver): def explain(self, requirements): raise NotImplementedError(self.explain) - def resolve(self, req: UpstreamRequirement): + def resolve(self, req: Requirement): return resolve_requirement_apt(self.apt, req)