| use 5.005; |
| |
| use lib qw(lib); |
| use Apache::Test5005compat; |
| |
| use strict; |
| use warnings; |
| |
| # was this file invoked directly via perl, or via the top-level |
| # (mp2) Makefile.PL? if top-level, this env var will be set |
| use constant TOP_LEVEL => !exists $ENV{MOD_PERL_2_BUILD}; |
| |
| use ExtUtils::MakeMaker; |
| use Symbol; |
| use File::Find qw(finddepth); |
| |
| use Apache::TestMM qw(test clean); #enable 'make test and make clean' |
| use Apache::TestRun; |
| use Apache::TestTrace; |
| use Apache::TestReport; |
| use Apache::TestConfig (); |
| |
| my $VERSION; |
| set_version(); |
| |
| sanity_check(); |
| |
| Apache::TestMM::filter_args(); |
| |
| my @scripts = qw(t/TEST); |
| |
| finddepth(sub { |
| return if $_ eq 'Apache-TestItSelf'; |
| return unless /(.*?\.pl)\.PL$/; |
| push @scripts, "$File::Find::dir/$1"; |
| }, '.'); |
| |
| for (@scripts) { |
| Apache::TestMM::generate_script($_); |
| } |
| Apache::TestReport->generate_script; |
| |
| # if built with mod_perl 2.0, its top-level Makefile.PL already |
| # installs the uninstall code |
| if (TOP_LEVEL) { |
| require "./install-pl"; |
| add_Apache__test_target(); |
| } |
| |
| Apache::TestConfig::custom_config_file_stub_write(); |
| |
| my @clean_files = |
| qw(lib/Apache/TestConfigData.pm |
| .mypacklist |
| t/TEST |
| Makefile.old |
| ); |
| |
| my %prereq = ( |
| 'File::Spec' => '0.8', |
| 'Cwd' => '2.06', |
| ); |
| |
| # Apache-Test/META.yml is excluded from mp2 distro to make PAUSE |
| # indexer happy, but then perl Makefile.PL complains about a missing |
| # META.yml, so autogenerate it if it wasn't in the distro |
| my $no_meta = TOP_LEVEL ? 1 : 0; |
| |
| WriteMakefile( |
| NAME => 'Apache::Test', |
| VERSION => $VERSION, |
| PREREQ_PM => \%prereq, |
| NO_META => $no_meta, |
| DIR => [get_sub_dirs()], |
| dist => { |
| COMPRESS => 'gzip -9f', SUFFIX => 'gz', |
| }, |
| clean => { |
| FILES => "@clean_files", |
| }, |
| ); |
| |
| # after CPAN/CPANPLUS had a chance to satisfy the requirements, |
| # enforce those (for those who run things manually) |
| check_prereqs(); |
| |
| sub check_prereqs { |
| my %fail = (); |
| for (keys %prereq) { |
| unless (chk_version($_, $prereq{$_})) { |
| $fail{$_} = $prereq{$_}; |
| } |
| } |
| if (%fail) { |
| error "\nThe following Apache-Test dependencies aren't satisfied:", |
| map { "\t$_: $fail{$_}" } keys %fail; |
| error "Install those from http://search.cpan.org and try again"; |
| exit 0; |
| } |
| } |
| |
| sub chk_version { |
| my($pkg, $wanted) = @_; |
| |
| no strict 'refs'; |
| local $| = 1; |
| |
| print "Checking for $pkg..."; |
| (my $p = $pkg . ".pm") =~ s#::#/#g; |
| eval { require $p;}; |
| print("not ok\n$@"), return if $@; |
| |
| my $vstr = ${"${pkg}::VERSION"} ? "found v" . ${"${pkg}::VERSION"} |
| : "not found"; |
| my $vnum = ${"${pkg}::VERSION"} || 0; |
| |
| print $vnum >= $wanted ? "ok\n" : " " . $vstr . "\n"; |
| |
| $vnum >= $wanted; |
| } |
| |
| sub set_version { |
| $VERSION = $Apache::Test::VERSION; |
| |
| my $fh = Symbol::gensym(); |
| open $fh, 'Changes' or die "Can't open Changes: $!"; |
| while (<$fh>) { |
| if(/^=item.*-dev/) { |
| $VERSION .= '-dev'; |
| last; |
| } |
| last if /^=item/; |
| } |
| close $fh; |
| } |
| |
| sub sanity_check { |
| # don't allow running an explicit 'perl Makefile.PL', when |
| # Apache-Test is checked out into the modperl-2.0 tree, since |
| # it then decides that it's a part of the modperl-2.0 build and |
| # will try to use modperl httpd/apxs arguments which could be |
| # unset or wrong |
| if (TOP_LEVEL && -e "../lib/mod_perl.pm") { |
| error "Do not run 'perl Makefile.PL' when Apache-Test is a " . |
| "subdirectory of modperl-2.0. Copy it elsewhere and run " . |
| "from there."; |
| Apache::TestRun::exit_perl(0); |
| } |
| } |
| |
| if (TOP_LEVEL && $ExtUtils::MakeMaker::VERSION < 6.06) { |
| # now that we're using subversion, make sure that |
| # .svn directories are skipped during the build process |
| # for old versions of MakeMaker |
| *MY::libscan = sub { |
| my $self = shift; |
| |
| my $path = shift; |
| |
| return '' if $path =~ /\B\.svn\b/; |
| |
| return $path; |
| }; |
| # avoid warning: used only once: possible typo at ... |
| *MY::libscan = *MY::libscan; |
| } |
| |
| sub MY::postamble { |
| my $self = shift; |
| |
| my $string = $self->MM::postamble; |
| |
| $string .= <<'EOF'; |
| tag : |
| svn copy https://svn.apache.org/repos/asf/perl/Apache-Test/trunk https://svn.apache.org/repos/asf/perl/Apache-Test/tags/$(VERSION_SYM) |
| @echo update lib/Apache/Test.pm VERSION now |
| EOF |
| |
| return $string; |
| } |
| |
| sub MY::constants { |
| my $self = shift; |
| |
| my $string = $self->MM::constants; |
| |
| # mp2 installs A-T into INSTALLSITEARCH, so in order to avoid |
| # problems when users forget 'make install UNINST=1', trick MM into |
| # installing pure perl modules to the sitearch location, when A-T is |
| # not installed as a part of mp2 build |
| if (TOP_LEVEL) { |
| $string .= <<'EOI'; |
| |
| # install into the same location as mod_perl 2.0 |
| INSTALLSITELIB = $(INSTALLSITEARCH) |
| DESTINSTALLSITELIB = $(DESTINSTALLSITEARCH) |
| EOI |
| } |
| |
| $string; |
| } |
| |
| sub add_dep { |
| my($string, $targ, $add) = @_; |
| $$string =~ s/($targ\s+::)/$1 $add/; |
| } |
| |
| sub add_Apache__test_target { |
| use subs qw(MY::install MY::top_targets); |
| *MY::install = sub { |
| my $self = shift; |
| |
| my $string = $self->MM::install(@_); |
| add_dep(\$string, pure_install => 'nuke_Apache__test'); |
| $string; |
| }; |
| |
| *MY::top_targets = sub { |
| my $self = shift; |
| my $string = $self->MM::top_targets; |
| |
| $string .= Apache::Test::install::nuke_Apache__test_target(); |
| |
| $string; |
| }; |
| } |
| |
| # which sub-dirs should MakeMaker descend into |
| sub get_sub_dirs { |
| my @sub_dirs = qw(Apache-TestItSelf); |
| |
| # XXX: META.yml is updated to tell PAUSE to ignore Test-Simple |
| # but when A-T is bundled with mp2, this META.yml is not included |
| # need to ask Andreas to fix the multiple META.yml files issue |
| |
| # XXX: automate this by checking Test-Simple/lib/Test/Simple.pm |
| my $our_version = '0.60'; |
| unless (eval { require Test::Simple } && |
| $Test::Simple::VERSION >= $our_version) { |
| push @sub_dirs, 'Test-Simple'; |
| } |
| |
| return @sub_dirs; |
| } |
| |