From c489d9313da67805cccbd50934861a31c792e42b Mon Sep 17 00:00:00 2001 From: Kent Fredric Date: Wed, 3 Aug 2016 15:17:54 +1200 Subject: [PATCH] perl-functions.eclass: Add perl_has_module This is an incredibly fast way to check if Perl considers a module of the given name installed in any capacity, including broken. As long as "Foo.pm" is somewhere in @INC, `perl_has_module Foo` will return true. Even `perl_has_module threads` will return true on non-threaded perls, due to that module still being present, and the module only fataling when loaded. Whereas `perl_has_module_version threads 0` will always fail on non-threaded perls. --- eclass/perl-functions.eclass | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/eclass/perl-functions.eclass b/eclass/perl-functions.eclass index 81dcc0066dbd..77e1ffca8067 100644 --- a/eclass/perl-functions.eclass +++ b/eclass/perl-functions.eclass @@ -318,3 +318,31 @@ perl_doexamples() { # is there a way to undo "docinto" ? } + +# @FUNCTION: perl_has_module +# @USAGE: perl_has_module "Test::Tester" +# @DESCRIPTION: +# Query the installed system Perl to see if a given module is installed. +# This does **not** load the module in question, only anticipates if it *might* load. +# +# This is primarily for the purposes of dependency weakening so that conditional +# behaviour can be triggered without adding dependencies to portage which would confuse +# a dependency resolver. +# +# returns 'true' if the module is available, returns error if the module is not available + +perl_has_module() { + debug-print-function $FUNCNAME "$@" + + [[ $# -gt 0 ]] || die "${FUNCNAME}: No module name provided" + [[ $# -lt 2 ]] || die "${FUNCNAME}: Too many parameters ($#)" + + perl -we 'my $mn = $ARGV[0]; + $mn =~ s{(::|\x{27})}{/}g; + for(@INC){ + next if ref $_; + exit 0 if -r $_ . q[/] . $mn . q[.pm] + } + exit 1' "$@"; +} + -- 2.26.2