diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index bb596b8..16ed253 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -34,6 +34,7 @@ from buildlog_consultant.common import ( MissingPerlModule, MissingXmlEntity, MissingJDKFile, + MissingJDK, MissingNodeModule, MissingPhpClass, MissingRubyGem, @@ -75,6 +76,7 @@ from .requirements import ( MavenArtifactRequirement, GnomeCommonRequirement, JDKFileRequirement, + JDKRequirement, PerlModuleRequirement, PerlFileRequirement, AutoconfMacroRequirement, @@ -129,6 +131,8 @@ def problem_to_upstream_requirement(problem): # noqa: C901 return GnomeCommonRequirement() elif isinstance(problem, MissingJDKFile): return JDKFileRequirement(problem.jdk_path, problem.filename) + elif isinstance(problem, MissingJDK): + return JDKRequirement() elif isinstance(problem, MissingGnomeCommonDependency): if problem.package == "glib-gettext": return BinaryRequirement("glib-gettextize") diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 6804b20..4611595 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -262,20 +262,51 @@ class Gradle(BuildSystem): name = "gradle" - def __init__(self, path): + def __init__(self, path, executable="gradle"): self.path = path + self.executable = executable def __repr__(self): return "%s(%r)" % (type(self).__name__, self.path) + @classmethod + def exists(cls, path): + return ( + os.path.exists(os.path.join(path, "build.gradle")) or + os.path.exists(os.path.join(path, "build.gradle.kts"))) + + @classmethod + def from_path(cls, path): + if os.path.exists(os.path.join(path, "gradlew")): + return cls(path, "./gradlew") + return cls(path) + + def setup(self, resolver): + if not self.executable.startswith('./'): + resolver.install([BinaryRequirement(self.executable)]) + def clean(self, session, resolver, fixers): - run_with_build_fixers(session, ["gradle", "clean"], fixers) + self.setup(resolver) + run_with_build_fixers(session, [self.executable, "clean"], fixers) def build(self, session, resolver, fixers): - run_with_build_fixers(session, ["gradle", "build"], fixers) + self.setup(resolver) + run_with_build_fixers(session, [self.executable, "build"], fixers) def test(self, session, resolver, fixers): - run_with_build_fixers(session, ["gradle", "test"], fixers) + self.setup(resolver) + run_with_build_fixers(session, [self.executable, "test"], fixers) + + def dist(self, session, resolver, fixers, quiet=False): + self.setup(resolver) + run_with_build_fixers(session, [self.executable, "distTar"], fixers) + + def install(self, session, resolver, fixers, install_target): + raise NotImplementedError + self.setup(resolver) + # TODO(jelmer): installDist just creates files under build/install/... + run_with_build_fixers( + session, [self.executable, "installDist"], fixers) class Meson(BuildSystem): @@ -733,9 +764,9 @@ def detect_buildsystems(path, trust_package=False): # noqa: C901 logging.debug("Found Cargo.toml, assuming rust cargo package.") yield Cargo("Cargo.toml") - if os.path.exists(os.path.join(path, "build.gradle")): + if Gradle.exists(path): logging.debug("Found build.gradle, assuming gradle package.") - yield Gradle("build.gradle") + yield Gradle.from_path(path) if os.path.exists(os.path.join(path, "meson.build")): logging.debug("Found meson.build, assuming meson package.") diff --git a/ognibuild/fix_build.py b/ognibuild/fix_build.py index d7dca7f..abbebc1 100644 --- a/ognibuild/fix_build.py +++ b/ognibuild/fix_build.py @@ -66,9 +66,10 @@ def run_with_build_fixers(session: Session, args: List[str], fixers: List[BuildF logging.info("Running %r", args) fixed_errors = [] while True: - retcode, lines = run_with_tee(session, args) + retcode, contents = run_with_tee(session, args) if retcode == 0: return + lines = ''.join(contents).splitlines(True) match, error = find_build_failure_description(lines) if error is None: if match: diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index e0ad842..c131f67 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -334,6 +334,12 @@ class JDKFileRequirement(Requirement): return posixpath.join(self.jdk_path, self.filename) +class JDKRequirement(Requirement): + + def __init__(self): + super(JDKRequirement, self).__init__("jdk") + + class PerlFileRequirement(Requirement): filename: str diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 7969786..3d1679e 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -50,6 +50,7 @@ from ..requirements import ( MavenArtifactRequirement, GnomeCommonRequirement, JDKFileRequirement, + JDKRequirement, PerlModuleRequirement, PerlFileRequirement, AutoconfMacroRequirement, @@ -444,6 +445,10 @@ def resolve_jdk_file_req(apt_mgr, req): return None +def resolve_jdk_req(apt_mgr, req): + return AptRequirement.simple('default-jdk') + + def resolve_perl_module_req(apt_mgr, req): DEFAULT_PERL_PATHS = ["/usr/share/perl5"] @@ -547,6 +552,7 @@ APT_REQUIREMENT_RESOLVERS = [ (MavenArtifactRequirement, resolve_maven_artifact_req), (GnomeCommonRequirement, resolve_gnome_common_req), (JDKFileRequirement, resolve_jdk_file_req), + (JDKRequirement, resolve_jdk_req), (PerlModuleRequirement, resolve_perl_module_req), (PerlFileRequirement, resolve_perl_file_req), (AutoconfMacroRequirement, resolve_autoconf_macro_req),