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),