diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 5291b4f..2b47cc0 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -258,6 +258,59 @@ class SetupPy(BuildSystem): yield PythonPackageOutput(package, python_version="cpython3") +class Gradle(BuildSystem): + + name = "gradle" + + def __init__(self, path): + self.path = path + + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.path) + + def clean(self, session, resolver, fixers): + run_with_build_fixers(session, ["gradle", "clean"], fixers) + + def build(self, session, resolver, fixers): + run_with_build_fixers(session, ["gradle", "build"], fixers) + + def test(self, session, resolver, fixers): + run_with_build_fixers(session, ["gradle", "test"], fixers) + + +class Meson(BuildSystem): + + name = "meson" + + def __init__(self, path): + self.path = path + + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.path) + + def _setup(self, session, fixers): + if session.exists("build"): + return + session.mkdir("build") + run_with_build_fixers(session, ["meson", "setup", "build"], fixers) + + def clean(self, session, resolver, fixers): + self._setup(session, fixers) + run_with_build_fixers(session, ["ninja", "-C", "build", "clean"], fixers) + + def build(self, session, resolver, fixers): + self._setup(session, fixers) + run_with_build_fixers(session, ["ninja", "-C", "build"], fixers) + + def test(self, session, resolver, fixers): + self._setup(session, fixers) + run_with_build_fixers(session, ["ninja", "-C", "build", "test"], fixers) + + def install(self, session, resolver, fixers, install_target): + self._setup(session, fixers) + run_with_build_fixers(session, ["ninja", "-C", "build", "install"], fixers) + + class PyProject(BuildSystem): name = "pyproject" @@ -266,6 +319,9 @@ class PyProject(BuildSystem): self.path = path self.pyproject = self.load_toml() + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.path) + def load_toml(self): import toml @@ -589,10 +645,13 @@ class Golang(BuildSystem): return "%s()" % (type(self).__name__) def test(self, session, resolver, fixers): - session.check_call(["go", "test"]) + run_with_build_fixers(session, ["go", "test"], fixers) def build(self, session, resolver, fixers): - session.check_call(["go", "build"]) + run_with_build_fixers(session, ["go", "build"], fixers) + + def install(self, session, resolver, fixers): + run_with_build_fixers(session, ["go", "install"], fixers) def clean(self, session, resolver, fixers): session.check_call(["go", "clean"]) @@ -665,6 +724,14 @@ 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")): + logging.debug("Found build.gradle, assuming gradle package.") + yield Gradle("build.gradle") + + if os.path.exists(os.path.join(path, "meson.build")): + logging.debug("Found meson.build, assuming meson package.") + yield Meson("meson.build") + if os.path.exists(os.path.join(path, "Setup.hs")): logging.debug("Found Setup.hs, assuming haskell package.") yield Cabal("Setup.hs") diff --git a/ognibuild/resolver/__init__.py b/ognibuild/resolver/__init__.py index 0bd5c24..741144c 100644 --- a/ognibuild/resolver/__init__.py +++ b/ognibuild/resolver/__init__.py @@ -119,6 +119,33 @@ class PypiResolver(Resolver): raise NotImplementedError(self.explain) +class GoResolver(Resolver): + + def __init__(self, session): + self.session = session + + def __str__(self): + return "go" + + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.session) + + def install(self, requirements): + from ..requirements import GoPackageRequirement + + missing = [] + for requirement in requirements: + if not isinstance(requirement, GoPackageRequirement): + missing.append(requirement) + continue + self.session.check_call(["go", "get", requirement.package]) + if missing: + raise UnsatisfiedRequirements(missing) + + def explain(self, requirements): + raise NotImplementedError(self.explain) + + NPM_COMMAND_PACKAGES = { "del-cli": "del-cli", } @@ -175,15 +202,17 @@ class StackedResolver(Resolver): return +NATIVE_RESOLVER_CLS = [ + CPANResolver, + PypiResolver, + NpmResolver, + GoResolver, + HackageResolver, + ] + + def native_resolvers(session): - return StackedResolver( - [ - CPANResolver(session), - PypiResolver(session), - NpmResolver(session), - HackageResolver(session), - ] - ) + return StackedResolver([kls(session) for kls in NATIVE_RESOLVER_CLS]) class ExplainResolver(Resolver): @@ -207,12 +236,5 @@ def auto_resolver(session): resolvers = [] if isinstance(session, SchrootSession) or user == "root": resolvers.append(AptResolver.from_session(session)) - resolvers.extend( - [ - CPANResolver(session), - PypiResolver(session), - NpmResolver(session), - HackageResolver(session), - ] - ) + resolvers.extend([kls(session) for kls in NATIVE_RESOLVER_CLS]) return StackedResolver(resolvers)