dougm 00/12/19 22:47:46
Modified: . Changes Makefile.PL
Log:
allow Makefile.PL to build mod_perl on Win32 using VC++
Revision Changes Path
1.552 +3 -0 modperl/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl/Changes,v
retrieving revision 1.551
retrieving revision 1.552
diff -u -r1.551 -r1.552
--- Changes 2000/12/20 06:39:47 1.551
+++ Changes 2000/12/20 06:47:45 1.552
@@ -10,6 +10,9 @@
=item 1.24_02-dev
+allow Makefile.PL to build mod_perl on Win32 using VC++
+[Randy Kobes <[EMAIL PROTECTED]>]
+
stop win32 crash when bringing down service
[John K. Sterling <[EMAIL PROTECTED]>]
1.171 +180 -3 modperl/Makefile.PL
Index: Makefile.PL
===================================================================
RCS file: /home/cvs/modperl/Makefile.PL,v
retrieving revision 1.170
retrieving revision 1.171
diff -u -r1.170 -r1.171
--- Makefile.PL 2000/10/03 14:17:22 1.170
+++ Makefile.PL 2000/12/20 06:47:45 1.171
@@ -313,8 +313,21 @@
}
}
+my $vcpp = ($Config{cc} =~ /^cl(\.exe)?$/);
+my %win32_args;
+my %win32_accept = map {$_ => 1} qw(APACHE_SRC INSTALL_DLL DEBUG EAPI);
+
while($_ = shift) {
($k,$v) = split /=/, $_, 2;
+ if ($vcpp) {
+ if ($win32_accept{$k}) {
+ $win32_args{$k} = ($k eq 'DEBUG' or $k eq 'EAPI') ? 1 : $v;
+ }
+ else {
+ push @mm_args, $_;
+ }
+ next;
+ }
unless (/^(PERL|APACHE)/ or is_mp_arg($k)) {
push @mm_args, $_;
}
@@ -327,6 +340,8 @@
$callback_hooks{$k} = $v if exists $callback_hooks{$k};
}
+my $win32_auto = ($vcpp and $win32_args{APACHE_SRC}) ? 1 : 0;
+
my %very_experimental = map {$_,1}
qw(PERL_DEFAULT_OPMASK PERL_SAFE_STARTUP PERL_ORALL_OPMASK
PERL_STARTUP_DONE_CHECK PERL_DSO_UNLOAD);
@@ -867,6 +882,13 @@
init_config_pl() if $Is_Win32;
+my (%win32_path);
+if ($win32_auto) {
+ use File::Spec;
+ win32_inc_and_lib();
+ win32_fix_dsp();
+}
+
write_my_config($APACHE_SRC);
unless($Is_Win32 or -e "t/conf/httpd.conf" or ($NO_HTTPD && !$PREP_HTTPD)) {
@@ -1227,6 +1249,13 @@
sub MY::clean {
my $self = shift;
my $string = $self->MM::clean(@_);
+ if ($win32_auto) {
+ $string .= sprintf
+ qq{\tmsdev src\\modules\\ApacheModulePerl\\ApacheModulePerl.dsp \\\n} .
+ qq{\t/MAKE "ApacheModulePerl - Win32 %s" /CLEAN\n},
+ ($win32_args{DEBUG} == 1) ? 'Debug' : 'Release';
+ return $string;
+ }
unless($NO_HTTPD) {
my $asrc = asrc($APACHE_SRC, "http_main.c");
return $string unless $APACHE_SRC and -e "$asrc/http_main.c";
@@ -1245,12 +1274,15 @@
if($USE_APXS) {
$add = "apxs_install";
}
+ elsif ($win32_auto and $win32_args{INSTALL_DLL}) {
+ $add = 'amp_install';
+ }
elsif($USE_APACI) {
if($APACI_ARGS =~ /--prefix=/ or $APACHE_PREFIX) {
$add = "apaci_install";
}
}
- if($add and (!$NO_HTTPD and !$PREP_HTTPD) or $USE_APXS) {
+ if($add and (!$NO_HTTPD and !$PREP_HTTPD) or $USE_APXS or $win32_auto) {
$string =~ s/(pure_install\s+)(.*)/$1 $add $2/;
}
return $string;
@@ -1259,7 +1291,20 @@
sub MY::top_targets {
my $self = shift;
my $string = $self->MM::top_targets;
- return $string unless $USE_APXS or $USE_APACI or $APACHE_SRC;
+ return $string unless $USE_APXS or $USE_APACI or $APACHE_SRC or $win32_auto;
+
+ if ($win32_auto) {
+ $string =~ s/(pure_all\s+::.*\s+subdirs\s+)(.*)/$1 amp_dll $2/;
+ $string .= sprintf qq{\namp_dll:\n} .
+ qq{\tmsdev src\\modules\\ApacheModulePerl\\ApacheModulePerl.dsp \\\n} .
+ qq{\t/MAKE "ApacheModulePerl - Win32 %s" /USEENV\n},
+ ($win32_args{DEBUG} == 1) ? 'Debug' : 'Release';
+ if ($win32_args{INSTALL_DLL}) {
+ $string .= sprintf qq{\namp_install:\n\t\$(CP) "%s" "%s"},
+ "$win32_path{MODPERL_LIB}/ApacheModulePerl.dll", $win32_args{INSTALL_DLL};
+ }
+ return $string;
+ }
if($USE_APXS) {
$string =~ s/(pure_all\s+::\s+)(.*)/$1 apxs_libperl $2/;
@@ -1890,6 +1935,17 @@
sub write_my_config {
my $src = shift;
+
+ my $string;
+ if ($win32_auto) {
+ $string =<<"EOS";
+'APACHE_INC' => '$win32_path{APACHE_INC}',
+ 'APACHE_LIB' => '$win32_path{APACHE_LIB}',
+ 'MODPERL_INC' => '$win32_path{MODPERL_INC}',
+ 'MODPERL_LIB' => '$win32_path{MODPERL_LIB}',
+EOS
+ }
+
local *FH;
# writing Configuration to Apache::MyConfig
@@ -1897,7 +1953,7 @@
die "Can't open lib/Apache/MyConfig.pm: $!";
print FH <<EOT;
#
-# Configuartion for mod_perl and Apache::...
+# Configuration for mod_perl and Apache::...
#
package Apache::MyConfig ;
@@ -1905,6 +1961,7 @@
'Apache_Src' => \'$APACHE_SRC\',
'SSL_BASE' => \'$SSL_BASE\',
'APXS' => \'$WITH_APXS\',
+ $string
);
1;
@@ -1913,6 +1970,126 @@
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/ApacheModulePerl/Debug' :
+ $modperl_src . '/modules/ApacheModulePerl/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});
+ $win32_args{APACHE_SRC} .= '/src' unless $win32_args{APACHE_SRC} =~ /src$/;
+ $win32_path{APACHE_INC} = $win32_args{APACHE_SRC} . '/include';
+ $win32_path{APACHE_LIB} = ($win32_args{DEBUG} == 1) ?
+ $win32_args{APACHE_SRC} . '/CoreD' :
+ $win32_args{APACHE_SRC} . '/CoreR';
+ die "Cannot find ApacheCore.lib under $win32_path{APACHE_LIB}\n"
+ unless -f "$win32_path{APACHE_LIB}/ApacheCore.lib";
+
+ 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 ApacheModulePerl.dll manually. *******
+
+END
+ }
+ }
+ }
+}
+
+# fix ApacheModulePerl.dsp with the perl and apache inc and lib directories
+sub win32_fix_dsp {
+
+ my $amp = 'src/modules/ApacheModulePerl';
+ my $dsp = 'ApacheModulePerl.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!(/D "WIN32")!/I "$apache_inc" /I "$perl_inc" $1!;
+ s!(/D "WIN32")!$1 /D "EAPI" ! if $win32_args{EAPI};
+ 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 {
+ local $_ = shift;
+ $_ = File::Spec->rel2abs($_) if not File::Spec->file_name_is_absolute($_);
+ tr!\\!/!;
+ s!/$!!;
+ return $_;
+}
+
+# fix a path for ApacheModulePerl.dsp
+sub win32_fix_path_dsp {
+ local $_ = shift;
+ tr!/!\\!;
+ s!^\w:!!;
+ return $_;
}
#in version 1.2505 of Embed.pm we could just import these instead of using ``,