dougm 00/04/30 11:36:52
Modified: . Makefile.PL
lib/Apache Build.pm
lib/ModPerl Code.pm MM.pm
Log:
"discover" xs modules. since there is no list hardwired
any module can be unpacked in the mod_perl-2.xx directory
and built static
this stunt also make it possible to leave .xs files where
they are, unlike 1.xx where *.xs live in src/modules/perl
and are copied to subdir/ if DYNAMIC=1
Revision Changes Path
1.19 +21 -4 modperl-2.0/Makefile.PL
Index: Makefile.PL
===================================================================
RCS file: /home/cvs/modperl-2.0/Makefile.PL,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- Makefile.PL 2000/04/30 03:31:16 1.18
+++ Makefile.PL 2000/04/30 18:36:50 1.19
@@ -32,6 +32,8 @@
},
);
+post_configure();
+
sub configure {
system_sanity_check();
set_modperl_version();
@@ -48,14 +50,27 @@
printf "Configuring Apache/%s mod_perl/%s Perl/v%vd\n",
$httpd_version, $VERSION, $^V;
-
- $code->generate;
- $build->write_src_makefile;
+ for (@{ clean_files() }) {
+ unlink;
+ }
+ #ModPerl::MM will use Apache::BuildConfig in subdir/Makefile.PL's
$build->save;
+}
+
+sub post_configure {
+
+ #didn't exist until configure()
+ require Apache::BuildConfig;
+ #now have any data subdir/Makefile.PL's save, e.g. XS
+ $build = Apache::BuildConfig->new;
+
+ $build->write_src_makefile;
$build->save_ldopts;
+ $code->generate($build);
+
printf "Will build mod_perl %s as %s\n",
$build->is_dynamic ? "shared" : "static",
$build->{"MODPERL_LIB"};
@@ -63,6 +78,8 @@
if ($build->{MP_INST_APACHE2}) {
print "Will install Apache Perl modules into Apache2/\n";
}
+
+ $build->save;
}
sub echo_cmd {
@@ -190,7 +207,7 @@
my $self = shift;
#up one from the Apache2/ subdir
#so it can be found for 'use Apache2 ()'
- $self->{PM}->{'lib/Apache2.pm'} =~ s:^\$\(INST_LIB\):blib/lib:;
+ $self->{PM}->{'lib/Apache2.pm'} = "blib/lib/Apache2.pm";
'';
}
1.16 +93 -26 modperl-2.0/lib/Apache/Build.pm
Index: Build.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/Build.pm,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- Build.pm 2000/04/30 03:31:17 1.15
+++ Build.pm 2000/04/30 18:36:51 1.16
@@ -315,6 +315,12 @@
$self->{$key} ||= ($override || $default_files{$name});
}
+sub file_path {
+ my($self, $file) = @_;
+ return $file if $file =~ m:^/:;
+ join '/', $self->{cwd}, $file;
+}
+
sub freeze {
require Data::Dumper;
local $Data::Dumper::Terse = 1;
@@ -339,6 +345,8 @@
my($self, $file) = @_;
$file ||= $self->default_file('build_config');
+ $file = $self->file_path($file);
+
(my $obj = $self->freeze) =~ s/^/ /;
open my $fh, '>', $file or die "open $file: $!";
@@ -573,9 +581,70 @@
"$attr = $self->{$attr}\n\n";
}
+sub xsubpp {
+ my $self = shift;
+ my $xsubpp = join ' ', '$(MODPERL_PERLPATH)',
+ '$(MODPERL_PRIVLIBEXP)/ExtUtils/xsubpp',
+ '-typemap', '$(MODPERL_PRIVLIBEXP)/ExtUtils/typemap';
+ $xsubpp;
+}
+
+sub make_xs {
+ my($self, $fh) = @_;
+
+ print $fh $self->canon_make_attr(xsubpp => $self->xsubpp);
+
+ return [] unless $self->{XS};
+
+ my @files;
+ my @xs_targ;
+
+ while (my($name, $xs) = each %{ $self->{XS} }) {
+ #Foo/Bar.xs => Bar.c
+ (my $c = $xs) =~ s:.*/(\w+)\.xs$:$1.c:;
+ push @files, $c;
+
+ $xs = "../../../$xs"; #XXX
+
+ push @xs_targ, <<EOF;
+$c: $xs
+\t\$(MODPERL_XSUBPP) $xs > \$*.xsc && \$(MODPERL_MV) \$*.xsc \$@
+
+EOF
+ }
+
+ my %o = (xs_o_files => 'o', xs_o_pic_files => 'lo');
+
+ for my $ext (qw(xs_o_files xs_o_pic_files)) {
+ print $fh $self->canon_make_attr($ext, map {
+ (my $file = $_) =~ s/c$/$o{$ext}/; $file;
+ } @files);
+ }
+
+ print $fh $self->canon_make_attr(xs_clean_files => @files);
+
+ \@xs_targ;
+}
+
my @perl_config_pm =
- qw(cc ld ar rm ranlib lib_ext dlext cccdlflags lddlflags optimize);
+ qw(cc ld ar rm ranlib lib_ext dlext cccdlflags lddlflags optimize
+ perlpath privlibexp);
+
+sub make_tools {
+ my($self, $fh) = @_;
+ #XXX win32
+
+ for (@perl_config_pm) {
+ print $fh $self->canon_make_attr($_, $self->perl_config($_));
+ }
+
+ print $fh $self->canon_make_attr('RM_F' => #XXX
+ $self->{MODPERL_RM} . ' -f');
+
+ print $fh $self->canon_make_attr(MV => 'mv');
+}
+
sub write_src_makefile {
my $self = shift;
my $code = ModPerl::Code->new;
@@ -585,12 +654,7 @@
open my $fh, '>', $mf or die "open $mf: $!";
- for (@perl_config_pm) {
- print $fh $self->canon_make_attr($_, $self->perl_config($_));
- }
-
- print $fh $self->canon_make_attr('RM_F' => #XXX
- $self->{MODPERL_RM} . ' -f');
+ $self->make_tools($fh);
print $fh $self->canon_make_attr('libname', $self->{MP_LIBNAME});
@@ -600,11 +664,8 @@
print $fh $self->canon_make_attr('lib_static',
"$self->{MP_LIBNAME}$self->{MODPERL_LIB_EXT}");
- print $fh $self->canon_make_attr('xsubpp',
- join '/',
- $self->perl_config('privlibexp'),
- 'xsubpp');
+
print $fh $self->canon_make_attr('libperl',
join '/',
$self->perl_config('archlibexp'),
@@ -623,25 +684,30 @@
$self->{MODPERL_LIB_SHARED} :
$self->{MODPERL_LIB_STATIC});
+ my $xs_targ = $self->make_xs($fh);
+
print $fh <<'EOF';
+MODPERL_CCFLAGS = $(MODPERL_INC) $(MODPERL_CCOPTS) $(MODPERL_OPTIMIZE)
-all: lib
+MODPERL_CCFLAGS_SHLIB = $(MODPERL_CCFLAGS) $(MODPERL_CCCDLFLAGS)
-lib: $(MODPERL_LIB)
+MODPERL_OBJS = $(MODPERL_O_FILES) $(MODPERL_XS_O_FILES)
-MODPERL_CCFLAGS = $(MODPERL_INC) $(MODPERL_CCOPTS) $(MODPERL_OPTIMIZE)
+MODPERL_PIC_OBJS = $(MODPERL_O_PIC_FILES) $(MODPERL_XS_O_PIC_FILES)
-MODPERL_CCFLAGS_SHLIB = $(MODPERL_CCFLAGS) $(MODPERL_CCCDLFLAGS)
+all: lib
+
+lib: $(MODPERL_LIB)
-$(MODPERL_LIBNAME)$(MODPERL_LIB_EXT): $(MODPERL_O_FILES)
+$(MODPERL_LIBNAME)$(MODPERL_LIB_EXT): $(MODPERL_OBJS)
$(MODPERL_RM_F) $@
- $(MODPERL_AR) crv $@ $(MODPERL_O_FILES)
+ $(MODPERL_AR) crv $@ $(MODPERL_OBJS)
$(MODPERL_RANLIB) $@
-$(MODPERL_LIBNAME).$(MODPERL_DLEXT): $(MODPERL_O_PIC_FILES)
+$(MODPERL_LIBNAME).$(MODPERL_DLEXT): $(MODPERL_PIC_OBJS)
$(MODPERL_RM_F) $@
$(MODPERL_LD) $(MODPERL_LDDLFLAGS) -o $@ \
- $(MODPERL_O_PIC_FILES) $(MODPERL_LDOPTS)
+ $(MODPERL_PIC_OBJS) $(MODPERL_LDOPTS)
$(MODPERL_RANLIB) $@
.SUFFIXES: .xs .c .o .lo
@@ -665,16 +731,17 @@
$(MODPERL_CC) $(MP_CCFLAGS_SHLIB) -c $*.c && mv $*.o $*.lo
clean:
- $(MODPERL_RM_F) *.a *.so
- $(MODPERL_RM_F) $(MODPERL_O_FILES)
- $(MODPERL_RM_F) $(MODPERL_O_FILES)
- $(MODPERL_RM_F) $(MODPERL_O_PIC_FILES)
- $(MODPERL_RM_F) $(MODPERL_CLEAN_FILES)
+ $(MODPERL_RM_F) *.a *.so *.xsc *.o *.lo \
+ $(MODPERL_CLEAN_FILES) \
+ $(MODPERL_XS_CLEAN_FILES)
-$(MODPERL_O_FILES): $(MODPERL_H_FILES) Makefile
-$(MODPERL_O_PIC_FILES): $(MODPERL_H_FILES) Makefile
+$(MODPERL_OBJS): $(MODPERL_H_FILES) Makefile
+$(MODPERL_PIC_OBJS): $(MODPERL_H_FILES) Makefile
$(MODPERL_LIB): $(MODPERL_LIBPERL)
+
EOF
+
+ print $fh @$xs_targ;
close $fh;
}
1.24 +4 -2 modperl-2.0/lib/ModPerl/Code.pm
Index: Code.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- Code.pm 2000/04/30 03:31:17 1.23
+++ Code.pm 2000/04/30 18:36:51 1.24
@@ -448,7 +448,7 @@
}
sub generate {
- my $self = shift;
+ my($self, $build) = @_;
for my $s (values %sources) {
for (qw(h c)) {
@@ -474,7 +474,9 @@
my $xsinit = "$self->{path}/modperl_xsinit.c";
warn "generating...$xsinit\n";
- ExtUtils::Embed::xsinit($xsinit);
+ #create bootstrap method for static xs modules
+ my $static_xs = [keys %{ $build->{XS} }];
+ ExtUtils::Embed::xsinit($xsinit, 1, $static_xs);
warn "generating...", $self->generate_apache2_pm, "\n";
}
1.2 +38 -9 modperl-2.0/lib/ModPerl/MM.pm
Index: MM.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/ModPerl/MM.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- MM.pm 2000/04/30 03:28:36 1.1
+++ MM.pm 2000/04/30 18:36:52 1.2
@@ -16,14 +16,19 @@
$$string =~ s/($targ\s+::)/$1 $add /;
}
+sub build_config {
+ my $key = shift;
+ require Apache::BuildConfig;
+ my $build = Apache::BuildConfig->new;
+ return $build unless $key;
+ $build->{$key};
+}
+
#strip the Apache2/ subdir so things are install where they should be
sub install {
my $hash = shift;
- require Apache::BuildConfig;
- my $build = Apache::BuildConfig->new;
-
- if ($build->{MP_INST_APACHE2}) {
+ if (build_config('MP_INST_APACHE2')) {
while (my($k,$v) = each %$hash) {
delete $hash->{$k};
$k =~ s:/Apache2$::;
@@ -51,13 +56,12 @@
ExtUtils::MakeMaker::WriteMakefile(@_);
}
-package ModPerl::MM::MY;
+my %always_dynamic = map { $_, 1 } qw(Apache::Leak);
-sub constants {
+sub ModPerl::MM::MY::constants {
my $self = shift;
- require Apache::BuildConfig;
- my $build = Apache::BuildConfig->new;
+ my $build = build_config();
#install everything relative to the Apache2/ subdir
if ($build->{MP_INST_APACHE2}) {
@@ -65,14 +69,39 @@
$self->{INST_LIB} .= '/Apache2';
}
+ #"discover" xs modules. since there is no list hardwired
+ #any module can be unpacked in the mod_perl-2.xx directory
+ #and built static
+
+ #this stunt also make it possible to leave .xs files where
+ #they are, unlike 1.xx where *.xs live in src/modules/perl
+ #and are copied to subdir/ if DYNAMIC=1
+
+ unless ($build->{MP_DYNAMIC}) {
+ #skip .xs -> .so if we are linking static
+ my $name = $self->{NAME};
+ unless ($always_dynamic{$name}) {
+ if (my($xs) = keys %{ $self->{XS} }) {
+ $self->{HAS_LINK_CODE} = 0;
+ print "$name will be linked static\n";
+ #propagate static xs module to src/modules/perl/Makefile
+ $build->{XS}->{$name} = join '/',
+ $self->{BASEEXT}, $xs;
+ $build->save;
+ }
+ }
+ }
+
$self->MM::constants;
}
-sub libscan {
+sub ModPerl::MM::MY::libscan {
my($self, $path) = @_;
+
return '' if $path =~ m/\.(pl|cvsignore)$/;
return '' if $path =~ m:\bCVS/:;
return '' if $path =~ m/~$/;
+
$path;
}