From f7a258a510e2253b51ab2ade03e84e93a2e3e757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 9 Apr 2021 17:37:08 +0100 Subject: [PATCH 01/28] Try even harder. --- ognibuild/buildlog.py | 4 ++++ ognibuild/buildsystem.py | 17 ++++++++++------- ognibuild/requirements.py | 12 ++++++++++++ ognibuild/resolver/apt.py | 23 +++++++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index e3110ee..9c5b204 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -64,6 +64,7 @@ from buildlog_consultant.common import ( MissingPerlPredeclared, MissingLatexFile, MissingCargoCrate, + MissingStaticLibrary, ) from buildlog_consultant.apt import UnsatisfiedAptDependencies @@ -108,6 +109,7 @@ from .requirements import ( PerlPreDeclaredRequirement, LatexPackageRequirement, CargoCrateRequirement, + StaticLibraryRequirement, ) from .resolver import UnsatisfiedRequirements @@ -139,6 +141,8 @@ def problem_to_upstream_requirement(problem): # noqa: C901 return RPackageRequirement(problem.package, problem.minimum_version) elif isinstance(problem, MissingNodeModule): return NodeModuleRequirement(problem.module) + elif isinstance(problem, MissingStaticLibrary): + return StaticLibraryRequirement(problem.library, problem.filename) elif isinstance(problem, MissingNodePackage): return NodePackageRequirement(problem.package) elif isinstance(problem, MissingLatexFile): diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 07562df..5af9d72 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1473,13 +1473,16 @@ class PerlBuildTiny(BuildSystem): def get_declared_dependencies(self, session, fixers=None): self.setup(session, fixers) - try: - run_with_build_fixers(session, ["./Build", "distmeta"], fixers) - except UnidentifiedError as e: - if "No such action 'distmeta'" in e.lines: - pass - else: - raise + if self.minilla: + pass # Minilla doesn't seem to have a way to just regenerate the metadata :( + else: + try: + run_with_build_fixers(session, ["./Build", "distmeta"], fixers) + except UnidentifiedError as e: + if "No such action 'distmeta'" in e.lines: + pass + else: + raise try: with open(os.path.join(self.path, 'META.yml'), 'r') as f: yield from _declared_deps_from_meta_yml(f) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 858ad09..60c6d9a 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -460,6 +460,18 @@ class LibraryRequirement(Requirement): self.library = library + +class StaticLibraryRequirement(Requirement): + + library: str + filename: str + + def __init__(self, library: str, filename: str): + super(StaticLibraryRequirement, self).__init__("static-lib") + self.library = library + self.filename = filename + + class RubyFileRequirement(Requirement): filename: str diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index cc2177b..b9b23d0 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -47,6 +47,7 @@ from ..requirements import ( NodeModuleRequirement, NodePackageRequirement, LibraryRequirement, + StaticLibraryRequirement, RubyFileRequirement, XmlEntityRequirement, SprocketsFileRequirement, @@ -335,6 +336,19 @@ def resolve_vague_dep_req(apt_mgr, req): options.append(AptRequirement.simple(vague_map[name], minimum_version=req.minimum_version)) for x in req.expand(): options.extend(resolve_requirement_apt(apt_mgr, x)) + # Try even harder + if not options: + options.extend(find_reqs_simple( + apt_mgr, + [ + posixpath.join("/usr/lib", ".*", "pkgconfig", re.escape(req.module) + ".*\\.pc"), + posixpath.join("/usr/lib/pkgconfig", re.escape(req.module) + "-.*\\.pc") + ], + regex=True, + case_insensitive=True, + minimum_version=req.minimum_version + )) + return options @@ -469,6 +483,14 @@ def resolve_library_req(apt_mgr, req): return find_reqs_simple(apt_mgr, paths, regex=True) +def resolve_static_library_req(apt_mgr, req): + paths = [ + posixpath.join("/usr/lib/%s$" % re.escape(req.filename)), + posixpath.join("/usr/lib/.*/%s$" % re.escape(req.filename)), + ] + return find_reqs_simple(apt_mgr, paths, regex=True) + + def resolve_ruby_file_req(apt_mgr, req): paths = [posixpath.join("/usr/lib/ruby/vendor_ruby/%s.rb" % req.filename)] reqs = find_reqs_simple(apt_mgr, paths, regex=False) @@ -697,6 +719,7 @@ APT_REQUIREMENT_RESOLVERS = [ (NodeModuleRequirement, resolve_node_module_req), (NodePackageRequirement, resolve_node_package_req), (LibraryRequirement, resolve_library_req), + (StaticLibraryRequirement, resolve_static_library_req), (RubyFileRequirement, resolve_ruby_file_req), (XmlEntityRequirement, resolve_xml_entity_req), (SprocketsFileRequirement, resolve_sprockets_file_req), From 8eee4cf2d4c13afb1107e45dd4f273a067986b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 9 Apr 2021 17:54:42 +0100 Subject: [PATCH 02/28] Fix typo. --- ognibuild/resolver/apt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index b9b23d0..0fe06dc 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -341,8 +341,8 @@ def resolve_vague_dep_req(apt_mgr, req): options.extend(find_reqs_simple( apt_mgr, [ - posixpath.join("/usr/lib", ".*", "pkgconfig", re.escape(req.module) + ".*\\.pc"), - posixpath.join("/usr/lib/pkgconfig", re.escape(req.module) + "-.*\\.pc") + posixpath.join("/usr/lib", ".*", "pkgconfig", re.escape(req.name) + ".*\\.pc"), + posixpath.join("/usr/lib/pkgconfig", re.escape(req.name) + "-.*\\.pc") ], regex=True, case_insensitive=True, From 51bc44dee662c2d52263f42191a8233261ceed80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 9 Apr 2021 17:56:29 +0100 Subject: [PATCH 03/28] Add missing dash. --- ognibuild/resolver/apt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 0fe06dc..ea2825f 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -341,7 +341,7 @@ def resolve_vague_dep_req(apt_mgr, req): options.extend(find_reqs_simple( apt_mgr, [ - posixpath.join("/usr/lib", ".*", "pkgconfig", re.escape(req.name) + ".*\\.pc"), + posixpath.join("/usr/lib", ".*", "pkgconfig", re.escape(req.name) + "-.*\\.pc"), posixpath.join("/usr/lib/pkgconfig", re.escape(req.name) + "-.*\\.pc") ], regex=True, From 90d6120e81a10f7f856d913d5dcba7c9a2140c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 9 Apr 2021 18:20:41 +0100 Subject: [PATCH 04/28] Handle ninja dist not working. --- ognibuild/buildsystem.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 5af9d72..d1ebf94 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -764,7 +764,12 @@ class Meson(BuildSystem): def dist(self, session, resolver, fixers, target_directory, quiet=False): self._setup(session, fixers) with DistCatcher([session.external_path("build/meson-dist")]) as dc: - run_with_build_fixers(session, ["ninja", "-C", "build", "dist"], fixers) + try: + run_with_build_fixers(session, ["ninja", "-C", "build", "dist"], fixers) + except UnidentifiedError as e: + if "ninja: error: unknown target 'dist', did you mean 'dino'?" in e.lines: + raise NotImplementedError + raise return dc.copy_single(target_directory) def test(self, session, resolver, fixers): From 3658f6e0ecf7a7fbb13e7c5d8e383ffd1f028d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 9 Apr 2021 19:51:04 +0100 Subject: [PATCH 05/28] Improve make handling. --- ognibuild/buildsystem.py | 41 ++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index d1ebf94..791fd2b 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1079,45 +1079,58 @@ class Make(BuildSystem): def build(self, session, resolver, fixers): self.setup(session, resolver, fixers) - run_with_build_fixers(session, ["make", "all"], fixers) + self._run_make(session, ["all"], fixers) def clean(self, session, resolver, fixers): self.setup(session, resolver, fixers) - run_with_build_fixers(session, ["make", "clean"], fixers) + self._run_make(session, ["clean"], fixers) + + def _run_make(self, session, args, fixers): + try: + run_with_build_fixers(session, ["make"] + args, fixers) + except UnidentifiedError as e: + if len(e.lines) < 5 and any([line.startswith("Run ./configure") for line in e.lines]): + run_with_build_fixers(session, ["./configure"], fixers) + run_with_build_fixers(session, ["make"] + args, fixers) + elif ( + "Reconfigure the source tree " + "(via './config' or 'perl Configure'), please." + ) in e.lines: + run_with_build_fixers(session, ["./config"], fixers) + run_with_build_fixers(session, ["make"] + args, fixers) + elif "Please run ./configure first" in e.lines: + run_with_build_fixers(session, ["./configure"], fixers) + run_with_build_fixers(session, ["make"] + args, fixers) + else: + raise + def test(self, session, resolver, fixers): self.setup(session, resolver, fixers) - run_with_build_fixers(session, ["make", "check"], fixers) + self._run_make(session, ["check"], fixers) def install(self, session, resolver, fixers, install_target): self.setup(session, resolver, fixers) - run_with_build_fixers(session, ["make", "install"], fixers) + self._run_make(session, ["install"], fixers) def dist(self, session, resolver, fixers, target_directory, quiet=False): self.setup(session, resolver, fixers) with DistCatcher.default(session.external_path(".")) as dc: try: - run_with_build_fixers(session, ["make", "dist"], fixers) + self._run_make(session, ["dist"], fixers) except UnidentifiedError as e: if "make: *** No rule to make target 'dist'. Stop." in e.lines: raise NotImplementedError elif "make[1]: *** No rule to make target 'dist'. Stop." in e.lines: raise NotImplementedError - elif ( - "Reconfigure the source tree " - "(via './config' or 'perl Configure'), please." - ) in e.lines: - run_with_build_fixers(session, ["./config"], fixers) - run_with_build_fixers(session, ["make", "dist"], fixers) + elif "ninja: error: unknown target 'dist', did you mean 'dino'?" in e.lines: + raise NotImplementedError elif ( "Please try running 'make manifest' and then run " "'make dist' again." in e.lines ): run_with_build_fixers(session, ["make", "manifest"], fixers) run_with_build_fixers(session, ["make", "dist"], fixers) - elif "Please run ./configure first" in e.lines: - run_with_build_fixers(session, ["./configure"], fixers) - run_with_build_fixers(session, ["make", "dist"], fixers) elif any( [ re.match( From 6f4e571e2f9475ee123683c99e301853d7e87192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 18:25:10 +0100 Subject: [PATCH 06/28] Add convenience flags --apt and --native. --- ognibuild/__main__.py | 14 +++++++++++++- ognibuild/debian/fix_build.py | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index 0de3307..2307475 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -106,6 +106,12 @@ def main(): # noqa: C901 default="auto", help="What to do about missing dependencies", ) + parser.add_argument( + '--apt', help=argparse.SUPPRESS, + dest='resolve', action='store_const', const='apt') + parser.add_argument( + '--native', help=argparse.SUPPRESS, + dest='native', action='store_const', const='native') parser.add_argument( "--explain", action="store_true", @@ -124,6 +130,8 @@ def main(): # noqa: C901 subparsers.add_parser("clean") subparsers.add_parser("test") subparsers.add_parser("info") + exec_parser = subparsers.add_parser("exec") + exec_parser.add_argument('subargv', nargs=argparse.REMAINDER, help='Command to run.') install_parser = subparsers.add_parser("install") install_parser.add_argument( "--user", action="store_true", help="Install in local-user directories." @@ -161,10 +169,14 @@ def main(): # noqa: C901 elif args.resolve == "auto": resolver = auto_resolver(session, explain=args.explain) logging.info("Using requirement resolver: %s", resolver) + fixers = determine_fixers(session, resolver, explain=args.explain) try: + if args.subcommand == "exec": + from .fix_build import run_with_build_fixers + run_with_build_fixers(session, args.subargv, fixers) + return 0 bss = list(detect_buildsystems(args.directory)) logging.info("Detected buildsystems: %s", ", ".join(map(str, bss))) - fixers = determine_fixers(session, resolver, explain=args.explain) if not args.ignore_declared_dependencies: stages = STAGE_MAP[args.subcommand] if stages: diff --git a/ognibuild/debian/fix_build.py b/ognibuild/debian/fix_build.py index 2b998df..1ef9b12 100644 --- a/ognibuild/debian/fix_build.py +++ b/ognibuild/debian/fix_build.py @@ -433,7 +433,7 @@ def fix_missing_makefile_pl(error, phase, context): return False -def coerce_unaccpetable_predicate(error, phase, context): +def coerce_unacceptable_predicate(error, phase, context): from debmutate.debcargo import DebcargoEditor with DebcargoEditor(context.abspath('debian/debcargo.toml')) as editor: editor['allow_prerelease_deps'] = True @@ -492,7 +492,7 @@ def versioned_package_fixers(session, packaging_context, apt): packaging_context, MissingConfigStatusInput, fix_missing_config_status_input ), SimpleBuildFixer(packaging_context, MissingPerlFile, fix_missing_makefile_pl), - SimpleBuildFixer(packaging_context, DebcargoUnacceptablePredicate, coerce_unaccpetable_predicate), + SimpleBuildFixer(packaging_context, DebcargoUnacceptablePredicate, coerce_unacceptable_predicate), ] From 205a929b90003a7263da1ddc5729ba80cc3a4166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 18:25:34 +0100 Subject: [PATCH 07/28] Try harder to find perl modules. --- ognibuild/resolver/apt.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index ea2825f..874eb72 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -608,18 +608,22 @@ def resolve_libtool_req(apt_mgr, req): def resolve_perl_module_req(apt_mgr, req): - DEFAULT_PERL_PATHS = ["/usr/share/perl5"] + DEFAULT_PERL_PATHS = ["/usr/share/perl5", "/usr/lib/.*/perl5/.*"] if req.inc is None: if req.filename is None: - paths = [posixpath.join(inc, req.relfilename) for inc in DEFAULT_PERL_PATHS] + paths = [posixpath.join(inc, re.escape(req.module.replace('::', '/') + '.pm')) for inc in DEFAULT_PERL_PATHS] + regex = True elif not posixpath.isabs(req.filename): - return False + paths = [posixpath.join(inc, re.escape(req.filename)) for inc in DEFAULT_PERL_PATHS] + regex = True else: paths = [req.filename] + regex = False else: + regex = False paths = [posixpath.join(inc, req.filename) for inc in req.inc] - return find_reqs_simple(apt_mgr, paths, regex=False) + return find_reqs_simple(apt_mgr, paths, regex=regex) def resolve_perl_file_req(apt_mgr, req): From 64b0c5816a198d8be3ed440ec480f7d34db1ca01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 18:33:18 +0100 Subject: [PATCH 08/28] Allow 'minil dist' to return 0 when it failed. --- ognibuild/buildsystem.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 791fd2b..62ccfd9 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -24,7 +24,7 @@ import shlex from typing import Optional, Tuple import warnings -from . import shebang_binary, UnidentifiedError +from . import shebang_binary, UnidentifiedError, DetailedFailure from .dist_catcher import DistCatcher from .outputs import ( BinaryOutput, @@ -44,7 +44,7 @@ from .requirements import ( GoRequirement, GoPackageRequirement, ) -from .fix_build import run_with_build_fixers +from .fix_build import run_with_build_fixers, find_build_failure_description from .session import which @@ -1468,7 +1468,14 @@ class PerlBuildTiny(BuildSystem): self.setup(session, fixers) with DistCatcher([session.external_path('.')]) as dc: if self.minilla: - run_with_build_fixers(session, ["minil", "dist"], fixers) + lines = run_with_build_fixers(session, ["minil", "dist"], fixers) + # minil seems to return 0 even if it didn't produce a tarball :( + if not dc.find_files(): + match, error = find_build_failure_description(lines) + if error: + raise DetailedFailure(0, ["minil", "dist"], error) + else: + raise UnidentifiedError(0, ["minil", "dist"], lines, match) else: try: run_with_build_fixers(session, ["./Build", "dist"], fixers) From 58917e6cd233cf59226df1b87425a7c20292b6db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 18:51:03 +0100 Subject: [PATCH 09/28] Convert to perl module. --- ognibuild/buildlog.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index 9c5b204..e366d3e 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -189,7 +189,11 @@ def problem_to_upstream_requirement(problem): # noqa: C901 elif isinstance(problem, UnknownCertificateAuthority): return CertificateAuthorityRequirement(problem.url) elif isinstance(problem, MissingPerlPredeclared): - return PerlPreDeclaredRequirement(problem.name) + ret = PerlPreDeclaredRequirement(problem.name) + try: + return ret.lookup_module() + except KeyError: + return ret elif isinstance(problem, MissingCargoCrate): # TODO(jelmer): handle problem.requirements return CargoCrateRequirement(problem.crate) From 8c297cef6fd48c3e96297ea86e0a53b3a435fbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 19:47:54 +0100 Subject: [PATCH 10/28] Fix iteration. --- ognibuild/buildsystem.py | 10 +++------- ognibuild/fix_build.py | 7 +++++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 62ccfd9..adb0da9 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1468,14 +1468,10 @@ class PerlBuildTiny(BuildSystem): self.setup(session, fixers) with DistCatcher([session.external_path('.')]) as dc: if self.minilla: - lines = run_with_build_fixers(session, ["minil", "dist"], fixers) # minil seems to return 0 even if it didn't produce a tarball :( - if not dc.find_files(): - match, error = find_build_failure_description(lines) - if error: - raise DetailedFailure(0, ["minil", "dist"], error) - else: - raise UnidentifiedError(0, ["minil", "dist"], lines, match) + run_with_build_fixers( + session, ["minil", "dist"], fixers, + check_success=lambda retcode, lines: bool(dc.find_files())) else: try: run_with_build_fixers(session, ["./Build", "dist"], fixers) diff --git a/ognibuild/fix_build.py b/ognibuild/fix_build.py index 90d67a2..4863375 100644 --- a/ognibuild/fix_build.py +++ b/ognibuild/fix_build.py @@ -44,14 +44,17 @@ class BuildFixer(object): return self._fix(problem, phase) -def run_detecting_problems(session: Session, args: List[str], **kwargs): +def run_detecting_problems(session: Session, args: List[str], check_success=None, **kwargs): + if check_success is None: + def check_success(retcode, contents): + return (retcode == 0) try: retcode, contents = run_with_tee(session, args, **kwargs) except FileNotFoundError: error = MissingCommand(args[0]) retcode = 1 else: - if retcode == 0: + if check_success(retcode, contents): return contents lines = "".join(contents).splitlines(False) match, error = find_build_failure_description(lines) From 1fdc98aa82105307302677b10040b10d2cd1c2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 13 Apr 2021 19:48:18 +0100 Subject: [PATCH 11/28] Fix import. --- ognibuild/buildsystem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index adb0da9..b865ced 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -24,7 +24,7 @@ import shlex from typing import Optional, Tuple import warnings -from . import shebang_binary, UnidentifiedError, DetailedFailure +from . import shebang_binary, UnidentifiedError from .dist_catcher import DistCatcher from .outputs import ( BinaryOutput, @@ -1495,7 +1495,7 @@ class PerlBuildTiny(BuildSystem): def get_declared_dependencies(self, session, fixers=None): self.setup(session, fixers) if self.minilla: - pass # Minilla doesn't seem to have a way to just regenerate the metadata :( + pass # Minilla doesn't seem to have a way to just regenerate the metadata :( else: try: run_with_build_fixers(session, ["./Build", "distmeta"], fixers) From f40308f494fb701958e599f4582514ce9bcaf9bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Tue, 2 Mar 2021 17:54:36 +0000 Subject: [PATCH 12/28] Release 0.0.1. From bad2ac3d552398853e9828009059ed0da63f4dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sat, 27 Mar 2021 14:25:37 +0000 Subject: [PATCH 13/28] Release 0.0.3. From df41f85f9edffa4723bba86fb0c0318c49e24b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 16 Apr 2021 17:30:00 +0000 Subject: [PATCH 14/28] Improve perl handling. --- ognibuild/buildsystem.py | 14 +++++++++++--- ognibuild/resolver/__init__.py | 2 +- ognibuild/resolver/apt.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index b865ced..060a304 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1033,10 +1033,17 @@ def _declared_deps_from_meta_yml(f): class Make(BuildSystem): - name = "make" - def __init__(self, path): self.path = path + if os.path.exists(os.path.join(path, 'Makefile.PL')): + self.name = 'makefile.pl' + elif os.path.exists(os.path.join(path, 'Makefile.am')): + self.name = 'automake' + elif any([os.path.exists(os.path.join(path, n)) + for n in ['configure.ac', 'configure.in', 'autogen.sh']]): + self.name = 'autoconf' + else: + self.name = "make" def __repr__(self): return "%s(%r)" % (type(self).__name__, self.path) @@ -1104,7 +1111,6 @@ class Make(BuildSystem): else: raise - def test(self, session, resolver, fixers): self.setup(session, resolver, fixers) self._run_make(session, ["check"], fixers) @@ -1502,6 +1508,8 @@ class PerlBuildTiny(BuildSystem): except UnidentifiedError as e: if "No such action 'distmeta'" in e.lines: pass + if "Do not run distmeta. Install Minilla and `minil install` instead." in e.lines: + self.minilla = True else: raise try: diff --git a/ognibuild/resolver/__init__.py b/ognibuild/resolver/__init__.py index 5402454..7af26d5 100644 --- a/ognibuild/resolver/__init__.py +++ b/ognibuild/resolver/__init__.py @@ -18,7 +18,7 @@ import logging import subprocess -from .. import UnidentifiedError +from .. import UnidentifiedError from ..fix_build import run_detecting_problems diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index 874eb72..da19d7e 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -608,7 +608,7 @@ def resolve_libtool_req(apt_mgr, req): def resolve_perl_module_req(apt_mgr, req): - DEFAULT_PERL_PATHS = ["/usr/share/perl5", "/usr/lib/.*/perl5/.*"] + DEFAULT_PERL_PATHS = ["/usr/share/perl5", "/usr/lib/.*/perl5/.*", "/usr/lib/.*/perl-base"] if req.inc is None: if req.filename is None: From ed9488753655632790ff05ca435a0c0baa9cfeba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Wed, 14 Apr 2021 18:30:14 +0100 Subject: [PATCH 15/28] Allow leading lib.. --- ognibuild/requirements.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 60c6d9a..8486d11 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -177,7 +177,11 @@ class VagueDependencyRequirement(Requirement): from .resolver.apt import AptRequirement yield AptRequirement.simple(self.name.lower(), minimum_version=self.minimum_version) - yield AptRequirement.simple('lib%s-dev' % self.name.lower(), minimum_version=self.minimum_version) + if self.name.lower().startswith('lib'): + devname = '%s-dev' % self.name.lower() + else: + devname = 'lib%s-dev' % self.name.lower() + yield AptRequirement.simple(devname, minimum_version=self.minimum_version) def met(self, session): for x in self.expand(): From 3cc91b8cb0a7e0a7b0499662ed5e79f2fc754bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Wed, 14 Apr 2021 19:03:23 +0100 Subject: [PATCH 16/28] Handle boost component requirement. --- ognibuild/buildlog.py | 4 ++++ ognibuild/requirements.py | 9 +++++++++ ognibuild/resolver/apt.py | 8 ++++++++ 3 files changed, 21 insertions(+) diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index e366d3e..037f2c9 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -48,6 +48,7 @@ from buildlog_consultant.common import ( MissingRubyFile, MissingAutoconfMacro, MissingValaPackage, + MissingBoostComponents, MissingXfceDependency, MissingHaskellDependencies, MissingVagueDependency, @@ -90,6 +91,7 @@ from .requirements import ( CMakefileRequirement, HaskellPackageRequirement, MavenArtifactRequirement, + BoostComponentRequirement, GnomeCommonRequirement, JDKFileRequirement, JDKRequirement, @@ -133,6 +135,8 @@ def problem_to_upstream_requirement(problem): # noqa: C901 return ValaPackageRequirement(problem.package) elif isinstance(problem, MissingGoPackage): return GoPackageRequirement(problem.package) + elif isinstance(problem, MissingBoostComponents): + return [BoostComponentRequirement(name) for name in problem.components] elif isinstance(problem, DhAddonLoadFailure): return DhAddonRequirement(problem.path) elif isinstance(problem, MissingPhpClass): diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 8486d11..b3650c8 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -690,3 +690,12 @@ class PythonModuleRequirement(Requirement): return "%s(%r, python_version=%r, minimum_version=%r)" % ( type(self).__name__, self.module, self.python_version, self.minimum_version) + + +class BoostComponentRequirement(Requirement): + + name: str + + def __init__(self, name): + super(BoostComponentRequirement, self).__init__("boost-component") + self.name = name diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index da19d7e..a798a8d 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -47,6 +47,7 @@ from ..requirements import ( NodeModuleRequirement, NodePackageRequirement, LibraryRequirement, + BoostComponentRequirement, StaticLibraryRequirement, RubyFileRequirement, XmlEntityRequirement, @@ -703,6 +704,12 @@ def resolve_apt_req(apt_mgr, req): return [req] +def resolve_boost_component_req(apt_mgr, req): + return find_reqs_simple( + apt_mgr, ["/usr/lib/.*/libboost_%s" % re.escape(req.name)], + regex=True) + + APT_REQUIREMENT_RESOLVERS = [ (AptRequirement, resolve_apt_req), (BinaryRequirement, resolve_binary_req), @@ -746,6 +753,7 @@ APT_REQUIREMENT_RESOLVERS = [ (CertificateAuthorityRequirement, resolve_ca_req), (CargoCrateRequirement, resolve_cargo_crate_req), (IntrospectionTypelibRequirement, resolve_introspection_typelib_req), + (BoostComponentRequirement, resolve_boost_component_req), ] From c2838029b59b6e07bf5305a6e986b1ce211fc757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Thu, 22 Apr 2021 16:13:11 +0100 Subject: [PATCH 17/28] cope with missing version tag. --- ognibuild/buildsystem.py | 3 ++- ognibuild/requirements.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 060a304..d34001b 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1373,10 +1373,11 @@ class Maven(BuildSystem): deps_tag = root.find("dependencies") if deps_tag: for dep in deps_tag.findall("dependency"): + version_tag = dep.find("version") yield "core", MavenArtifactRequirement( dep.find("groupId").text, dep.find("artifactId").text, - dep.find("version").text, + version_tag.text if version_tag else None, ) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index b3650c8..8f29ae6 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -213,10 +213,12 @@ class PerlPreDeclaredRequirement(Requirement): KNOWN_MODULES = { 'auto_set_repository': 'Module::Install::Repository', 'author_tests': 'Module::Install::AuthorTests', + 'author_requires': 'Module::Install::AuthorRequires', 'readme_from': 'Module::Install::ReadmeFromPod', 'catalyst': 'Module::Install::Catalyst', 'githubmeta': 'Module::Install::GithubMeta', 'use_ppport': 'Module::Install::XSUtil', + 'pod_from': 'Module::Install::PodFromEuclid', } def __init__(self, name): From 3200b7b39e87aed923d5868d6ab37d8518c2f32a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 23 Apr 2021 17:51:10 +0100 Subject: [PATCH 18/28] Add extra predeclared. --- ognibuild/requirements.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 8f29ae6..8f04bb1 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -219,6 +219,10 @@ class PerlPreDeclaredRequirement(Requirement): 'githubmeta': 'Module::Install::GithubMeta', 'use_ppport': 'Module::Install::XSUtil', 'pod_from': 'Module::Install::PodFromEuclid', + 'write_doap_changes': 'Module::Install::DOAPChangeSets', + 'use_test_base': 'Module::Install::TestBase', + 'jsonmeta': 'Module::Install::JSONMETA', + 'extra_tests': 'Module::Install::ExtraTests', } def __init__(self, name): From f1902098d142cfff4a86821f1389d5664c1a3425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 23 Apr 2021 19:37:40 +0100 Subject: [PATCH 19/28] Add another predeclared. --- ognibuild/requirements.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 8f04bb1..f3c0858 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -213,6 +213,7 @@ class PerlPreDeclaredRequirement(Requirement): KNOWN_MODULES = { 'auto_set_repository': 'Module::Install::Repository', 'author_tests': 'Module::Install::AuthorTests', + 'recursive_author_tests': 'Module::Install::AuthorTests', 'author_requires': 'Module::Install::AuthorRequires', 'readme_from': 'Module::Install::ReadmeFromPod', 'catalyst': 'Module::Install::Catalyst', @@ -223,6 +224,7 @@ class PerlPreDeclaredRequirement(Requirement): 'use_test_base': 'Module::Install::TestBase', 'jsonmeta': 'Module::Install::JSONMETA', 'extra_tests': 'Module::Install::ExtraTests', + 'auto_set_bugtracker': 'Module::Install::Bugtracker', } def __init__(self, name): From e1c5258bca218b9d6cdcd02c8459006132d589a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 23 Apr 2021 19:55:08 +0100 Subject: [PATCH 20/28] Allow None. --- ognibuild/buildsystem.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index d34001b..7b0bd10 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1022,11 +1022,11 @@ def _declared_deps_from_meta_yml(f): except ruamel.yaml.reader.ReaderError as e: warnings.warn("Unable to parse META.yml: %s" % e) return - for require in data.get("requires", []): + for require in data.get("requires", None) or []: yield "core", PerlModuleRequirement(require) - for require in data.get("build_requires", []): + for require in data.get("build_requires", None) or []: yield "build", PerlModuleRequirement(require) - for require in data.get("configure_requires", []): + for require in data.get("configure_requires", None) or []: yield "build", PerlModuleRequirement(require) # TODO(jelmer): recommends From 126d06c332478a1c4e16556b1a0d9fca3d19b6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 25 Apr 2021 13:32:32 +0100 Subject: [PATCH 21/28] Add really basic Bazel support. --- README.md | 1 + ognibuild/buildsystem.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/README.md b/README.md index 24951b2..5374ac2 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ issues (or lack of support for a particular ecosystem), please file a bug. ### Supported Build Systems +- Bazel - Cabal - Cargo - Golang diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 7b0bd10..113ea41 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -544,6 +544,35 @@ class SetupPy(BuildSystem): return cls(path) +class Bazel(BuildSystem): + + name = "bazel" + + def __init__(self, path): + self.path = path + + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.path) + + @classmethod + def exists(cls, path): + if not os.path.exists(os.path.join(path, "BUILD")): + return False + return True + + @classmethod + def probe(cls, path): + if cls.exists(path): + logging.debug("Found BUILD, assuming bazel package.") + return cls(path) + + def build(self, session, resolver, fixers): + run_with_build_fixers(session, ["bazel", "build", "//..."], fixers) + + def test(self, session, resolver, fixers): + run_with_build_fixers(session, ["bazel", "test", "//..."], fixers) + + class Octave(BuildSystem): name = "octave" @@ -1542,6 +1571,7 @@ BUILDSYSTEM_CLSES = [ Golang, R, Octave, + Bazel, # Make is intentionally at the end of the list. Make, Composer, From 475a395d959588f6c8e6cb3e9b93215386ef838b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 30 Apr 2021 19:39:17 +0100 Subject: [PATCH 22/28] Fix handling of custom python versions. --- ognibuild/resolver/apt.py | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index a798a8d..82ef627 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -180,7 +180,6 @@ def python_spec_to_apt_rels(pkg_name, specs): else: rels = [] for spec in specs: - deb_version = Version(spec[1]) if spec[0] == "~=": # PEP 440: For a given release identifier V.N , the compatible # release clause is approximately equivalent to the pair of @@ -189,32 +188,26 @@ def python_spec_to_apt_rels(pkg_name, specs): parts.pop(-1) parts[-1] = str(int(parts[-1]) + 1) next_maj_deb_version = Version(".".join(parts)) + deb_version = Version(spec[1]) rels.extend( - [ - {"name": pkg_name, "version": (">=", deb_version)}, - {"name": pkg_name, "version": ("<<", next_maj_deb_version)}, - ] - ) + [[{"name": pkg_name, "version": (">=", deb_version)}], + [{"name": pkg_name, "version": ("<<", next_maj_deb_version)}]]) elif spec[0] == "!=": - rels.extend( - [ - {"name": pkg_name, "version": (">>", deb_version)}, - {"name": pkg_name, "version": ("<<", deb_version)}, - ] - ) + deb_version = Version(spec[1]) + rels.extend([ + [{"name": pkg_name, "version": (">>", deb_version)}], + [{"name": pkg_name, "version": ("<<", deb_version)}]]) elif spec[1].endswith(".*") and spec[0] == "==": s = spec[1].split(".") s.pop(-1) n = list(s) n[-1] = str(int(n[-1]) + 1) rels.extend( - [ - {"name": pkg_name, "version": (">=", Version(".".join(s)))}, - {"name": pkg_name, "version": ("<<", Version(".".join(n)))}, - ] - ) + [[{"name": pkg_name, "version": (">=", Version(".".join(s)))}], + [{"name": pkg_name, "version": ("<<", Version(".".join(n)))}]]) else: c = {">=": ">=", "<=": "<=", "<": "<<", ">": ">>", "==": "="}[spec[0]] + deb_version = Version(spec[1]) rels.append([{"name": pkg_name, "version": (c, deb_version)}]) return rels From 1967b13d982cab2b66e16092caf27e9b209ffada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sat, 1 May 2021 02:55:11 +0100 Subject: [PATCH 23/28] meson before cargo. --- ognibuild/buildsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 113ea41..1f4989b 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -1560,8 +1560,8 @@ BUILDSYSTEM_CLSES = [ SetupPy, Npm, Waf, - Cargo, Meson, + Cargo, Cabal, Gradle, Maven, From 743c83c4b46ebaa66c58010629307ae42344db4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Mon, 3 May 2021 17:24:19 +0100 Subject: [PATCH 24/28] Dzil authordeps requires dist.ini. --- ognibuild/buildsystem.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 1f4989b..cc86382 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -999,9 +999,10 @@ class DistZilla(BuildSystem): return cls(os.path.join(path, "dist.ini")) def get_declared_dependencies(self, session, fixers=None): - lines = run_with_build_fixers(session, ["dzil", "authordeps"], fixers) - for entry in lines: - yield "build", PerlModuleRequirement(entry.strip()) + if os.path.exists(os.path.join(self.path, "dist.ini")): + lines = run_with_build_fixers(session, ["dzil", "authordeps"], fixers) + for entry in lines: + yield "build", PerlModuleRequirement(entry.strip()) if os.path.exists(os.path.join(os.path.dirname(self.path), "cpanfile")): yield from _declared_deps_from_cpanfile(session, fixers) From 43222bc91dd02a3f8215aebdaab50be1b091024a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Fri, 14 May 2021 20:29:32 +0100 Subject: [PATCH 25/28] Fix style, initial work on supporting prefixes. --- ognibuild/__main__.py | 3 +++ ognibuild/buildsystem.py | 40 ++++++++++++++++++++++++++++----------- ognibuild/install.py | 4 +++- ognibuild/requirements.py | 1 - 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/ognibuild/__main__.py b/ognibuild/__main__.py index 2307475..27ddccd 100644 --- a/ognibuild/__main__.py +++ b/ognibuild/__main__.py @@ -136,6 +136,8 @@ def main(): # noqa: C901 install_parser.add_argument( "--user", action="store_true", help="Install in local-user directories." ) + install_parser.add_argument( + "--prefix", type=str, help='Prefix to install in') args = parser.parse_args() if not args.subcommand: @@ -219,6 +221,7 @@ def main(): # noqa: C901 resolver=resolver, fixers=fixers, user=args.user, + prefix=args.prefix, ) if args.subcommand == "test": from .test import run_test diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index cc86382..62e3cbc 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -44,7 +44,7 @@ from .requirements import ( GoRequirement, GoPackageRequirement, ) -from .fix_build import run_with_build_fixers, find_build_failure_description +from .fix_build import run_with_build_fixers from .session import which @@ -64,6 +64,8 @@ class InstallTarget(object): # Whether to prefer user-specific installation user: Optional[bool] + prefix: Optional[str] + # TODO(jelmer): Add information about target directory, layout, etc. @@ -445,6 +447,8 @@ class SetupPy(BuildSystem): extra_args = [] if install_target.user: extra_args.append("--user") + if install_target.prefix: + extra_args.append("--prefix=%s" % install_target.prefix) self._run_setup(session, resolver, ["install"] + extra_args, fixers) else: raise NotImplementedError @@ -721,6 +725,7 @@ class R(BuildSystem): return dc.copy_single(target_directory) def install(self, session, resolver, fixers, install_target): + extra_args.append("--prefix=%s" % install_target.prefix) r_path = guaranteed_which(session, resolver, "R") run_with_build_fixers(session, [r_path, "CMD", "INSTALL", "."], fixers) @@ -1078,7 +1083,7 @@ class Make(BuildSystem): def __repr__(self): return "%s(%r)" % (type(self).__name__, self.path) - def setup(self, session, resolver, fixers): + def setup(self, session, resolver, fixers, prefix=None): def makefile_exists(): return any( [session.exists(p) for p in ["Makefile", "GNUmakefile", "makefile"]] @@ -1107,7 +1112,10 @@ class Make(BuildSystem): run_with_build_fixers(session, ["autoreconf", "-i"], fixers) if not makefile_exists() and session.exists("configure"): - run_with_build_fixers(session, ["./configure"], fixers) + extra_args = [] + if prefix is not None: + extra_args.append('--prefix=%s' % prefix) + run_with_build_fixers(session, ["./configure"] + extra_args, fixers) if not makefile_exists() and any( [n.name.endswith(".pro") for n in session.scandir(".")] @@ -1122,12 +1130,25 @@ class Make(BuildSystem): self.setup(session, resolver, fixers) self._run_make(session, ["clean"], fixers) - def _run_make(self, session, args, fixers): + def _run_make(self, session, args, fixers, prefix=None): + def _wants_configure(line): + if line.startswith("Run ./configure"): + return True + if line == "Please run ./configure first": + return True + if line.startswith("Project not configured"): + return True + if line.startswith("The project was not configured"): + return True + return False try: run_with_build_fixers(session, ["make"] + args, fixers) except UnidentifiedError as e: - if len(e.lines) < 5 and any([line.startswith("Run ./configure") for line in e.lines]): - run_with_build_fixers(session, ["./configure"], fixers) + if len(e.lines) < 5 and any([_wants_configure(line) for line in e.lines]): + extra_args = [] + if prefix is not None: + extra_args.append("--prefix=%s" % prefix) + run_with_build_fixers(session, ["./configure"] + extra_args, fixers) run_with_build_fixers(session, ["make"] + args, fixers) elif ( "Reconfigure the source tree " @@ -1135,9 +1156,6 @@ class Make(BuildSystem): ) in e.lines: run_with_build_fixers(session, ["./config"], fixers) run_with_build_fixers(session, ["make"] + args, fixers) - elif "Please run ./configure first" in e.lines: - run_with_build_fixers(session, ["./configure"], fixers) - run_with_build_fixers(session, ["make"] + args, fixers) else: raise @@ -1146,8 +1164,8 @@ class Make(BuildSystem): self._run_make(session, ["check"], fixers) def install(self, session, resolver, fixers, install_target): - self.setup(session, resolver, fixers) - self._run_make(session, ["install"], fixers) + self.setup(session, resolver, fixers, prefix=install_target.prefix) + self._run_make(session, ["install"], fixers, prefix=install_target.prefix) def dist(self, session, resolver, fixers, target_directory, quiet=False): self.setup(session, resolver, fixers) diff --git a/ognibuild/install.py b/ognibuild/install.py index bf7bf62..d242ad7 100644 --- a/ognibuild/install.py +++ b/ognibuild/install.py @@ -16,15 +16,17 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA from .buildsystem import NoBuildToolsFound, InstallTarget +from typing import Optional -def run_install(session, buildsystems, resolver, fixers, user: bool = False): +def run_install(session, buildsystems, resolver, fixers, user: bool = False, prefix: Optional[str] = None): # Some things want to write to the user's home directory, # e.g. pip caches in ~/.cache session.create_home() install_target = InstallTarget() install_target.user = user + install_target.prefix = prefix for buildsystem in buildsystems: buildsystem.install(session, resolver, fixers, install_target) diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index f3c0858..29475b9 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -472,7 +472,6 @@ class LibraryRequirement(Requirement): self.library = library - class StaticLibraryRequirement(Requirement): library: str From 6f671021448343403a63d234ff9e0b72fe89d650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 16 May 2021 16:39:29 +0100 Subject: [PATCH 26/28] Fix cmake invocation. --- ognibuild/buildsystem.py | 14 ++++++++++++-- ognibuild/session/plain.py | 3 +++ ognibuild/session/schroot.py | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 62e3cbc..8fc6c69 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -784,7 +784,7 @@ class Meson(BuildSystem): def _setup(self, session, fixers): if not session.exists("build"): - session.check_call(["mkdir", "build"]) + session.mkdir("build") run_with_build_fixers(session, ["meson", "setup", "build"], fixers) def clean(self, session, resolver, fixers): @@ -1077,6 +1077,8 @@ class Make(BuildSystem): elif any([os.path.exists(os.path.join(path, n)) for n in ['configure.ac', 'configure.in', 'autogen.sh']]): self.name = 'autoconf' + elif os.path.exists(os.path.join(path, "CMakeLists.txt")): + self.name = 'cmake' else: self.name = "make" @@ -1122,6 +1124,10 @@ class Make(BuildSystem): ): run_with_build_fixers(session, ["qmake"], fixers) + if not makefile_exists() and session.exists('CMakeLists.txt'): + session.mkdir('build') + run_with_build_fixers(session, ["cmake", '..'], fixers, cwd='build') + def build(self, session, resolver, fixers): self.setup(session, resolver, fixers) self._run_make(session, ["all"], fixers) @@ -1141,8 +1147,12 @@ class Make(BuildSystem): if line.startswith("The project was not configured"): return True return False + if session.exists('build'): + cwd = 'build' + else: + cwd = None try: - run_with_build_fixers(session, ["make"] + args, fixers) + run_with_build_fixers(session, ["make"] + args, fixers, cwd=cwd) except UnidentifiedError as e: if len(e.lines) < 5 and any([_wants_configure(line) for line in e.lines]): extra_args = [] diff --git a/ognibuild/session/plain.py b/ognibuild/session/plain.py index 0084d8d..df4b1a2 100644 --- a/ognibuild/session/plain.py +++ b/ognibuild/session/plain.py @@ -97,6 +97,9 @@ class PlainSession(Session): def chdir(self, path): os.chdir(path) + def mkdir(self, path): + os.mkdir(path) + def external_path(self, path): return os.path.abspath(path) diff --git a/ognibuild/session/schroot.py b/ognibuild/session/schroot.py index ff5b436..bc9bcd1 100644 --- a/ognibuild/session/schroot.py +++ b/ognibuild/session/schroot.py @@ -199,6 +199,10 @@ class SchrootSession(Session): fullpath = self.external_path(path) return os.scandir(fullpath) + def mkdir(self, path: str): + fullpath = self.external_path(path) + return os.mkdir(fullpath) + def setup_from_vcs( self, tree, include_controldir: Optional[bool] = None, subdir="package" ): From 8f2aaf30a8c9c0a4ea6e0aee6bde71b9a591c72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 16 May 2021 16:47:07 +0100 Subject: [PATCH 27/28] Preserve environment. --- ognibuild/buildsystem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ognibuild/buildsystem.py b/ognibuild/buildsystem.py index 8fc6c69..08ac13c 100644 --- a/ognibuild/buildsystem.py +++ b/ognibuild/buildsystem.py @@ -463,7 +463,8 @@ class SetupPy(BuildSystem): if interpreter is None: interpreter = self.DEFAULT_PYTHON argv = [interpreter, "./setup.py"] + args - env = {} + # TODO(jelmer): Perhaps this should be additive? + env = dict(os.environ) # Inherit SETUPTOOLS_SCM_PRETEND_VERSION from the current environment if "SETUPTOOLS_SCM_PRETEND_VERSION" in os.environ: env["SETUPTOOLS_SCM_PRETEND_VERSION"] = os.environ[ From 36c331bffe9dd3ec66dda7ffad8c240fbd2d68e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jelmer=20Vernoo=C4=B3?= Date: Sun, 16 May 2021 16:53:07 +0100 Subject: [PATCH 28/28] Release 0.0.5. --- ognibuild/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ognibuild/__init__.py b/ognibuild/__init__.py index 02b30ed..d5896e2 100644 --- a/ognibuild/__init__.py +++ b/ognibuild/__init__.py @@ -20,7 +20,7 @@ import os import stat -__version__ = (0, 0, 4) +__version__ = (0, 0, 5) USER_AGENT = "Ognibuild" diff --git a/setup.py b/setup.py index 86ecf2e..11a4d5c 100755 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ from setuptools import setup setup(name="ognibuild", description="Detect and run any build system", - version="0.0.4", + version="0.0.5", maintainer="Jelmer Vernooij", maintainer_email="jelmer@jelmer.uk", license="GNU GPLv2 or later",