1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
sub requires; # forward declaration
sub check_scalar_util {
# Try to load Scalar::Util
eval {
require Scalar::Util;
};
if ( $@ ) {
# Scalar::Util not installed (really old Perl?)
requires 'Scalar::Util' => '1.24';
return;
}
# Is installed
my $module_version = $Scalar::Util::VERSION;
my $module_weaken = !! defined &Scalar::Util::weaken;
if ( $module_weaken ) {
# Already have weaken support.
# Make sure it is a new enough version
requires 'Scalar::Util' => '1.14';
return;
}
# Does NOT have weaken, so either a very old
# Scalar::Util, or a broken one.
if ( $module_version <= 1.01 ) {
# Very old Scalar::Util, upgrade it
requires 'Scalar::Util' => '1.24';
return;
}
my $latest_scalar_util = 1.24;
# Broken Scalar::Util
# That is, it does NOT contain the weaken function
# which means it was built without a compiler.
unless ( can_cc() ) {
# The user does not have a compiler
# There is currently no way to resolve
# this situation, but we should probably
# try to upgrade Scalar::Util anyway, just
# in case the author is able to come up
# with a solution at some point in the
# future.
message1();
requires 'List::Util::XS' => $latest_scalar_util;
return;
}
# User should be capable of installing an
# upgraded version.
# Can we be certain they WILL do the upgrade?
if ( $module_version < $latest_scalar_util ) {
# We should be able to do a straight
# forward upgrade of the module
requires 'List::Util::XS' => $latest_scalar_util;
return;
}
# They ALREADY have the newest version... and it is broken.
# Very little we can do in this case, other than issue a
# message to the user, and then add a high dependency in the
# vague hope it does something.
message2();
requires 'List::Util::XS' => $latest_scalar_util;
return;
}
sub message1 {
print "\n\n\n";
print " ERROR:\n\n";
print " A CPAN module critically requires a function\n";
print " (Scalar::Util::weaken) that can only be provided by\n";
print " upgrading your Scalar::Util module to a new version,\n";
print " which will need a C compiler in order to install.\n\n";
print " Unfortunately, I can't seem to locate a C compiler on this\n";
print " computer.\n\n";
print " I'm going to try to continue anyway, but the most likely result\n";
print " is going to be an extremely noisy series of testing errors.\n\n";
print " If this happens, you will need to install a C compiler\n";
print " (such as gcc) and then try to install whatever it is you are\n";
print " installing again.\n\n";
print " During the second attempt, I should be able to find the C\n";
print " compiler and be able to build the needed function without\n";
print " having to bother you again.\n\n";
print " I'm going to wait for about a minute now in the hope you read\n";
print " this\n\n\n";
sleep( 50 );
}
sub message2 {
print "\n\n\n";
print " ERROR:\n\n";
print " A CPAN module critically requires a function\n";
print " (Scalar::Util::weaken) that should exist in your\n";
print " Scalar::Util module but doesn't.\n\n";
print " This probably happened because you are using a Perl\n";
print " provided by a binary package from a vendor, and this\n";
print " vendor has packaged Perl incorrectly.\n\n";
print " I have checked for a couple of potential workarounds\n";
print " but none of them appear to be usable in your\n";
print " situation.\n\n";
print " I will try a last-ditch option anyway, but the most\n";
print " likely result is a number of noisily failing tests\n\n";
print " If this happens, you will need to contact technical\n";
print " support for your vendor and report the broken Perl,\n";
print " so that they can repair it.\n\n";
print " Please refer them to the documentation for the\n";
print " 'Task::Weaken' CPAN module, which explains the problem\n";
print " and how they can fix it.\n\n";
print " I'm going to wait for about a minute now so you have time\n";
print " to read this message\n\n\n";
sleep( 50 );
}
|