The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use ExtUtils::MakeMaker;
use strict;
use FindBin;
use 5.005;

use File::Path qw(mkpath);
use lib qw(Apache-Test/lib);

use constant MIN_A_T_VERSION => 1.13;

use constant HAS_APACHE_TEST => eval {
    require Apache::Test &&
        $Apache::Test::VERSION >= MIN_A_T_VERSION;
};

use constant WIN32 => ($^O eq "MSWin32") || $ENV{WIN32_TEST};
if (WIN32) {
    win32_setup() unless ($ENV{APACHE} || grep /^-httpd$/, @ARGV);
}

# enable 'make test|clean'
if (HAS_APACHE_TEST) {
    require Apache::TestMM;
    Apache::TestMM->import(qw(test clean));
}
BEGIN {
    unless (eval {require mod_perl}) {
        die "Please install mod_perl: 1.25 < version < 1.99\n($@)";
    }
    if ($mod_perl::VERSION < 1.2402) {
        die "Please upgrade mod_perl to 1.24_02 or greater";
    }
    elsif ($mod_perl::VERSION > 1.98) {
        die "mod_perl 1.x ( < 1.99) is required";
    }
}

my $conf_data = join '', <DATA>;
$conf_data =~ s|(blib/arch)|$FindBin::Bin/$1|;

if (HAS_APACHE_TEST) {
    # accept the configs from command line
    Apache::TestMM::filter_args();
    Apache::TestMM::generate_script('t/TEST');
}
else {
    print "\nskipping test setup... which requires Apache::Test " .
    MIN_A_T_VERSION . " or higher\n";
    *MY::test = sub {
        return <<'EOF';
test : pure_all
	@echo \*** This test suite requires Apache::Test available
	@echo \*** available from CPAN

EOF
    };
}

# prerequisites
my %require = (
    "Apache::Test" => MIN_A_T_VERSION,
);

my $myVERSION = MM->parse_version('Request/Request.pm');
$myVERSION =~ s/(\d\d)(\d\d)$/$1_$2/;
my $lib;
check_compat();

if (WIN32) {
    require Cwd;
    my $cwd = Cwd::cwd();
    $cwd =~ s#\\#/#g;

    my $root = "$cwd/blib/arch/auto";
    mkpath $root, 1, 0755 unless -d $root;
    mkpath "$root/libapreq", 1, 0755 unless -d "$root/libapreq";
    $lib = "$root/libapreq/libapreq.lib";

    open (FILE, ">>$lib")
        or die "Cannot touch $lib: $!\n";
    close FILE;

    require Apache::MyConfig;
    $ENV{APREQ_LIB} = "$root/libapreq";
    $ENV{AP_INC} = $Apache::MyConfig::Setup{APACHE_INC};
    $ENV{MP_INC} = $Apache::MyConfig::Setup{MODPERL_INC};
    $ENV{AP_LIB} = $Apache::MyConfig::Setup{APACHE_LIB};
    $ENV{MP_LIB} = $Apache::MyConfig::Setup{MODPERL_LIB};

    unless (-f "$ENV{MP_LIB}/mod_perl.so") {
        die "Cannot find mod_perl.so in $ENV{MP_LIB}. " .
            "Please build mod_perl first";
    }

    unless (-f "$ENV{AP_LIB}/ApacheCore.lib") {
        die "Cannot find ApacheCore.lib in $ENV{AP_LIB}. " .
            "Please build apache first.";
    }
}

WriteMakefile(
    NAME      => 'libapreq',
    VERSION   => $myVERSION,
    DIR       => [qw(c Request Cookie)],
    PREREQ_PM => \%require,
    clean     => {
        FILES => "@{ clean_files() }",
    },
);

sub clean_files {
    return [qw( t/TEST )];
}

if (WIN32 and -e $lib) {
    unlink $lib or die "Cannot unlink $lib: $!\n";
}

sub check_compat {
    eval { require Apache::Request };
    return if $@;

    my $v = $Apache::Request::VERSION;
    return if $v >= 0.2000;

    print "libapreq is not compatible with  Apache::Request version $v\n";
    my $ans = prompt("Continue?", "n");
    if ($ans =~ /^n/i) {
	print "Aborting.\n";
	exit;
    }
}

sub MY::pasthru {
    my $self = shift;
    chomp(my $str = $self->MM::pasthru);
    join $/, "$str\\", "\t".'DEFINE="$(DEFINE)"', "";
}

sub MY::postamble {
    return <<'EOF';

cvs_tag :
	cvs tag v$(VERSION_SYM) .
	@echo update the VERSION in Apache/Request.pm now 

EOF
}

sub win32_setup {
    eval{ require Win32 };
    die "The libwin32 package is needed" if $@;

    require File::Spec;
    my $apache;
    my $exe = 'Apache.exe';

  SEARCH: {
        my $candidate;
        for (File::Spec->path) {
            $candidate = File::Spec->catfile($_, $exe);
            if (-e $candidate and check_win32_apache($candidate)) {
                $apache = $candidate;
                last SEARCH;
            }
        }

        my @drives = drives();
        last SEARCH unless (@drives > 0);
        for my $drive (@drives) {
            for ('Apache', 'Program Files/Apache',
                 'Program Files/Apache Group/Apache') {
                $candidate = File::Spec->catfile($drive, $_, $exe);
                if (-e $candidate and check_win32_apache($candidate)) {
                    $apache = $candidate;
                    last SEARCH;
                }
            }
        }
    }

    unless (-e $apache) {
        $apache = prompt("Please supply the full path to Apache.exe:",
                         $apache);
    }

    if (-d $apache) {
        $apache = File::Spec->catfile($apache, $exe);
    }
    die "Can't find Apache.exe!" 
        unless (-e $apache and check_win32_apache($apache));

    $apache = Win32::GetShortPathName($apache);
    $apache =~ s!\\!/!g;
    push @ARGV, '-httpd', $apache;
    print qq{Using "$apache".\n};
}

sub check_win32_apache {
    my $apache = shift;
    my $vers = qx{"$apache" -v};
    return ($vers =~ m!Apache/1.3!) ? 1 : 0;
}

sub drives {
    my @drives = ();
    eval { require Win32API::File };
    return map {"$_:\\"} ('C' .. 'Z') if $@;

    my @r = Win32API::File::getLogicalDrives();
    return unless @r > 0;
    for (@r) {
        my $t = Win32API::File::GetDriveType($_);
        push @drives, $_ if ($t == 3 or $t == 4);
    }
    return @drives > 0 ? @drives : undef;
}

__DATA__
<Perl>
   unshift @INC, "blib/arch";
</Perl>
PerlModule Apache::PerlRun
PerlModule Apache::Request
PerlModule Apache::Cookie

<FilesMatch "\.pl">
    SetHandler perl-script
    PerlHandler Apache::PerlRun
    Options +ExecCGI
</FilesMatch>