stas 2003/03/23 19:00:20
Modified: lib/Apache Build.pm lib/ModPerl WrapXS.pm . Changes Log: adjust the generated Makefile's to properly build on aix (tested on powerpc-ibm-aix5.1.0.0) Revision Changes Path 1.114 +71 -10 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.113 retrieving revision 1.114 diff -u -r1.113 -r1.114 --- Build.pm 18 Mar 2003 05:48:04 -0000 1.113 +++ Build.pm 24 Mar 2003 03:00:19 -0000 1.114 @@ -20,9 +20,12 @@ use constant HAS_ITHREADS => $Config{useithreads} && ($Config{useithreads} eq 'define'); +use constant AIX => $^O eq 'aix'; use constant DARWIN => $^O eq 'darwin'; -use constant WIN32 => $^O eq 'MSWin32'; -use constant MSVC => WIN32() && ($Config{cc} eq 'cl'); +use constant HPUX => $^O eq 'hpux'; +use constant WIN32 => $^O eq 'MSWin32'; + +use constant MSVC => WIN32() && ($Config{cc} eq 'cl'); use constant IS_MOD_PERL_BUILD => grep { -e "$_/lib/mod_perl.pm" } qw(. ..); @@ -104,6 +107,7 @@ #if we are building mod_perl via apxs, apxs should already be known #these extra tries are for things built outside of mod_perl #e.g. libapreq + # XXX: this may pick a wrong apxs version! push @trys, Apache::TestConfig::which('apxs'), '/usr/local/apache/bin/apxs'; @@ -187,7 +191,7 @@ my $ld = $self->perl_config('ld'); - if ($^O eq 'hpux' and $ld eq 'ld') { + if (HPUX && $ld eq 'ld') { while ($ldopts =~ s/-Wl,(\S+)/$1/) { my $cp = $1; (my $repl = $cp) =~ s/,/ /g; @@ -281,6 +285,11 @@ $cflags; } +sub ldopts_prefix { + my $self = shift; + $self->perl_config('ld') eq 'ld' ? '' : "-Wl,"; +} + sub perl_config_optimize { my($self, $val) = @_; @@ -310,6 +319,33 @@ } } + if (AIX) { + my $Wl = $self->ldopts_prefix; + + # it's useless to import symbols from libperl.so this way, + # because perl.exp is incomplete. a better way is to link + # against -lperl which has all the symbols + $val =~ s|${Wl}-bI:\$\(PERL_INC\)/perl\.exp||; + # also in the case of Makefile.modperl PERL_INC is defined + + # this works with at least ld(1) on powerpc-ibm-aix5.1.0.0: + # -berok ignores symbols resolution problems (they will be + # resolved at run-time + # -brtl prepares the object for run-time loading + # LDFLAGS already inserts -brtl + $val .= " ${Wl}-berok"; + # XXX: instead of -berok, could make sure that we have: + # -Lpath/to/CORE -lperl + # -bI:$path/apr.exp -bI:$path/aprutil.exp -bI:$path/httpd.exp + # -bI:$path/modperl_*.exp + # - don't import modperl_*.exp in Makefile.modperl which + # exports -bE:$path/modperl_*.exp + # - can't rely on -bI:$path/perl.exp, because it's incomplete, + # use -lperl instead + # - the issue with using apr/aprutil/httpd.exp is to pick the + # right path if httpd wasn't yet installed + } + $val; } @@ -913,7 +949,18 @@ sub export_files_MSWin32 { my $self = shift; - "-def:$self->{cwd}/xs/modperl.def"; + my $xs_dir = $self->file_path("xs"); + "-def:$xs_dir/modperl.def"; +} + +sub export_files_aix { + my $self = shift; + + my $Wl = $self->ldopts_prefix; + # there are several modperl_*.exp, not just $(BASEEXT).exp + # $(BASEEXT).exp resolves to modperl_global.exp + my $xs_dir = $self->file_path("xs"); + join " ", map "${Wl}-bE:$xs_dir/modperl_$_.exp", qw(inline ithreads); } sub dynamic_link_header_default { @@ -945,6 +992,14 @@ "\t$defs" . ' -out:$@'; } +sub dynamic_link_aix { + my $self = shift; + my $link = $self->dynamic_link_header_default . + "\t" . $self->export_files_aix . " \\\n" . + "\t" . '-o $@' . " \n" . + "\t" . '$(MODPERL_RANLIB) $@'; +} + sub dynamic_link { my $self = shift; my $link = \&{"dynamic_link_$^O"}; @@ -999,6 +1054,11 @@ print $fh $self->canon_make_attr('libname', $self->{MP_LIBNAME}); print $fh $self->canon_make_attr('dlext', 'so'); #always use .so + if (AIX) { + my $xs_dir = $self->file_path("xs"); + print $fh "BASEEXT = $xs_dir/modperl_global\n\n"; + } + my %libs = ( dso => "$self->{MP_LIBNAME}.$self->{MODPERL_DLEXT}", static => "$self->{MP_LIBNAME}$self->{MODPERL_LIB_EXT}", @@ -1121,16 +1181,17 @@ #--- generate MakeMaker parameter values --- +sub otherldflags_default { + my $self = shift; + # e.g. aix's V:ldflags feeds -brtl and other flags + $self->perl_config('ldflags'); +} + sub otherldflags { my $self = shift; my $flags = \&{"otherldflags_$^O"}; - return "" unless defined &$flags; + return $self->otherldflags_default unless defined &$flags; $flags->($self); -} - -#XXX: install *.exp / search @INC -sub otherldflags_aix { - ""; #XXX: -bI:*.exp files } sub typemaps { 1.51 +12 -2 modperl-2.0/lib/ModPerl/WrapXS.pm Index: WrapXS.pm =================================================================== RCS file: /home/cvs/modperl-2.0/lib/ModPerl/WrapXS.pm,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- WrapXS.pm 22 Mar 2003 07:21:36 -0000 1.50 +++ WrapXS.pm 24 Mar 2003 03:00:19 -0000 1.51 @@ -19,6 +19,8 @@ my(@xs_includes) = ('mod_perl.h', map "modperl_xs_$_.h", qw(sv_convert util typedefs)); +my @global_structs = qw(perl_module MP_debug_level); + sub new { my $class = shift; @@ -812,13 +814,21 @@ my $header = \&{"export_file_header_$ext"}; my $format = \&{"export_file_format_$ext"}; - while (my($name, $table) = each %files) { - my $handles = $self->open_export_files($name, $ext); + while (my($key, $table) = each %files) { + my $handles = $self->open_export_files($key, $ext); my %seen; #only write header once if this is a single file for my $fh (values %$handles) { next if $seen{$fh}++; print $fh $self->$header(); + } + + # add the symbols which aren't the function table + if ($key eq 'modperl') { + my $fh = $handles->{global}; + for my $name (@global_structs) { + print $fh $self->$format($name); + } } for my $entry (@$table) { 1.156 +3 -0 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.155 retrieving revision 1.156 diff -u -r1.155 -r1.156 --- Changes 22 Mar 2003 07:36:57 -0000 1.155 +++ Changes 24 Mar 2003 03:00:19 -0000 1.156 @@ -10,6 +10,9 @@ =item 1.99_09-dev +adjust the generated Makefile's to properly build on aix (tested on +powerpc-ibm-aix5.1.0.0) [Stas] + the build now automatically glues the .pod files to the respective .pm files, so one can use perldoc on .pm files to read the documentation. [Stas]