diff options
Diffstat (limited to 'Makefile.PL')
-rw-r--r-- | Makefile.PL | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..aa6763c --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,165 @@ +# Dear Distribution Packagers +# +# Hi there! +# +# Before we begin, I'm really really sorry for what you are about to +# encounter a bit lower down in this file. +# +# Trust me, I didn't want to WRITE it just as much as you are probably +# not going to want to READ it and try to work out how the hell it +# applies to your Linux/etc distribution. +# +# So lets try to shortcut the whole confusion thing and save us both +# some time. +# +# Some distributions have this problem where the Scalar::Util version +# in the Perl core gets built WITHOUT a C compiler available. When this happens, +# most of the functions in Scalar::Util that need the compiler are replaced +# with a Pure-Perl version that works identically... +# +# ...except for two function relating to "weak references", a reference +# that is intentionally not counted for the purposes of garbage collection. +# +# It's used to implement certain specific data structures, like circular +# references and parent links in tree structures, in a way that can safely +# be garbage collected and won't leak. +# +# So what you really should check FIRST, is that the Perl build in your +# distribution has the Scalar::Util::weaken function defined. +# +# If not, then your Perl build is probably broken, and your solution +# ultimately needs to be applied to Perl itself. Then the whole problem +# goes away. +# +# If Scalar::Util::weaken is defined in your core Perl distribution, then +# none of the edge cases described below apply, and everything will be +# just rosy. +# +# Best Regards +# +# Adam K + +use inc::Module::Install 1.00; + +all_from 'lib/Task/Weaken.pm'; +test_requires 'Test::More' => '0.42'; +test_requires 'File::Spec' => '0.80'; + +check_scalar_util(); + +WriteAll; + +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.14'; + 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.14'; + return; + } + + my $latest_scalar_util = 1.21; + $latest_scalar_util = 1.19 if $] < 5.006; + # will not work of course - CPAN automatically installs only latest version + + # 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 'Scalar::Util' => $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 'Scalar::Util' => $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 'Scalar::Util' => $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 bew 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 ); +} |