Author: pgollucci Date: Fri Aug 25 01:38:00 2006 New Revision: 436716 URL: http://svn.apache.org/viewvc?rev=436716&view=rev Log: Hybridize
This code was shamelessly stolen from Apache::VMonitor and Apache::Peek Modified: perl/Apache-SizeLimit/trunk/Makefile.PL Modified: perl/Apache-SizeLimit/trunk/Makefile.PL URL: http://svn.apache.org/viewvc/perl/Apache-SizeLimit/trunk/Makefile.PL?rev=436716&r1=436715&r2=436716&view=diff ============================================================================== --- perl/Apache-SizeLimit/trunk/Makefile.PL (original) +++ perl/Apache-SizeLimit/trunk/Makefile.PL Fri Aug 25 01:38:00 2006 @@ -1,9 +1,14 @@ use strict; use Config; -use ExtUtils::MakeMaker; -my %prereqs = ( mod_perl => 0 ); +my %prereqs = (); +my %mp2 = ( mod_perl2 => 1.99022 ); +my %mp1 = ( mod_perl => 0 ); + + +my $mp_gen = satisfy_mp_generation(); +%prereqs = ($mp_gen == 1 ? %mp1 : %mp2); unless ( $ARGV[0] eq '--dist' ) { if ( $Config{'osname'} eq 'linux' ) { @@ -22,12 +27,28 @@ my $HAS_APACHE_TEST = check_for_apache_test(); -WriteMakefile( VERSION_FROM => "lib/Apache/SizeLimit.pm", - NAME => "Apache::SizeLimit", - PREREQ_PM => \%prereqs, - ABSTRACT_FROM => 'lib/Apache/SizeLimit.pm', - clean => { FILES => 't/TEST' }, - ); +my %common_opts = ( + VERSION_FROM => "lib/Apache/SizeLimit.pm", + NAME => "Apache::SizeLimit", + PREREQ_PM => \%prereqs, + ABSTRACT_FROM => 'lib/Apache/SizeLimit.pm', + clean => { FILES => 't/TEST' }, + ); + +if ($mp_gen == 1) { + require ExtUtils::MakeMaker; + ExtUtils::MakeMaker::WriteMakefile( + %common_opts, + ); + +} +else { + require ModPerl::MM; + ModPerl::MM::WriteMakefile( + %common_opts, + ); +} + sub check_for_apache_test { return unless eval { @@ -51,6 +72,126 @@ Apache::TestRunPerl->generate_script(); return 1; +} + +# If a specific generation was passed as an argument, +# if satisfied +# return the same generation +# else +# die +# else @ARGV and %ENV will be checked for specific orders +# if the specification will be found +# if satisfied +# return the specified generation +# else +# die +# else if any mp generation is found +# return it +# else +# die + +sub satisfy_mp_generation { + my $wanted = shift || wanted_mp_generation(); + + unless ($wanted == 1 || $wanted == 2) { + die "don't know anything about mod_perl generation: $wanted\n" . + "currently supporting only generations 1 and 2"; + } + + my $selected = 0; + + if ($wanted == 1) { + require_mod_perl(); + if ($mod_perl::VERSION >= 1.99) { + # so we don't pick 2.0 version if 1.0 is wanted + die "You don't seem to have mod_perl 1.0 installed"; + } + $selected = 1; + } + elsif ($wanted == 2) { + #warn "Looking for mod_perl 2.0"; + require_mod_perl(); + if ($mod_perl::VERSION < 2.0) { + die "You don't seem to have mod_perl 2.0 installed"; + } + $selected = 2; + } + else { + require_mod_perl(); + $selected = $mod_perl::VERSION >= 1.99 ? 2 : 1; + warn "Using $mod_perl::VERSION\n"; + } + + return $selected; +} + +sub require_mod_perl { + eval { require mod_perl }; + eval { require mod_perl2 } if ($@); + die "Can't find mod_perl installed\nThe error was: $@" if $@; +} + +# the function looks at %ENV and Makefile.PL option to figure out +# whether a specific mod_perl generation was requested. +# It uses the following logic: +# via options: +# perl Makefile.PL MOD_PERL=2 +# or via %ENV: +# env MOD_PERL=1 perl Makefile.PL +# +# return value is: +# 1 or 2 if the specification was found (mp 1 and mp 2 respectively) +# 0 otherwise +sub wanted_mp_generation { + + # check if we have a command line specification + # flag: 0: unknown, 1: mp1, 2: mp2 + my $flag = 0; + my @pass; + while (@ARGV) { + my $key = shift @ARGV; + if ($key =~ /^MOD_PERL=(\d)$/) { + $flag = $1; + } + else { + push @pass, $key; + } + } + @ARGV = @pass; + + # check %ENV + my $env = exists $ENV{MOD_PERL} ? $ENV{MOD_PERL} : 0; + + # check for contradicting requirements + if ($env && $flag && $flag != $env) { + die <<EOF; +Can\'t decide which mod_perl version should be used, since you have +supplied contradicting requirements: + enviroment variable MOD_PERL=$env + Makefile.PL option MOD_PERL=$flag +EOF + } + + my $wanted = 0; + $wanted = 2 if $env == 2 || $flag == 2; + $wanted = 1 if $env == 1 || $flag == 1; + + unless ($wanted) { + # if still unknown try to require mod_perl.pm + eval { require mod_perl }; + if ($@) { + # if we don't have mp2, check for mp2 + eval { require mod_perl2 } if ($@); + unless ($@) { + $wanted = 2; + } + } + else { + $wanted = 1; + } + } + + return $wanted; } package MY;