dougm 00/04/21 12:43:38
Modified: . 00README_FIRST Makefile.PL
lib/Apache Build.pm
lib/ModPerl Code.pm
src/modules/perl .cvsignore
Log:
get some decent build stuff in place
Revision Changes Path
1.3 +27 -3 modperl-2.0/00README_FIRST
Index: 00README_FIRST
===================================================================
RCS file: /home/cvs/modperl-2.0/00README_FIRST,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- 00README_FIRST 2000/04/18 00:29:52 1.2
+++ 00README_FIRST 2000/04/21 19:43:33 1.3
@@ -16,19 +16,34 @@
mod_perl-2.0 will still work with an out-of-the-box Perl, but will
only be useful if your mpm is prefork (which is much like 1.3.x)
-in either case, in this directory run:
+to build mod_perl static:
-% perl Makefile.PL -c -ma
+% perl Makefile.PL && make libmodperl.a
% cd ../apache-2.0/src
% ./configure --prefix=$HOME/apache-2.0 --with-mpm=mpmt_pthread
% patch -p1 < ../modperl-2.0/patches/link-hack.pat
% make
+to build mod_perl dynamic:
+
+% perl Makefile.PL && make libmodperl.so
+
+(note the dso-link-hack.pat is need for my suse-6.1, might be
+different for your platform)
+
+% cd ../apache-2.0/src
+% ./configure --prefix=$HOME/apache-2.0 --with-mpm=mpmt_pthread
+% patch -p1 < ../modperl-2.0/patches/dso-link-hack.pat
+% make
+
as for httpd.conf, mine looks something like so at the moment:
#same as using the MOD_PERL_TRACE environment variable
+#if dynamic build
+LoadModule perl_module libexec/libmodperl.so
+
PerlTrace all
#only with -Dusethreads
@@ -39,5 +54,14 @@
#directive passes arbitrary command line switches to perl
PerlSwitches -T /home/dougm/test/startup.pl
+
+it is possible to configure Perl*Handlers, but there is not yet an
+interface back into Apache, e.g.
+
+PerlLogHandler MyLog::handler
+
+sub MyLog::handler {
+ warn "hey, it works!";
+}
---dougm 04/17
+--dougm 04/21
1.11 +58 -27 modperl-2.0/Makefile.PL
Index: Makefile.PL
===================================================================
RCS file: /home/cvs/modperl-2.0/Makefile.PL,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Makefile.PL 2000/04/20 18:28:14 1.10
+++ Makefile.PL 2000/04/21 19:43:33 1.11
@@ -3,6 +3,7 @@
use warnings;
use ExtUtils::Embed ();
+use ExtUtils::MakeMaker qw(WriteMakefile);
use lib qw(lib);
use Apache::Build ();
@@ -13,18 +14,21 @@
my $build = Apache::Build->new;
my $code = ModPerl::Code->new;
-#quick hack until build system is complete
-#e.g.
-#perl Makefile.PL -c -ma MP_DEBUG=1 (configure and 'make all' debug mode)
-#perl Makefile.PL -mc (make clean)
-{
- use Getopt::Std;
- my %opts;
- getopts('Ecm:', \%opts);
- configure() if $opts{c};
- make(\%opts) if $opts{m};
+if ($build->{MP_CPP}) {
+ make();
+ exit;
}
+configure();
+
+WriteMakefile(
+ NAME => 'mod_perl',
+ VERSION => $VERSION,
+ clean => {
+ FILES => "@{ clean_files() }",
+ },
+);
+
sub configure {
system_sanity_check();
set_modperl_version();
@@ -46,6 +50,8 @@
$build->save_ldopts;
$code->generate;
+
+ $build->write_src_makefile;
}
sub echo_cmd {
@@ -55,23 +61,18 @@
}
sub make {
- my $opts = shift;
- return clean() if $opts->{m} eq 'c';
-
my $ccopts = $build->ccopts;
my @inc = $build->inc;
- my($cc, $ar) = map { $build->perl_config($_) } qw(cc ar);
+ my $cc = $build->perl_config('cc');
chdir $code->path;
- $ccopts .= " -E" if $opts->{E};
+ $ccopts .= " -E" if $build->{MP_CPP};
for (sort { (stat $b)[9] <=> (stat $a)[9] } @{ $code->c_files }) {
echo_cmd "$cc $ccopts @inc -c $_";
}
- echo_cmd "$ar crv libmodperl.a @{ $code->o_files }";
-
chdir $build->cwd;
}
@@ -81,17 +82,11 @@
unlink $file;
}
-sub clean {
- for ($build->clean_files) {
- echo_unlink $_;
- }
+sub clean_files {
+ my $path = $code->path;
- chdir $code->path;
- my @files = $code->clean_files;
- for (@files, <*.o>, <*.a>) {
- echo_unlink $_;
- }
- chdir $build->cwd;
+ return [@{ $build->clean_files },
+ map { "$path/$_"} @{ $code->clean_files }];
}
sub set_modperl_version {
@@ -150,3 +145,39 @@
}
}
+sub MY::top_targets {
+ my $self = shift;
+ my $string = $self->MM::top_targets;
+ my $path = $code->path;
+
+ for (qw(SHARED STATIC)) {
+ $string .= <<EOF;
+
+$build->{"MODPERL_LIB_$_"}:
+ @(cd $path && \$(MAKE) \$\@);
+
+EOF
+ }
+
+ $string;
+}
+
+sub MY::clean {
+ my $self = shift;
+ my $string = $self->MM::clean(@_);
+ my $path = $code->path;
+ $string .= "\t-cd $path && \$(MAKE) clean\n";
+ $string;
+}
+
+sub MY::postamble {
+ my $i = 0;
+ print "you may now run:\n";
+
+ for (qw(SHARED STATIC)) {
+ print qq(make $build->{"MODPERL_LIB_$_"}\n);
+ print " - or - \n" unless $i++;
+ }
+
+ '';
+}
1.10 +111 -2 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.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Build.pm 2000/04/21 07:13:57 1.9
+++ Build.pm 2000/04/21 19:43:34 1.10
@@ -6,6 +6,8 @@
use Config;
use Cwd ();
use ExtUtils::Embed ();
+use ModPerl::Code ();
+
use constant is_win32 => $^O eq 'MSWin32';
use constant IS_MOD_PERL_BUILD => grep { -e "$_/lib/mod_perl.pm" } qw(. ..);
@@ -106,7 +108,6 @@
return $Config{$key} ? $Config{$key} : '';
}
-
sub find_in_inc {
my $name = shift;
for (@INC) {
@@ -280,6 +281,7 @@
my $self = bless {
cwd => Cwd::fastcwd(),
param_qr => qr([\s=]+),
+ MP_LIBNAME => 'libmodperl',
@_,
}, $class;
@@ -298,11 +300,12 @@
my %default_files = (
'build_config' => 'lib/Apache/BuildConfig.pm',
'ldopts' => 'src/modules/perl/ldopts',
+ 'makefile' => 'src/modules/perl/Makefile',
);
sub clean_files {
my $self = shift;
- map { $self->default_file($_) } keys %default_files;
+ [map { $self->default_file($_) } keys %default_files];
}
sub default_file {
@@ -562,6 +565,112 @@
close $fh;
$self->httpd_version_cache($dir, $version);
+}
+
+#--- generate Makefile ---
+
+sub canon_make_attr {
+ my($self, $name) = (shift, shift);
+
+ my $attr = join '_', 'MODPERL', uc $name;
+ $self->{$attr} = "@_";
+ "$attr = $self->{$attr}\n\n";
+}
+
+my @perl_config_pm =
+ qw(cc ld ar rm ranlib lib_ext dlext cccdlflags lddlflags optimize);
+
+sub write_src_makefile {
+ my $self = shift;
+ my $code = ModPerl::Code->new;
+ my $path = $code->path;
+
+ my $mf = $self->default_file('makefile');
+
+ 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');
+
+ print $fh $self->canon_make_attr('libname', $self->{MP_LIBNAME});
+
+ print $fh $self->canon_make_attr('lib_shared',
+ "$self->{MP_LIBNAME}.$self->{MODPERL_DLEXT}");
+
+ 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');
+
+ for my $method (qw(ccopts ldopts inc)) {
+ print $fh $self->canon_make_attr($method, $self->$method());
+ }
+
+ for my $method (qw(c_files o_files o_pic_files)) {
+ print $fh $self->canon_make_attr($method, @{ $code->$method() });
+ }
+
+ print $fh <<'EOF';
+
+MODPERL_LIB=$(MODPERL_LIBNAME)$(MODPERL_LIB_EXT)
+
+all: lib
+
+lib: $(MODPERL_LIB)
+
+MODPERL_CCFLAGS = $(MODPERL_INC) $(MODPERL_CCOPTS) $(MODPERL_OPTIMIZE)
+
+MODPERL_CCFLAGS_SHLIB = $(MODPERL_CCFLAGS) $(MODPERL_CCCDLFLAGS)
+
+$(MODPERL_LIBNAME)$(MODPERL_LIB_EXT): $(MODPERL_O_FILES)
+ $(MODPERL_RM_F) $@
+ $(MODPERL_AR) crv $@ $(MODPERL_O_FILES)
+ $(MODPERL_RANLIB) $@
+
+$(MODPERL_LIBNAME).$(MODPERL_DLEXT): $(MODPERL_O_PIC_FILES)
+ $(MODPERL_RM_F) $@
+ $(MODPERL_LD) $(MODPERL_LDDLFLAGS) -o $@ \
+ $(MODPERL_O_PIC_FILES) $(MODPERL_LDOPTS)
+ $(MODPERL_RANLIB) $@
+
+.SUFFIXES: .xs .c .o .lo
+
+.c.lo:
+ $(MODPERL_CC) $(MODPERL_CCFLAGS_SHLIB) \
+ -c $< && mv $*.o $*.lo
+
+.c.o:
+ $(MODPERL_CC) $(MODPERL_CCFLAGS) -c $<
+
+.xs.c:
+ $(MODPERL_XSUBPP) $*.xs >$@
+
+.xs.o:
+ $(MODPERL_XSUBPP) $*.xs >$*.c
+ $(MODPERL_CC) $(MODPERL_CCFLAGS) -c $*.c
+
+.xs.lo:
+ $(MODPERL_XSUBPP) $*.xs >$*.c
+ $(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_O_FILES): Makefile
+EOF
+
+ close $fh;
}
#--- generate MakeMaker parameter values ---
1.14 +2 -1 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.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Code.pm 2000/04/21 05:20:14 1.13
+++ Code.pm 2000/04/21 19:43:36 1.14
@@ -381,11 +381,12 @@
my @c_names = ('mod_perl', (map "modperl_$_", @c_src_names), @g_c_names);
sub c_files { [map { "$_.c" } @c_names] }
sub o_files { [map { "$_.o" } @c_names] }
+sub o_pic_files { [map { "$_.lo" } @c_names] }
my @g_h_names = map { "modperl_$_" } qw(hooks directives flags trace);
sub clean_files {
- (map { "$_.c" } @g_c_names), (map { "$_.h" } @g_h_names);
+ [(map { "$_.c" } @g_c_names), (map { "$_.h" } @g_h_names)];
}
sub noedit_warning {
1.4 +5 -0 modperl-2.0/src/modules/perl/.cvsignore
Index: .cvsignore
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/.cvsignore,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- .cvsignore 2000/04/17 21:30:29 1.3
+++ .cvsignore 2000/04/21 19:43:37 1.4
@@ -6,3 +6,8 @@
modperl_trace.h
modperl_xsinit.c
ldopts
+Makefile
+*.lo
+*.o
+*.a
+*.so