robbiebow
robbiebow

Reputation: 97

How can I check if a binary dependency is available in Perl?

Having volunteered to maintain a stagnant CPAN package (GnuPG) I'd like improve the install files such that they exit gracefully if the gpg binary (which GnuPG is a wrapper for) cannot be found. After a bit of seeking inspiration from other packages, I've come up with adding this to Makefile.PL:

my @paths = grep { -x "$_/gpg" } split /:/, $ENV{PATH}, $ENV{PGP_PATH};

unless ( scalar @paths ) {
    print <<EOD;
I can't find the gpg binary on your system. If it's not installed in your usual PATH, set $ENV{PGP_PATH} to include where it can be found and try installing again.
EOD

    exit(0);
}

WriteMakefile(
    'NAME'        => 'GnuPG',
    'VERSION_FROM' => 'GnuPG.pm',
    'EXE_FILES'    => [ gpgmailtunl ],
    'LICENSE'      => 'GPL',
    'LIBS'         => [ @paths ],
);

Does that look sane?

Upvotes: 3

Views: 656

Answers (5)

Alexandr Ciornii
Alexandr Ciornii

Reputation: 7394

File::Which would be a crossplatform solution. You will need to either bundle it into inc/ directory or require it to be installed with configure_requires. For EU::MM it can be done with

    META_MERGE => {
        configure_requires => {
            'File::Which' => 0,

Module::Install is also a good solution, but you will need to release new version of distribution each time new version of Module::Install is released and changes are important.

Upvotes: 1

Jonathan Leffler
Jonathan Leffler

Reputation: 753455

The general concept is fine - if what you need to work is not present, don't create the makefile. The CPAN Testers have rules about exiting with a zero status on failure (which annoys me a lot, but never mind; I hate failing with a success status!).

Question: do you keep a record of where PGP was found at install time, so that if somebody else uses the Perl module without the location on their path, the module can still run?

For DBD::Informix, I have rigid dependencies without which the module cannot be compiled; the Makefile.PL is a major production in its own right because of that. It also tries to handle versions of the software covering over 15 years; that complicates its life, too. If the pre-requisites (some Perl modules; some non-Perl software) is not available, it won't install.

Upvotes: 2

Kent Fredric
Kent Fredric

Reputation: 57344

If you're using Module::Install or part of that family, you can use do

requires_external_bin 'gpg';

See Module::Install::External for details.

No good reason to reinvent the wheel.

Upvotes: 4

Shlomi Fish
Shlomi Fish

Reputation: 4500

For better accuracy you should look at File::Which or at least use File::Spec->path().

Upvotes: 1

reto
reto

Reputation: 16732

Wouldn't it make more sense to just print a warning? Is gpg necessary for the installation itself?

The code itself looks fine by me. But perhaps there's a built-in 'which' functionality. :).

Upvotes: 1

Related Questions