diff --git a/ognibuild/buildlog.py b/ognibuild/buildlog.py index a851e14..ec666d5 100644 --- a/ognibuild/buildlog.py +++ b/ognibuild/buildlog.py @@ -61,6 +61,7 @@ from buildlog_consultant.common import ( MissingLibtool, MissingQt, MissingX11, + MissingPerlPredeclared, ) from .fix_build import BuildFixer @@ -101,6 +102,7 @@ from .requirements import ( LibtoolRequirement, VagueDependencyRequirement, IntrospectionTypelibRequirement, + PerlPreDeclaredRequirement, ) from .resolver import UnsatisfiedRequirements @@ -173,6 +175,8 @@ def problem_to_upstream_requirement(problem): # noqa: C901 return LibtoolRequirement() elif isinstance(problem, UnknownCertificateAuthority): return CertificateAuthorityRequirement(problem.url) + elif isinstance(problem, MissingPerlPredeclared): + return PerlPreDeclaredRequirement(problem.name) elif isinstance(problem, MissingSetupPyCommand): if problem.command == "test": return PythonPackageRequirement("setuptools") diff --git a/ognibuild/requirements.py b/ognibuild/requirements.py index 71219df..7c42fa6 100644 --- a/ognibuild/requirements.py +++ b/ognibuild/requirements.py @@ -192,6 +192,32 @@ class NodePackageRequirement(Requirement): return "%s(%r)" % (type(self).__name__, self.package) +class PerlPreDeclaredRequirement(Requirement): + + name: str + + # TODO(jelmer): Can we obtain this information elsewhere? + KNOWN_MODULES = { + 'auto_set_repository': 'Module::Install::Repository', + 'author_tests': 'Module::Install::AuthorTests', + 'readme_from': 'Module::Install::ReadmeFromPod', + 'catalyst': 'Module::Install::Catalyst', + 'githubmeta': 'Module::Install::GithubMeta', + 'use_ppport': 'Module::Install::XSUtil', + } + + def __init__(self, name): + super(PerlPreDeclaredRequirement, self).__init__("perl-predeclared") + self.name = name + + def lookup_module(self): + module = self.KNOWN_MODULES[self.name] + return PerlModuleRequirement(module=module) + + def __repr__(self): + return "%s(%r)" % (type(self).__name__, self.name) + + class NodeModuleRequirement(Requirement): module: str diff --git a/ognibuild/resolver/apt.py b/ognibuild/resolver/apt.py index ed67b89..393194c 100644 --- a/ognibuild/resolver/apt.py +++ b/ognibuild/resolver/apt.py @@ -68,6 +68,7 @@ from ..requirements import ( CertificateAuthorityRequirement, LibtoolRequirement, VagueDependencyRequirement, + PerlPreDeclaredRequirement, IntrospectionTypelibRequirement, ) @@ -117,6 +118,16 @@ class AptRequirement(Requirement): return False +def resolve_perl_predeclared_req(apt_mgr, req): + try: + req = req.lookup_module() + except KeyError: + logging.warning( + 'Unable to map predeclared function %s to a perl module', req.name) + return None + return resolve_perl_module_req(apt_mgr, req) + + def find_package_names( apt_mgr: AptManager, paths: List[str], regex: bool = False, case_insensitive=False ) -> List[str]: @@ -639,6 +650,7 @@ APT_REQUIREMENT_RESOLVERS = [ (AptRequirement, resolve_apt_req), (BinaryRequirement, resolve_binary_req), (VagueDependencyRequirement, resolve_vague_dep_req), + (PerlPreDeclaredRequirement, resolve_perl_predeclared_req), (PkgConfigRequirement, resolve_pkg_config_req), (PathRequirement, resolve_path_req), (CHeaderRequirement, resolve_c_header_req),