for my $file ($dh->read) { next unless $file =~ /\.xs$/; push @xs_names, module_name_from_xs("$dir/$file"); push @xs_files, $file; unless ($mani_src{"$dir/$file"}) { cp "$dir/$file", $d; print "Adding module `$xs_names[-1]' to httpd\n"; } } #print "XS_NAMES=@xs_names\n"; #print "XS_FILES=@xs_files\n"; #XXX think about this some more iedit $mf, "s/^#STATIC_SRC.*/STATIC_SRC = @xs_files/"; iedit $mf, "s/^#STATIC_EXTS.*/STATIC_EXTS = @xs_names/";
Apache::MyConfig - build options access
use Apache::MyConfig; die unless \$Apache::MyConfig::Setup{PERL_FILE_API};
Apache::MyConfig module provides access to the various hooks and features set when mod_perl is built. This circumvents the need to set up a live server just to find out if a certain callback hook is available.
Itterate through \%Apache::MyConfig::Setup to get obtain build information then see Appendix B of the Eagle book for more detail on each key.
EOT close FH;
}
# obtain the Apache and mod_perl lib and include directories for Win32 sub win32_inc_and_lib {
my $modperl_src = win32_fix_path(cwd) . '/src'; $win32_path{MODPERL_INC} = $modperl_src . '/modules/perl'; $win32_path{MODPERL_LIB} = ($win32_args{DEBUG} == 1) ? $modperl_src . '/modules/win32/Debug' : $modperl_src . '/modules/win32/Release'; unless ( -d $win32_args{APACHE_SRC}) { opendir(DIR, '../') or die "Cannot read parent directory: $!\n"; my @dirs = map {"../$_"} grep {/apache/ and -d "../$_"} readdir DIR; closedir DIR or die "Cannot close parent directory: $!\n"; die "Cannot find the apache sources\n" unless ($win32_args{APACHE_SRC} = find_dir(\@dirs, 'apache source')); } $win32_args{APACHE_SRC} = win32_fix_path($win32_args{APACHE_SRC}); if (-d "$win32_args{APACHE_SRC}/libexec") { $win32_path{APACHE_LIB} = $win32_args{APACHE_SRC} . '/libexec'; $win32_path{APACHE_INC} = $win32_args{APACHE_SRC} . '/include'; $win32_args{APACHE_VERS} = httpd_version($win32_path{APACHE_INC}, 1); } else { $win32_args{APACHE_SRC} .= '/src' unless $win32_args{APACHE_SRC} =~ /src$/; $win32_path{APACHE_INC} = $win32_args{APACHE_SRC} . '/include'; $win32_args{APACHE_VERS} = httpd_version($win32_path{APACHE_INC}, 1); $win32_path{APACHE_LIB} = ($win32_args{DEBUG} == 1) ? $win32_args{APACHE_SRC} . ($win32_args{APACHE_VERS} < 1315 ? '/CoreD' : '/Debug') : $win32_args{APACHE_SRC} . ($win32_args{APACHE_VERS} < 1315 ? '/CoreR' : '/Release'); } die "Cannot find ApacheCore.lib under $win32_path{APACHE_LIB}\n" unless -f "$win32_path{APACHE_LIB}/ApacheCore.lib"; die "Cannot find httpd.h under $win32_path{APACHE_INC}\n" unless -f "$win32_path{APACHE_INC}/httpd.h"; if ($win32_args{INSTALL_DLL} ) { $win32_args{INSTALL_DLL} = win32_fix_path($win32_args{INSTALL_DLL}); unless ( -d $win32_args{INSTALL_DLL}) { my @dirs = grep {-d} ('\Program Files\Apache Group\Apache\modules', '\Apache\modules', '\Program Files\Apache\modules'); $win32_args{INSTALL_DLL} = find_dir(\@dirs, 'Apache/modules'); if ($win32_args{INSTALL_DLL} and -d $win32_args{INSTALL_DLL}) { $win32_args{INSTALL_DLL} = win32_fix_path($win32_args{INSTALL_DLL}); } else { print <<'END';
**** The Apache/modules directory was not found. ******* **** Please install mod_perl.so manually. *******
END } } }
if ($win32_args{INSTALL_LIB} ) { $win32_args{INSTALL_LIB} = win32_fix_path($win32_args{INSTALL_LIB}); unless ( -d $win32_args{INSTALL_LIB}) { my @dirs = grep {-d} ('\Program Files\Apache Group\Apache\libexec', '\Apache\libexec', '\Program Files\Apache\libexec'); $win32_args{INSTALL_LIB} = find_dir(\@dirs, 'Apache/libexec'); if ($win32_args{INSTALL_LIB} and -d $win32_args{INSTALL_LIB}) { $win32_args{INSTALL_LIB} = win32_fix_path($win32_args{INSTALL_LIB}); } else { print <<'END';
**** The Apache/libexec directory was not found. ******* **** Please install mod_perl.lib manually. *******
END } } } }
# fix mod_perl.dsp with the perl and apache inc and lib directories sub win32_fix_dsp {
my $amp = 'src/modules/win32'; my $dsp = 'mod_perl.dsp'; unless ( -f "$amp/$dsp.orig") { rename("$amp/$dsp", "$amp/$dsp.orig") or die "Couldn't rename $amp/$dsp: $!\n"; } my $perl_inc = win32_fix_path_dsp("$Config{archlibexp}/CORE"); open OLDDSP, "$amp/$dsp.orig" or die "Couldn't read $amp/$dsp.orig: $!\n"; open NEWDSP, ">$amp/$dsp" or die "Couldn't create $amp/$dsp: $!\n"; while (<OLDDSP>) { if (/^SOURCE=.*ApacheCore\.lib/) { printf NEWDSP "SOURCE=%s\n", win32_fix_path_dsp("$win32_path{APACHE_LIB}/ApacheCore.lib"); } elsif (/^SOURCE=.*perl(56)?\.lib/) { print NEWDSP qq{SOURCE=$perl_inc\\$Config{libperl}\n}; } elsif (/ADD CPP/) { my $apache_inc = win32_fix_path_dsp($win32_path{APACHE_INC}); s!/I "\\Perl\\lib\\CORE"!/I "$apache_inc" /I "$apache_inc/../os/win32" /I "$perl_inc"!; s!(/D "WIN32")!$1 /D "EAPI" ! if $win32_args{EAPI}; if ($] < 5.008006) { s!(/D "_MSWSOCK_")!/D "_WINSOCK2API_" $1!; } print NEWDSP $_; } else { print NEWDSP $_; } } close OLDDSP; close NEWDSP; return; }
# find a directory of type $type, given some possible $dirs sub find_dir { my ($dirs, $type) = @_;
my $j = 0; my $src; while (1) { $src = @$dirs > 0 ? $dirs->[$j] : ''; $src = prompt("\nWhere is your $type directory? (q to quit)", $src); return undef if $src eq 'q'; return $src if -d $src; print qq{'$src': no such directory\n}; $j = ($j == @$dirs-1) ? 0 : $j + 1; } }
# fix a path for Win32 Makefile sub win32_fix_path { my $path = shift;
$path = File::Spec->rel2abs($path) if not File::Spec->file_name_is_absolute($path); $path = Win32::GetShortPathName($path) if $path =~ / /; $path =~ tr!\\!/!; $path =~ s!/$!!; return $path; }
# fix a path for mod_perl.dsp sub win32_fix_path_dsp { local $_ = shift;
tr!/!\\!; return $_; }
#in version 1.2505 of Embed.pm we could just import these instead of using ``, #but it might require lots of people to upgrade
sub ccopts {
unless ($Embed::ccopts) { $Embed::ccopts = "$Config{ccflags} -I$Config{archlibexp}/CORE"; if ($USE_THREADS) { $Embed::ccopts .= " -DPERL_THREADS"; } } $Embed::ccopts; }
sub ldopts {
$Embed::ldopts ||= `$^X -MExtUtils::Embed -e ldopts`; if ($^O eq "aix") { $Embed::ldopts =~ s,(-bE:)(perl\.exp),$1$Config{archlibexp}/$2,; } $Embed::ldopts; }
sub perl_version {
my $v = "$]"; $v =~ s/\.//g; $v .= "0" while length($v) < 6; $v; }
#for linking third-party xs modules static built w/ MakeMaker's: 'make static' #must have when the xs module is compiled with profiling `-pg -a' flags sub add_static_ar {
$PERL_STATIC_AR ||= ""; my $cur = $APACHE_SRC =~ /^../ ? "$PWD/" : ""; for (qw(blib/arch/auto arch/auto)) { last if -d ($ar_dir = "$APACHE_SRC/modules/perl/$_"); $ar_dir = ""; } return unless -d $ar_dir; finddepth( sub { return unless /^[A-Z]\w+\.a$/; (my $rel = $File::Find::dir) =~ s:$APACHE_SRC/?::; (my $mod = $rel) =~ s:.*auto/::; $mod =~ s,/,::,; print "linking static $mod => $rel/$_\n"; $PERL_STATIC_AR .= $cur . "$File::Find::dir/$_ "; $PERL_STATIC_EXTS .= "$mod "; }, $ar_dir ); }
sub APACI::init {
return undef if $Is_Win32; my $lib_cfg; if ($USE_APXS) { $lib_cfg = "apaci/mod_perl.config"; chmod 0644, $lib_cfg; } elsif ($USE_APACI) { $lib_cfg = "$APACHE_SRC/modules/perl/mod_perl.config"; } else { return undef; } unless (File::Compare::compare($lib_cfg,"apaci/mod_perl.config") == 0) { #warn "mod_perl.config already edited\n"; #return undef; } my $apaci_cfg = FileHandle->new(">$lib_cfg") or die "can't open $lib_cfg $!"; my @static_src = (); for (@xs_mod_snames) { push @static_src, "$_.c"; } add_static_ar(); my $static_targets = ""; $static_targets = <<EOF unless $DYNAMIC; PERL_STATIC_EXTS = @xs_modules $PERL_STATIC_EXTS PERL_STATIC_SRCS = @static_src EOF $static_targets .= "PERL_STATIC_AR = $PERL_STATIC_AR\n" if $PERL_STATIC_AR; print $apaci_cfg <<EOF; ## ## mod_perl.config -- mod_perl shared configuration file ##
# mod_perl version MOD_PERL_VERSION = $VERSION
# Perl interpreter to use PERL = $^X LIBPERL = $LIBPERL
$static_targets
EOF
print $apaci_cfg <<EOF if defined $MOD_PERL_PREFIX;
# mod_perl installation prefix MOD_PERL_PREFIX = $MOD_PERL_PREFIX
for (qw(PERL_SECTIONS PERL_SSI PERL_TRACE)) { my $yes_no = $$_ ? "yes" : "no"; print $apaci_cfg "$_ = $yes_no\n"; } $yes_no = 'no'; $yes_no = 'yes' if $USE_THREADS; print $apaci_cfg "PERL_THREADS = $yes_no\n"; return $apaci_cfg; }
sub phat_warn { my ($msg, $abort) = @_;
my $level = $abort ? "ERROR" : "WARNING"; warn <<EOF; ************* $level ************* $msg
************* $level ************* EOF if ($abort) { exit 1; } else { sleep 5; } }
sub system_sanity_check {
return if $Is_Win32; my $ccflags = $Config{'ccflags'}; for (split /\s+/, $ccflags) { next unless s/^-I//; my $header = "$_/ap_mmn.h"; if (-e $header) { phat_warn(<<EOF); Apache headers found in unexpected location: ``$_'', suggestions: *) Remove via ``rpm -e apache'' *) Remove by hand *) Complain to your os vendor about their poor layout choice *) Complain to your sysadmin about their poor layout choice EOF } } my $ld = basename $Config{ld}; if ($^O eq 'hpux' and ($USE_DSO or $USE_APXS) and $ld eq 'ld') { unless ($ccflags =~ /\+z/i) { my $switch = $] >= 5.006 ? 'A' : 'D'; phat_warn(<<EOF); mod_perl is unlikely to link with your libperl, suggestions: *) Rebuild Perl with Configure -${switch}ccflags=+Z ... *) Build mod_perl static rather than DSO EOF } } gdbm_check(); malloc_check(); uselargefiles_check(); dynaloader_check(); shrplib_check(); if ($USE_APXS and $Config{libs} =~ /($thrlib)/) { my $lib = $1; phat_warn(<<EOF); Your Perl is linked with $lib, make sure that your httpd is built with LIBS=$lib EOF } }
sub gdbm_check {
if ($Config{libs} =~ /gdbm/) { require DynaLoader; require AutoLoader; #eek my $found = 0; my @path = split /\s+/, $Config{libpth}; for (@path) { last if $found = DynaLoader::dl_findfile($_, "-lgdbm"); } unless ($found) { my @maybe = (); for (@path) { push @maybe, grep { ! -l $_ } <$_/libgdbm.*>; } my $suggest = @maybe ? "You could just symlink it to $maybe[0]" : "You might need to install Perl from source"; phat_warn(<<EOF); Your Perl is configured to link against libgdbm, but libgdbm.so was not found. $suggest EOF } } }
sub uselargefiles_check {
return unless $] >= 5.006 and $Config{uselargefiles} and $PERL_USELARGEFILES and $USE_APXS; local $Apache::src::APXS = $WITH_APXS; my $cflags = Apache::src->new->apxs('-q' => 'CFLAGS') || ''; return if $cflags =~ /LARGEFILE/; $PERL_USELARGEFILES=0; #just do it since return; #nobody seems to listen to the warning below phat_warn(<<EOF); Your Perl is uselargefiles enabled, but Apache is not, suggestions: *) Rebuild mod_perl with Makefile.PL PERL_USELARGEFILES=0 *) Rebuild Apache with CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" *) Rebuild Perl with Configure -Uuselargefiles *) Let mod_perl build Apache (USE_DSO=1 instead of USE_APXS=1) EOF }
sub malloc_check { return unless $USE_DSO or $USE_APXS; return unless $Config{'usemymalloc'} eq 'y';
my $abort = $^O eq 'solaris'; my $bincompat = $Config{bincompat5005} and $Config{bincompat5005} eq 'define'; if ($] < 5.006) { phat_warn(<<EOF, $abort); Your current configuration will most likely trigger core dumps, suggestions: *) Do not configure mod_perl as a DSO *) Upgrade your Perl version to 5.6.0 or higher (w/ -Ubincompat5005) *) Configure Perl with -Uusemymalloc (not recommended for performance) EOF } elsif ($bincompat) { phat_warn(<<EOF, $abort); Your current configuration will most likely trigger core dumps, suggestions: *) Do not configure mod_perl as a DSO *) Rebuild Perl without malloc pollution (Configure -Ubincompat5005) EOF } }
sub dynaloader_check {
return unless $^O eq 'aix' and $] <= 5.00503 and ($USE_DSO or $USE_APXS); phat_warn(<<EOF); Please make sure that you apply the following patch to the perl distribution before you install mod_perl, without this patch you will not be able load any xs modules. EOF warn <<EOF; --- perl5.005_03/ext/DynaLoader/dl_aix.xs.orig Fri Mar 3 17:00:58 2000 +++ perl5.005_03/ext/DynaLoader/dl_aix.xs Sun Apr 2 13:37:05 2000 @@ -74,8 +74,8 @@ } Module, *ModulePtr; /* - * We keep a list of all loaded modules to be able to call the fini - * handlers at atexit() time. + * We keep a list of all loaded modules to be able to reference count + * duplicate dlopen's. */ static ModulePtr modList;
@@ -88,7 +88,6 @@
static void caterr(char *); static int readExports(ModulePtr); -static void terminate(void); static void *findMain(void); static char *strerror_failed = "(strerror failed)"; @@ -165,7 +164,6 @@ if (!mainModule) { if ((mainModule = findMain()) == NULL) return NULL; - atexit(terminate); } /* * Scan the list of modules if have the module already loaded. @@ -222,7 +220,16 @@ mp->refCnt = 1; mp->next = modList; modList = mp; - if (loadbind(0, mainModule, mp->entry) == -1) { + /* + * Assume anonymous exports come from the module this dlopen + * is linked into, that holds true as long as dlopen and all + * of the perl core are in the same shared object. Also bind + * against the main part, in the case a perl is not the main + * part, e.g mod_perl as DSO in Apache so perl modules can + * also reference Apache symbols. + */ + if (loadbind(0, (void *)dlopen, mp->entry) == -1 || + loadbind(0, mainModule, mp->entry) == -1) { dlclose(mp); errvalid++; strcpy(errbuf, "loadbind: "); @@ -336,12 +343,6 @@ safefree(mp->name); safefree(mp); return result; -} - -static void terminate(void) -{ - while (modList) - dlclose(modList); } /* Added by Wayne Scott
EOF }
sub shrplib_check {
return unless $Config{'useshrplib'} and $Config{'useshrplib'} eq 'define'; my $libperl = $Config{'libperl'} || 'libperl.so'; for my $dir (qw(/lib /usr/lib /usr/local/lib)) { next unless -e "$dir/$libperl"; my $coredir = "$Config{'archlibexp'}/CORE"; my $corelib = "$coredir/$libperl"; phat_warn(<<EOF); $dir/$libperl might override $corelib
This may cause build or runtime errors with mod_perl. Consider removing $dir/$libperl, it should not be there.
If your vendor has installed $libperl there, complain to them and install Perl from source if needed.
$libperl should only exist in Perl version/arch directories, for example: $coredir EOF } }
1 POD Error
The following errors were encountered while parsing the POD:
=pod directives shouldn't be over one line long! Ignoring all 5 lines of content
To install mod_perl, copy and paste the appropriate command in to your terminal.
cpanm
cpanm mod_perl
CPAN shell
perl -MCPAN -e shell install mod_perl
For more information on module installation, please visit the detailed CPAN module installation guide.