randyk 2004/06/26 12:41:54
Modified: . Makefile.PL
lib/ModPerl BuildMM.pm
xs/APR/APR Makefile.PL
Added: xs/APR/aprext Makefile.PL .cvsignore
Log:
Reviewed by: stas
On Win32, in order to decouple the APR/APR::* modules from mod_perl.so,
build a static library aprext.lib from the symbols needed from
src/modules/perl/*.c and link APR/APR::* against this library,
rather than against mod_perl.lib.
Revision Changes Path
1.139 +21 -6 modperl-2.0/Makefile.PL
Index: Makefile.PL
===================================================================
RCS file: /home/cvs/modperl-2.0/Makefile.PL,v
retrieving revision 1.138
retrieving revision 1.139
diff -u -r1.138 -r1.139
--- Makefile.PL 21 Jun 2004 06:45:54 -0000 1.138
+++ Makefile.PL 26 Jun 2004 19:41:53 -0000 1.139
@@ -149,17 +149,32 @@
$build->generate_apache2_pm;
+ # On Win32, in order to decouple APR::* from mod_perl.so, we
+ # make up a static library aprext.lib of the symbols required from
+ # src/modules/perl/*.c (see xs/APR/aprext/Makefile.PL), and
+ # then link APR/APR::* against this library. The reason for
+ # this is that, unlike Unix, if we had linked APR/APR::* against
+ # mod_perl.lib, then use of APR/APR::* would demand mod_perl.so
+ # be available, even if these symbols are supplied by another
+ # loaded library (which is done for unix by APR.so - see
+ # xs/APR/APR/Makefile.PL). This also means we must ensure aprext.lib
+ # is built before any of the APR/APR::* modules (see the aprext
+ # target in the MY::top_targets sub below), as symbols must
+ # get resolved at link time.
+
if (WIN32()) {
#Makefile.PL's in WrapXS/ just need to pass the -e mod_perl.lib test
#the real mod_perl.lib will be in place when WrapXS/ dll's are
#actually linked
+ # this must also be done for aprext.lib, build in xs/APR/aprext/;
+ # we must create a dummy aprext.lib to pass the -e test.
require File::Path;
my $lib1 = "src/modules/perl/$build->{MP_LIBNAME}.lib";
- my $apr_blib = catdir qw(blib arch Apache2 auto APR);
+ my $apr_blib = catdir qw(blib arch Apache2 auto aprext);
unless (-d $apr_blib) {
File::Path::mkpath($apr_blib) or die "mkdir $apr_blib failed: $!";
}
- my $lib2 = catfile $apr_blib, 'APR.lib';
+ my $lib2 = catfile $apr_blib, 'aprext.lib';
foreach my $lib ($lib1, $lib2) {
unless (-e $lib) {
open my $fh, '>', $lib or die "open $lib: $!";
@@ -471,13 +486,13 @@
my $string = $self->ModPerl::BuildMM::MY::top_targets;
if (WIN32) {
- ModPerl::MM::add_dep(\$string, pure_all => 'apr_lib');
+ ModPerl::MM::add_dep(\$string, pure_all => 'aprext');
- my $apr_lib = catdir qw(xs APR APR);
+ my $aprext = catdir qw(xs APR aprext);
$string .= <<"EOF";
-apr_lib:
- cd "$apr_lib" && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
+aprext:
+ cd "$aprext" && \$(MAKE) -f \$(FIRST_MAKEFILE) all \$(PASTHRU)
EOF
}
1.16 +23 -1 modperl-2.0/lib/ModPerl/BuildMM.pm
Index: BuildMM.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/BuildMM.pm,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- BuildMM.pm 4 Mar 2004 06:01:06 -0000 1.15
+++ BuildMM.pm 26 Jun 2004 19:41:53 -0000 1.16
@@ -77,7 +77,29 @@
}
}
- my $libs = join ' ', $build->apache_libs, $build->modperl_libs;
+ my $libs;
+ my @libs = ();
+ if (Apache::Build::WIN32) {
+ # in order to decouple APR/APR::* from mod_perl.so,
+ # link these modules against the static aprext.lib,
+ # rather than mod_perl.lib (which would demand mod_perl.so
+ # be available). For other modules, use mod_perl.lib as
+ # usual. This is done for APR in xs/APR/APR/Makefile.PL.
+ my $aprext = catfile $build->{cwd},
+ qw(blib arch Apache2 auto aprext aprext.lib);
+ my $name = $args{NAME};
+ if ($name =~ /^APR::\w+$/) {
+ @libs = ($build->apache_libs, $aprext);
+ }
+ else {
+ @libs = ($build->apache_libs, $build->modperl_libs);
+ }
+ }
+ else {
+ @libs = ($build->apache_libs, $build->modperl_libs);
+ }
+ $libs = join ' ', @libs;
+
my $ccflags = $build->perl_ccopts . $build->ap_ccopts;
my @opts = (
1.22 +5 -1 modperl-2.0/xs/APR/APR/Makefile.PL
Index: Makefile.PL
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/APR/Makefile.PL,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- Makefile.PL 22 Jun 2004 22:09:27 -0000 1.21
+++ Makefile.PL 26 Jun 2004 19:41:54 -0000 1.22
@@ -5,6 +5,7 @@
use ModPerl::BuildMM ();
use Apache::Build ();
use Config;
+use File::Spec::Functions;
use constant WIN32 => Apache::Build::WIN32;
use constant SOLARIS => $^O eq 'solaris';
@@ -30,6 +31,9 @@
if (WIN32) {
$libs =~ s{/libpath:}{-L}g;
$libs =~ s{(\w+)\.lib}{-l$1}g;
+ # include the static aprext.lib
+ my $aprext = catdir $build->{cwd}, qw(blib arch Apache2 auto aprext);
+ $libs .= qq{ -L"$aprext" -laprext };
}
if (SOLARIS && $libs) {
@@ -68,7 +72,7 @@
$src{$cfile} = "$srcdir/$cfile";
}
-$args{OBJECT} = "APR.o @obj";
+$args{OBJECT} = WIN32 ? "APR.o" : "APR.o @obj";
$args{clean} = { FILES => "@clean" };
ModPerl::BuildMM::WriteMakefile(%args);
1.1 modperl-2.0/xs/APR/aprext/Makefile.PL
Index: Makefile.PL
===================================================================
use strict;
use warnings;
use lib qw(../lib);
use ModPerl::BuildMM ();
use Apache::Build ();
my $srcdir = '../../../src/modules/perl';
my @names = map { "modperl_$_" } (qw(error bucket),
map { "common_$_" } qw(util log));
my(@obj, @clean, %src);
for (@names) {
push @obj, join '.', $_, 'o';
my $cfile = join '.', $_, 'c';
push @clean, $cfile;
$src{$cfile} = "$srcdir/$cfile";
}
my @skip = qw(dynamic test);
push @skip, q{static} unless Apache::Build::WIN32;
my %args = (NAME => 'aprext',
VERSION_FROM => '../APR/APR.pm',
SKIP => [ @skip ] ,
LINKTYPE => 'static',
OBJECT => "@obj",
clean => { FILES => "@clean" },
);
ModPerl::BuildMM::WriteMakefile(%args);
sub MY::postamble {
my $self = shift;
my $string = $self->ModPerl::BuildMM::MY::postamble;
$string .= join '', map {
"$_: $src{$_}\n\t\$(CP) $src{$_} .\n";
} keys %src;
return $string;
}
1.1 modperl-2.0/xs/APR/aprext/.cvsignore
Index: .cvsignore
===================================================================
pm_to_blib
Makefile
*.c
*.bs
glue_pods
blibdirs