You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by st...@apache.org on 2013/11/19 12:05:39 UTC
svn commit: r1543377 - in /perl/apxs/trunk: ./ Configure.pl README
apr_win32.pl apu_win32.pl apxs_win32 apxs_win32.pl util.pl
Author: stevehay
Date: Tue Nov 19 11:05:39 2013
New Revision: 1543377
URL: http://svn.apache.org/r1543377
Log:
Import http://archive.apache.org/dist/perl/win32-bin/apxs_win32-0.1.tar.gz
Added:
perl/apxs/trunk/
perl/apxs/trunk/Configure.pl
perl/apxs/trunk/README
perl/apxs/trunk/apr_win32.pl
perl/apxs/trunk/apu_win32.pl
perl/apxs/trunk/apxs_win32
perl/apxs/trunk/apxs_win32.pl
perl/apxs/trunk/util.pl
Added: perl/apxs/trunk/Configure.pl
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/Configure.pl?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/Configure.pl (added)
+++ perl/apxs/trunk/Configure.pl Tue Nov 19 11:05:39 2013
@@ -0,0 +1,115 @@
+#!C:/Perl/bin/perl
+use strict;
+use warnings;
+use Getopt::Long;
+require Win32;
+use File::Spec::Functions qw(catfile catdir);
+use Config;
+use ExtUtils::MakeMaker;
+use File::Basename;
+require 'util.pl';
+
+BEGIN {
+ die 'This script is intended for Win32' unless $^O =~ /Win32/i;
+}
+
+my ($apache, $help);
+GetOptions( 'with-apache2=s' => \$apache,
+ 'help' => \$help,
+ ) or usage($0);
+usage($0) if $help;
+
+my @path_ext;
+path_ext();
+$apache ||= search();
+
+for my $file (qw(apxs_win32.pl apr_win32.pl apu_win32.pl) ) {
+ push @ARGV, "--with-apache2=$apache";
+ unless (my $return = do $file) {
+ warn "Cannot parse $file: $@" if $@;
+ warn "Cannot do $file: $!" unless defined $return;
+ warn "Cannot run $file" unless $return;
+ }
+}
+
+sub search {
+ my $apache;
+ if (my $bin = which('Apache')) {
+ (my $candidate = dirname($bin)) =~ s!bin$!!;
+ if (-d $candidate and check($candidate)) {
+ $apache = $candidate;
+ }
+ }
+ unless ($apache and -d $apache) {
+ $apache = prompt("Please give the path to your Apache2 installation:",
+ $apache);
+ }
+ die "Can't find a suitable Apache2 installation!"
+ unless ($apache and -d $apache and check($apache));
+
+ $apache = Win32::GetShortPathName($apache) if $apache =~ / /;
+ $apache =~ s!\\!/!g;
+ $apache =~ s!/$!!;
+ my $ans = prompt(qq{\nUse "$apache" for your Apache2 directory?}, 'yes');
+ unless ($ans =~ /^y/i) {
+ die <<'END';
+
+Please run this configuration script again, and give
+the --with-apache2=C:\Path\to\Apache2 option to specify
+the desired top-level Apache2 directory.
+
+END
+ }
+ return $apache;
+}
+
+sub drives {
+ my @drives = ();
+ eval{require Win32API::File;};
+ return map {"$_:\\"} ('C' .. 'Z') if $@;
+ my @r = Win32API::File::getLogicalDrives();
+ return unless @r > 0;
+ for (@r) {
+ my $t = Win32API::File::GetDriveType($_);
+ push @drives, $_ if ($t == 3 or $t == 4);
+ }
+ return @drives > 0 ? @drives : undef;
+}
+
+sub path_ext {
+ if ($ENV{PATHEXT}) {
+ push @path_ext, split ';', $ENV{PATHEXT};
+ for my $ext (@path_ext) {
+ $ext =~ s/^\.*(.+)$/$1/;
+ }
+ }
+ else {
+ #Win9X: doesn't have PATHEXT
+ push @path_ext, qw(com exe bat);
+ }
+}
+
+sub which {
+ my $program = shift;
+ return unless $program;
+ my @extras = ();
+ my @drives = drives();
+ if (@drives > 0) {
+ for my $drive (@drives) {
+ for ('Apache2', 'Program Files/Apache2',
+ 'Program Files/Apache Group/Apache2') {
+ my $bin = File::Spec->catpath($drive, $_, 'bin');
+ push @extras, $bin if (-d $bin);
+ }
+ }
+ }
+ my @a = map {catfile($_, $program) }
+ (File::Spec->path(), @extras);
+ for my $base(@a) {
+ return $base if -x $base;
+ for my $ext (@path_ext) {
+ return "$base.$ext" if -x "$base.$ext";
+ }
+ }
+ return;
+}
Added: perl/apxs/trunk/README
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/README?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/README (added)
+++ perl/apxs/trunk/README Tue Nov 19 11:05:39 2013
@@ -0,0 +1,12 @@
+This distribution contains scripts to install the utilities
+apxs, apr-config, and apu-config on Win32 for use with Apache2.
+To install, at a DOS prompt run
+ perl Configure.pl
+which will attempt to find your top-level Apache2 directory.
+If this is unsuccessful, or the guess is wrong, run
+ perl Configure.pl --with-apache2=\Path\to\Apache2
+The utilties will be placed under \Path\to\Apache2\bin\.
+
+Randy Kobes <ra...@theoryx5.uwinnipeg.ca>
+Aug 17, 2003
+
Added: perl/apxs/trunk/apr_win32.pl
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/apr_win32.pl?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/apr_win32.pl (added)
+++ perl/apxs/trunk/apr_win32.pl Tue Nov 19 11:05:39 2013
@@ -0,0 +1,263 @@
+#!perl
+use strict;
+use warnings;
+use Config;
+use Getopt::Long;
+require Win32;
+use ExtUtils::MakeMaker;
+use File::Spec::Functions qw(catfile catdir);
+require 'util.pl';
+
+BEGIN {
+ die 'This script is intended for Win32' unless $^O =~ /Win32/i;
+}
+
+my $license = <<'END';
+# ====================================================================
+#
+# Copyright 2003-2004 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ====================================================================
+#
+# APR script designed to allow easy command line access to APR configuration
+# parameters.
+
+END
+
+my $file = 'apr-config.pl';
+my ($prefix, $help);
+GetOptions('with-apache2=s' => \$prefix, 'help' => \$help) or usage($0);
+usage($0) if $help;
+
+unless (defined $prefix and -d $prefix) {
+ $prefix = prompt("Please give the path to your Apache2 installation:",
+ $prefix);
+}
+die "Can't find a suitable Apache2 installation!"
+ unless (-d $prefix and check($prefix));
+
+$prefix = Win32::GetShortPathName($prefix);
+
+my %ap_dir;
+foreach (qw(bin lib include build)) {
+ $ap_dir{$_} = catdir $prefix, $_;
+}
+
+my $apr_version = catfile $ap_dir{include}, 'apr_version.h';
+open(my $inc, $apr_version)
+ or die "Cannot open $apr_version: $!";
+my %vers;
+while (<$inc>) {
+ if (/define\s+APR_(MAJOR|MINOR|PATCH)_VERSION\s+(\d+)/) {
+ $vers{$1} = $2;
+ }
+}
+close $inc;
+my $dotted = "$vers{MAJOR}.$vers{MINOR}.$vers{PATCH}";
+
+my $apr_libname;
+opendir(my $dir, $ap_dir{lib}) or die "Cannot opendir $ap_dir{lib}: $!";
+my @libs = grep /^libapr\b\S+lib$/, readdir $dir;
+closedir $dir;
+die "Unable to find the apr lib" unless ($apr_libname = $libs[0]);
+
+my %apr_args = (APR_MAJOR_VERSION => $vers{MAJOR},
+ APR_DOTTED_VERSION => $dotted,
+ APR_LIBNAME => $apr_libname,
+ prefix => $prefix,
+ exec_prefix => $prefix,
+ bindir => $ap_dir{bin},
+ libdir => $ap_dir{lib},
+ datadir => $prefix,
+ installbuilddir => $ap_dir{build},
+ includedir => $ap_dir{include},
+
+ CC => $Config{cc},
+ CPP => $Config{cpp},
+ LD => $Config{ld},
+ SHELL => $ENV{comspec},
+ CPPFLAGS => '',
+ CFLAGS => q{ /nologo /MD /W3 /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" },
+ LDFLAGS => q{ kernel32.lib /nologo /subsystem:windows /dll /machine:I386 },
+ LIBS => '',
+ EXTRA_INCLUDES => '',
+ APR_SOURCE_DIR => '',
+ APR_SO_EXT => $Config{dlext},
+ APR_LIB_TARGET => '',
+ );
+
+my $apr_usage = << 'EOF';
+Usage: apr-config [OPTION]
+
+Known values for OPTION are:
+ --prefix[=DIR] change prefix to DIR
+ --bindir print location where binaries are installed
+ --includedir print location where headers are installed
+ --libdir print location where libraries are installed
+ --cc print C compiler name
+ --cpp print C preprocessor name and any required options
+ --ld print C linker name
+ --cflags print C compiler flags
+ --cppflags print cpp flags
+ --includes print include information
+ --ldflags print linker flags
+ --libs print additional libraries to link against
+ --srcdir print APR source directory
+ --installbuilddir print APR build helper directory
+ --link-ld print link switch(es) for linking to APR
+ --apr-so-ext print the extensions of shared objects on this platform
+ --apr-lib-file print the name of the apr lib
+ --version print the APR version as a dotted triple
+ --help print this help
+
+When linking, an application should do something like:
+ APR_LIBS="\`apr-config --link-ld --libs\`"
+
+An application should use the results of --cflags, --cppflags, --includes,
+and --ldflags in their build process.
+EOF
+
+my $full = catfile $ap_dir{bin}, $file;
+open(my $fh, '>', $full) or die "Cannot open $full: $!";
+print $fh <<"END";
+#!$^X
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Spec::Functions qw(catfile catdir);
+
+$license
+sub usage {
+ print << 'EOU';
+$apr_usage
+EOU
+ exit(1);
+}
+
+END
+
+foreach my $var (keys %apr_args) {
+ print $fh qq{my \${$var} = q[$apr_args{$var}];\n};
+}
+print $fh $_ while <DATA>;
+close $fh;
+
+my @args = ('pl2bat', $full);
+system(@args) == 0 or die "system @args failed: $?";
+print qq{apr-config.bat has been created under $ap_dir{bin}.\n\n};
+
+__DATA__
+
+my %opts = ();
+GetOptions(\%opts,
+ 'prefix:s',
+ 'bindir',
+ 'includedir',
+ 'libdir',
+ 'cc',
+ 'cpp',
+ 'ld',
+ 'cflags',
+ 'cppflags',
+ 'includes',
+ 'ldflags',
+ 'libs',
+ 'srcdir',
+ 'installbuilddir',
+ 'link-ld',
+ 'apr-so-ext',
+ 'apr-lib-file',
+ 'version',
+ 'help'
+ ) or usage();
+
+usage() if ($opts{help} or not %opts);
+
+if (exists $opts{prefix} and $opts{prefix} eq "") {
+ print qq{$prefix\n};
+ exit(0);
+}
+my $user_prefix = defined $opts{prefix} ? $opts{prefix} : '';
+my %user_dir;
+if ($user_prefix) {
+ foreach (qw(lib bin include build)) {
+ $user_dir{$_} = catdir $user_prefix, $_;
+ }
+}
+my $flags = '';
+
+SWITCH : {
+ local $\ = "\n";
+ $opts{bindir} and do {
+ print $user_prefix ? $user_dir{bin} : $bindir;
+ last SWITCH;
+ };
+ $opts{includedir} and do {
+ print $user_prefix ? $user_dir{include} : $includedir;
+ last SWITCH;
+ };
+ $opts{libdir} and do {
+ print $user_prefix ? $user_dir{lib} : $libdir;
+ last SWITCH;
+ };
+ $opts{installbuilddir} and do {
+ print $user_prefix ? $user_dir{build} : $installbuilddir;
+ last SWITCH;
+ };
+ $opts{srcdir} and do {
+ print $APR_SOURCE_DIR;
+ last SWITCH;
+ };
+ $opts{cc} and do {
+ print $CC;
+ last SWITCH;
+ };
+ $opts{cpp} and do {
+ print $CPP;
+ last SWITCH;
+ };
+ $opts{ld} and do {
+ print $LD;
+ last SWITCH;
+ };
+ $opts{cflags} and $flags .= " $CFLAGS ";
+ $opts{cppflags} and $flags .= " $CPPFLAGS ";
+ $opts{includes} and do {
+ my $inc = $user_prefix ? $user_dir{include} : $includedir;
+ $flags .= qq{ /I"$inc" $EXTRA_INCLUDES };
+ };
+ $opts{ldflags} and $flags .= " $LDFLAGS ";
+ $opts{libs} and $flags .= " $LIBS ";
+ $opts{'link-ld'} and do {
+ my $libpath = $user_prefix ? $user_dir{lib} : $libdir;
+ $flags .= qq{ /libpath:"$libpath" $APR_LIBNAME };
+ };
+ $opts{'apr-so-ext'} and do {
+ print $APR_SO_EXT;
+ last SWITCH;
+ };
+ $opts{'apr-lib-file'} and do {
+ my $full_aprlib = $user_prefix ?
+ (catfile $user_dir{lib}, $APR_LIBNAME) :
+ (catfile $libdir, $APR_LIBNAME);
+ print $full_aprlib;
+ last SWITCH;
+ };
+ $opts{version} and do {
+ print $APR_DOTTED_VERSION;
+ last SWITCH;
+ };
+ print $flags if $flags;
+}
+exit(0);
Added: perl/apxs/trunk/apu_win32.pl
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/apu_win32.pl?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/apu_win32.pl (added)
+++ perl/apxs/trunk/apu_win32.pl Tue Nov 19 11:05:39 2013
@@ -0,0 +1,264 @@
+#!perl
+use strict;
+use Config;
+use Getopt::Long;
+require Win32;
+use ExtUtils::MakeMaker;
+use File::Spec::Functions qw(catfile catdir);
+use warnings;
+require 'util.pl';
+
+BEGIN {
+ die 'This script is intended for Win32' unless $^O =~ /Win32/i;
+}
+
+my $license = <<'END';
+# ====================================================================
+#
+# Copyright 2003-2004 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ====================================================================
+#
+# APR-util script designed to allow easy command line access to APR-util
+# configuration parameters.
+
+END
+
+my $file = 'apu-config.pl';
+my ($prefix, $help);
+GetOptions('with-apache2=s' => \$prefix, 'help' => \$help) or usage($0);
+usage($0) if $help;
+
+unless (defined $prefix and -d $prefix) {
+ $prefix = prompt("Please give the path to your Apache2 installation:",
+ $prefix);
+}
+die "Can't find a suitable Apache2 installation!"
+ unless (-d $prefix and check($prefix));
+
+$prefix = Win32::GetShortPathName($prefix);
+
+my %ap_dir;
+foreach (qw(bin lib include build)) {
+ $ap_dir{$_} = catdir $prefix, $_;
+}
+
+my $apu_version = catfile $ap_dir{include}, 'apu_version.h';
+open(my $inc, $apu_version)
+ or die "Cannot open $apu_version: $!";
+my %vers;
+while (<$inc>) {
+ if (/define\s+APU_(MAJOR|MINOR|PATCH)_VERSION\s+(\d+)/) {
+ $vers{$1} = $2;
+ }
+}
+close $inc;
+my $dotted = "$vers{MAJOR}.$vers{MINOR}.$vers{PATCH}";
+
+my $aprutil_libname;
+opendir(my $dir, $ap_dir{lib}) or die "Cannot opendir $ap_dir{lib}: $!";
+my @libs = grep /^libaprutil\b\S+lib$/, readdir $dir;
+closedir $dir;
+die "Unable to find the apr lib" unless ($aprutil_libname = $libs[0]);
+
+my %apu_args = (APRUTIL_MAJOR_VERSION => $vers{MAJOR},
+ APRUTIL_DOTTED_VERSION => $dotted,
+ APRUTIL_LIBNAME => $aprutil_libname,
+ prefix => $prefix,
+ exec_prefix => $prefix,
+ bindir => $ap_dir{bin},
+ libdir => $ap_dir{lib},
+ datadir => $prefix,
+ installbuilddir => $ap_dir{build},
+ includedir => $ap_dir{include},
+
+ CC => $Config{cc},
+ CPP => $Config{cpp},
+ LD => $Config{ld},
+ SHELL => $ENV{comspec},
+ CPPFLAGS => '',
+ CFLAGS => q{ /nologo /MD /W3 /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG" },
+ LDFLAGS => q{ kernel32.lib /nologo /subsystem:windows /dll /machine:I386 },
+ LIBS => '',
+ EXTRA_INCLUDES => '',
+ APRUTIL_SOURCE_DIR => '',
+ APRUTIL_SO_EXT => $Config{dlext},
+ APRUTIL_LIB_TARGET => '',
+ );
+
+my $apu_usage = << 'EOF';
+Usage: apu-config [OPTION]
+
+Known values for OPTION are:
+ --prefix[=DIR] change prefix to DIR
+ --bindir print location where binaries are installed
+ --includedir print location where headers are installed
+ --libdir print location where libraries are installed
+ --cc print C compiler name
+ --cpp print C preprocessor name and any required options
+ --ld print C linker name
+ --cflags print C compiler flags
+ --cppflags print cpp flags
+ --includes print include information
+ --ldflags print linker flags
+ --libs print additional libraries to link against
+ --srcdir print APR-util source directory
+ --installbuilddir print APR-util build helper directory
+ --link-ld print link switch(es) for linking to APR-util
+ --apu-so-ext print the extensions of shared objects on this platform
+ --apu-lib-file print the name of the aprutil lib
+ --version print the APR-util version as a dotted triple
+ --help print this help
+
+When linking, an application should do something like:
+ APU_LIBS="\`apu-config --link-ld --libs\`"
+
+An application should use the results of --cflags, --cppflags, --includes,
+and --ldflags in their build process.
+EOF
+
+my $full = catfile $ap_dir{bin}, $file;
+open(my $fh, '>', $full) or die "Cannot open $full: $!";
+print $fh <<"END";
+#!$^X
+use strict;
+use warnings;
+use Getopt::Long;
+use File::Spec::Functions qw(catfile catdir);
+
+$license
+sub usage {
+ print << 'EOU';
+$apu_usage
+EOU
+ exit(1);
+}
+
+END
+
+foreach my $var (keys %apu_args) {
+ print $fh qq{my \${$var} = q[$apu_args{$var}];\n};
+}
+print $fh $_ while <DATA>;
+close $fh;
+
+my @args = ('pl2bat', $full);
+system(@args) == 0 or die "system @args failed: $?";
+print qq{apu-config.bat has been created under $ap_dir{bin}.\n\n};
+
+__DATA__
+
+my %opts = ();
+GetOptions(\%opts,
+ 'prefix:s',
+ 'bindir',
+ 'includedir',
+ 'libdir',
+ 'cc',
+ 'cpp',
+ 'ld',
+ 'cflags',
+ 'cppflags',
+ 'includes',
+ 'ldflags',
+ 'libs',
+ 'srcdir',
+ 'installbuilddir',
+ 'link-ld',
+ 'apu-so-ext',
+ 'apu-lib-file',
+ 'version',
+ 'help'
+ ) or usage();
+
+usage() if ($opts{help} or not %opts);
+
+if (exists $opts{prefix} and $opts{prefix} eq "") {
+ print qq{$prefix\n};
+ exit(0);
+}
+my $user_prefix = defined $opts{prefix} ? $opts{prefix} : '';
+my %user_dir;
+if ($user_prefix) {
+ foreach (qw(lib bin include build)) {
+ $user_dir{$_} = catdir $user_prefix, $_;
+ }
+}
+
+my $flags = '';
+
+SWITCH : {
+ local $\ = "\n";
+ $opts{bindir} and do {
+ print $user_prefix ? $user_dir{bin} : $bindir;
+ last SWITCH;
+ };
+ $opts{includedir} and do {
+ print $user_prefix ? $user_dir{include} : $includedir;
+ last SWITCH;
+ };
+ $opts{libdir} and do {
+ print $user_prefix ? $user_dir{lib} : $libdir;
+ last SWITCH;
+ };
+ $opts{installbuilddir} and do {
+ print $user_prefix ? $user_dir{build} : $installbuilddir;
+ last SWITCH;
+ };
+ $opts{srcdir} and do {
+ print $APRUTIL_SOURCE_DIR;
+ last SWITCH;
+ };
+ $opts{cc} and do {
+ print $CC;
+ last SWITCH;
+ };
+ $opts{cpp} and do {
+ print $CPP;
+ last SWITCH;
+ };
+ $opts{ld} and do {
+ print $LD;
+ last SWITCH;
+ };
+ $opts{cflags} and $flags .= " $CFLAGS ";
+ $opts{cppflags} and $flags .= " $CPPFLAGS ";
+ $opts{includes} and do {
+ my $inc = $user_prefix ? $user_dir{include} : $includedir;
+ $flags .= qq{ /I"$inc" $EXTRA_INCLUDES };
+ };
+ $opts{ldflags} and $flags .= " $LDFLAGS ";
+ $opts{libs} and $flags .= " $LIBS ";
+ $opts{'link-ld'} and do {
+ my $libpath = $user_prefix ? $user_dir{lib} : $libdir;
+ $flags .= qq{ /libpath:"$libpath" $APRUTIL_LIBNAME };
+ };
+ $opts{'apu-so-ext'} and do {
+ print $APRUTIL_SO_EXT;
+ last SWITCH;
+ };
+ $opts{'apu-lib-file'} and do {
+ my $full_apulib = $user_prefix ?
+ (catfile $user_dir{lib}, $APRUTIL_LIBNAME) :
+ (catfile $libdir, $APRUTIL_LIBNAME);
+ print $full_apulib;
+ last SWITCH;
+ };
+ $opts{version} and do {
+ print $APRUTIL_DOTTED_VERSION;
+ last SWITCH;
+ };
+ print $flags if $flags;
+}
+exit(0);
Added: perl/apxs/trunk/apxs_win32
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/apxs_win32?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/apxs_win32 (added)
+++ perl/apxs/trunk/apxs_win32 Tue Nov 19 11:05:39 2013
@@ -0,0 +1,792 @@
+#!%perlbin% -w
+# ====================================================================
+#
+# Copyright 2003-2004 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# apxs script designed to allow easy command line access to Apache
+# configuration parameters.
+
+require 5.003;
+use strict;
+package apxs;
+use File::Copy;
+
+##
+## Configuration
+##
+
+my %config_vars = ();
+
+my $installbuilddir = "%exp_installbuilddir%";
+get_config_vars("$installbuilddir/config_vars.mk",\%config_vars);
+
+# read the configuration variables once
+
+my $prefix = get_vars("prefix");
+my $CFG_PREFIX = $prefix;
+my $exec_prefix = get_vars("exec_prefix");
+my $datadir = get_vars("datadir");
+my $localstatedir = get_vars("localstatedir");
+my $CFG_TARGET = get_vars("progname");
+my $CFG_SYSCONFDIR = get_vars("sysconfdir");
+my $CFG_SYSCONF = get_vars("sysconf");
+my $CFG_CFLAGS = join ' ', map { get_vars($_) }
+ qw(SHLTCFLAGS CFLAGS NOTEST_CPPFLAGS EXTRA_CPPFLAGS EXTRA_CFLAGS);
+my $includedir = get_vars("includedir");
+my $CFG_INCLUDEDIR = eval qq("$includedir");
+my $libdir = get_vars("libdir");
+my $CFG_LIBDIR = eval qq("$libdir");
+my $CFG_CC = get_vars("CC");
+my $CFG_LD = get_vars("LD");
+my $CFG_LDFLAGS = get_vars("LDFLAGS");
+my $libexecdir = get_vars("libexecdir");
+my $CFG_LIBEXECDIR = eval qq("$libexecdir");
+my $sbindir = get_vars("sbindir");
+my $CFG_SBINDIR = eval qq("$sbindir");
+my $ltflags = $ENV{'LTFLAGS'};
+$ltflags or $ltflags = "--silent";
+
+my %internal_vars = map {$_ => 1}
+ qw(TARGET CC CFLAGS CFLAGS_SHLIB LD_SHLIB LDFLAGS_SHLIB LIBS_SHLIB
+ PREFIX SBINDIR INCLUDEDIR LIBEXECDIR SYSCONFDIR SYSCONF);
+
+my $CP = "%CP%";
+my $CHMOD = "%CHMOD%";
+my $RM_F = "%RM_F%";
+my $TOUCH = "%TOUCH%";
+
+##
+## parse argument line
+##
+
+# defaults for parameters
+my $opt_n = '';
+my $opt_g = '';
+my $opt_c = 0;
+my $opt_o = '';
+my @opt_D = ();
+my @opt_I = ();
+my @opt_L = ();
+my @opt_l = ();
+my @opt_W = ();
+my @opt_S = ();
+my $opt_e = 0;
+my $opt_i = 0;
+my $opt_a = 0;
+my $opt_A = 0;
+my $opt_q = 0;
+my $opt_h = 0;
+my $opt_p = 0;
+my $opt_d = 0;
+
+# this subroutine is derived from Perl's getopts.pl with the enhancement of
+# the "+" metacharacter at the format string to allow a list to be built by
+# subsequent occurrences of the same option.
+sub Getopts {
+ my ($argumentative, @ARGV) = @_;
+ my $errs = 0;
+ local $_;
+ local $[ = 0;
+
+ my @args = split / */, $argumentative;
+ while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) {
+ my ($first, $rest) = ($1,$2);
+ if ($_ =~ m|^--$|) {
+ shift @ARGV;
+ last;
+ }
+ my $pos = index($argumentative,$first);
+ if ($pos >= $[) {
+ if ($pos < $#args && $args[$pos+1] eq ':') {
+ shift @ARGV;
+ if ($rest eq '') {
+ unless (@ARGV) {
+ error("Incomplete option: $first (needs an argument)");
+ $errs++;
+ }
+ $rest = shift(@ARGV);
+ }
+ eval "\$opt_$first = \$rest;";
+ }
+ elsif ($pos < $#args && $args[$pos+1] eq '+') {
+ shift @ARGV;
+ if ($rest eq '') {
+ unless (@ARGV) {
+ error("Incomplete option: $first (needs an argument)");
+ $errs++;
+ }
+ $rest = shift(@ARGV);
+ }
+ eval "push(\@opt_$first, \$rest);";
+ }
+ else {
+ eval "\$opt_$first = 1";
+ if ($rest eq '') {
+ shift(@ARGV);
+ }
+ else {
+ $ARGV[0] = "-$rest";
+ }
+ }
+ }
+ else {
+ error("Unknown option: $first");
+ $errs++;
+ if ($rest ne '') {
+ $ARGV[0] = "-$rest";
+ }
+ else {
+ shift(@ARGV);
+ }
+ }
+ }
+ return ($errs == 0, @ARGV);
+}
+
+sub usage {
+ print STDERR "Usage: apxs -g [-S <var>=<val>] -n <modname>\n";
+ print STDERR " apxs -q [-S <var>=<val>] <query> ...\n";
+ print STDERR " apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]\n";
+ print STDERR " [-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]\n";
+ print STDERR " [-Wl,<flags>] [-p] <files> ...\n";
+ print STDERR " apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...\n";
+ print STDERR " apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...\n";
+ exit(1);
+}
+
+# option handling
+my $rc;
+($rc, @ARGV) = &Getopts("qn:gco:I+D+L+l+W+S+eiaApd", @ARGV);
+&usage if ($rc == 0);
+&usage if ($#ARGV == -1 and not $opt_g);
+&usage if (not $opt_q and not ($opt_g and $opt_n)
+ and not $opt_i and not $opt_c and not $opt_e);
+
+# argument handling
+my @args = @ARGV;
+my $name = 'unknown';
+$name = $opt_n if ($opt_n ne '');
+
+if (@opt_S) {
+ my ($opt_S);
+ foreach $opt_S (@opt_S) {
+ if ($opt_S =~ m/^([^=]+)=(.*)$/) {
+ my ($var) = $1;
+ my ($val) = $2;
+ my $oldval = eval "\$CFG_$var";
+
+ unless ($var and $oldval) {
+ print STDERR "apxs:Error: no config variable $var\n";
+ &usage;
+ }
+
+ eval "\$CFG_${var}=\"${val}\"";
+ } else {
+ print STDERR "apxs:Error: malformatted -S option\n";
+ &usage;
+ }
+ }
+}
+
+##
+## Initial shared object support check
+##
+my $httpd = get_vars("sbindir") . "/" . get_vars("progname");
+$httpd = eval qq("$httpd");
+$httpd = eval qq("$httpd");
+my $envvars = get_vars("sbindir") . "/envvars";
+$envvars = eval qq("$envvars");
+$envvars = eval qq("$envvars");
+
+#allow apxs to be run from the source tree, before installation
+if ($0 =~ m:support/apxs$:) {
+ ($httpd = $0) =~ s:support/apxs$::;
+}
+
+unless (-f "$httpd") {
+ error("$httpd not found or not executable");
+ exit 1;
+}
+
+sub get_config_vars{
+ my ($file, $rh_config) = @_;
+
+ open IN, $file or die "cannot open $file: $!";
+ while (<IN>){
+ if (/^\s*(.*?)\s*=\s*(.*)$/){
+ $rh_config->{$1} = $2;
+ }
+ }
+ close IN;
+}
+
+sub get_vars {
+ my $result = '';
+ my $ok = 0;
+ my $arg;
+ foreach $arg (@_) {
+ if (exists $config_vars{$arg} or exists $config_vars{lc $arg}) {
+ my $val = exists $config_vars{$arg}
+ ? $config_vars{$arg}
+ : $config_vars{lc $arg};
+ $val =~ s/[()]//g;
+ $result .= eval "qq($val)" if defined $val;
+ $result .= ";;";
+ $ok = 1;
+ }
+ if (not $ok) {
+ if (exists $internal_vars{$arg}
+ or exists $internal_vars{lc $arg}) {
+ my $val = exists $internal_vars{$arg} ? $arg : lc $arg;
+ $val = eval "\$CFG_$val";
+ $result .= eval "qq($val)" if defined $val;
+ $result .= ";;";
+ $ok = 1;
+ }
+ if (not $ok) {
+ error("Invalid query string `$arg'");
+ exit(1);
+ }
+ }
+ }
+ $result =~ s|;;$||;
+ # $result =~ s|:| |;
+ return $result;
+}
+
+##
+## Operation
+##
+
+# helper function for executing a list of
+# system command with return code checks
+sub execute_cmds {
+ my (@cmds) = @_;
+ my ($cmd, $rc);
+
+ foreach $cmd (@cmds) {
+ notice($cmd);
+ $rc = system $cmd;
+ if ($rc) {
+ error(sprintf "Command failed with rc=%d\n", $rc << 8);
+ exit 1 ;
+ }
+ }
+}
+
+if ($opt_g) {
+ ##
+ ## SAMPLE MODULE SOURCE GENERATION
+ ##
+
+ if (-d $name) {
+ error("Directory `$name' already exists. Remove first");
+ exit(1);
+ }
+
+ my $data = join('', <DATA>);
+ $data =~ s!__END__.*!!s;
+ $data =~ s|%NAME%|$name|sg;
+ $data =~ s|%SYSCONF%|$CFG_SYSCONF|sg;
+ $data =~ s|%PREFIX%|$prefix|sg;
+ $data =~ s|%INSTALLBUILDDIR%|$installbuilddir|sg;
+
+ my ($mkf, $src) = ($data =~ m|^(.+)-=\#=-\n(.+)|s);
+
+ notice("Creating [DIR] $name");
+ mkdir $name or die "Cannot mkdir $name: $!";
+ notice("Creating [FILE] $name/Makefile");
+ open(FP, ">${name}/Makefile") or die "Cannot open ${name}/Makefile: $!";
+ print FP $mkf;
+ close(FP);
+ notice("Creating [FILE] $name/mod_$name.c");
+ open(FP, ">${name}/mod_${name}.c") || die;
+ print FP $src;
+ close(FP);
+ notice("Creating [FILE] $name/.deps");
+ open(FP, ">${name}/.deps") or die "Cannot open ${name}/.deps: $!";
+ close(FP);
+
+ exit(0);
+}
+
+if ($opt_q) {
+ ##
+ ## QUERY INFORMATION
+ ##
+ my $result = get_vars(@args);
+ print "$result\n";
+}
+
+my $apr_bindir = get_vars("APR_BINDIR");
+my $apu_bindir = get_vars("APU_BINDIR");
+
+my $apr_includedir = "-I$prefix/include";
+my $apu_includedir = "-I$prefix/include";
+
+if ($opt_c) {
+ ##
+ ## SHARED OBJECT COMPILATION
+ ##
+
+ # split files into sources and objects
+ my @srcs = ();
+ my @objs = ();
+ my $f;
+ foreach $f (@args) {
+ if ($f =~ m|\.c$|) {
+ push(@srcs, $f);
+ }
+ else {
+ push(@objs, $f);
+ }
+ }
+
+ # determine output file
+ my $dso_file;
+ if ($opt_o eq '') {
+ if ($#srcs > -1) {
+ $dso_file = $srcs[0];
+ $dso_file =~ s|\.[^.]+$|.so|;
+ }
+ elsif ($#objs > -1) {
+ $dso_file = $objs[0];
+ $dso_file =~ s|\.[^.]+$|.so|;
+ }
+ else {
+ $dso_file = "mod_unknown.so";
+ }
+ }
+ else {
+ $dso_file = $opt_o;
+ }
+
+ # create compilation commands
+ my @cmds = ();
+ my $opt = '';
+ my ($opt_Wc, $opt_I, $opt_D);
+ foreach $opt_Wc (@opt_W) {
+ $opt .= "$1 " if ($opt_Wc =~ m|^\s*c,(.*)$|);
+ }
+ foreach $opt_I (@opt_I) {
+ $opt .= qq{ /I"$opt_I" };
+ }
+ foreach $opt_D (@opt_D) {
+ $opt .= qq{ /D "$opt_D" };
+ }
+ my $cflags = "$CFG_CFLAGS";
+ if ($opt_d) {
+ $cflags =~ s!NDEBUG!DEBUG!;
+ $cflags .= ' /Zi';
+ $cflags =~ s!/MD !/MDd !;
+ }
+ my $s;
+ my $mod;
+ foreach $s (@srcs) {
+ my $slo = $s;
+ $slo =~ s|\.c$|.slo|;
+ my $lo = $s;
+ $lo =~ s|\.c$|.lo|;
+ my $la = $s;
+ $la =~ s|\.c$|.la|;
+ my $o = $s;
+ $o =~ s|\.c$|.o|;
+ push(@cmds, "$CFG_CC $cflags -I$CFG_INCLUDEDIR $opt /c /Fo$lo $s");
+ unshift(@objs, $lo);
+ }
+
+ # create link command
+ my $o;
+ my $lo;
+ $opt = '';
+ foreach $o (@objs) {
+ $lo .= " $o";
+ }
+ my ($opt_Wl, $opt_L, $opt_l);
+ foreach $opt_Wl (@opt_W) {
+ if ($CFG_CC !~ m/gcc$/) {
+ $opt .= " $1" if ($opt_Wl =~ m|^\s*l,(.*)$|);
+ } else {
+ $opt .= " -W$opt_Wl";
+ }
+ }
+ foreach $opt_L (@opt_L) {
+ $opt .= qq{ /libpath:"$opt_L" };
+ }
+ foreach $opt_l (@opt_l) {
+ $opt_l .= '.lib' unless ($opt_l =~ /\.lib$/);
+ $opt .= " $opt_l";
+ }
+
+ if ($opt_p == 1) {
+ my $apr_libs = qq{$prefix/lib/libapr.lib};
+ my $apu_libs = qq{$prefix/lib/libaprutil.lib};
+ $opt .= " ".$apu_libs." ".$apr_libs;
+ }
+ else {
+ my $apr_ldflags;
+ $opt .= " $apr_ldflags";
+ }
+ my $ldflags = "$CFG_LDFLAGS";
+ if ($opt_d) {
+ $ldflags .= ' /debug';
+ }
+ push(@cmds, "$CFG_LD $ldflags /out:$dso_file $opt $lo");
+
+ # execute the commands
+ &execute_cmds(@cmds);
+
+ # allow one-step compilation and installation
+ if ($opt_i or $opt_e) {
+ @args = ( $dso_file );
+ }
+}
+
+if ($opt_i or $opt_e) {
+ ##
+ ## SHARED OBJECT INSTALLATION
+ ##
+ unless (-d $CFG_LIBEXECDIR) {
+ die "Directory $CFG_LIBEXECDIR not found";
+ }
+ # determine installation commands
+ # and corresponding LoadModule/AddModule directives
+ my @lmd = ();
+ my @amd = ();
+ my @cmds = ();
+ my $f;
+ foreach $f (@args) {
+ my $end = qr{(\.so|\.la)$};
+ if ($f !~ m!$end!) {
+ error("file $f is not a shared object");
+ exit(1);
+ }
+ my $t = $f;
+ $t =~ s|^.+/([^/]+)$|$1|;
+ $t =~ s|\.la$|\.so|;
+ (my $libf = $f) =~ s!$end!.lib!;
+ (my $libt = $t) =~ s!$end!.lib!;
+ (my $pdbf = $f) =~ s!$end!.pdb!;
+ (my $pdbt = $t) =~ s!$end!.pdb!;
+
+ if ($opt_i) {
+ push(@cmds, "$CP $f $CFG_LIBEXECDIR");
+ push(@cmds, "$CHMOD 755 $CFG_LIBEXECDIR/$t");
+ if (-f $libf) {
+ push(@cmds, "$CP $libf $CFG_LIBDIR");
+ push(@cmds, "$CHMOD 755 $CFG_LIBDIR/$libt");
+ }
+ if ($opt_d and -f $pdbf) {
+ push(@cmds, "$CP $pdbf $CFG_LIBEXECDIR");
+ push(@cmds, "$CHMOD 755 $CFG_LIBEXECDIR/$pdbt");
+ }
+ }
+
+ # determine module symbolname and filename
+ my $filename = '';
+ if ($name eq 'unknown') {
+ $name = '';
+ my $base = $f;
+ $base =~ s|\.[^.]+$||;
+ if (-f "$base.c") {
+ open(FP, "<$base.c");
+ my $content = join('', <FP>);
+ close(FP);
+ if ($content =~ m|.*module\s+(?:AP_MODULE_DECLARE_DATA\s+)?([a-zA-Z0-9_]+)_module\s*=\s*.*|s) {
+ $name = "$1";
+ $filename = "$base.c";
+ $filename =~ s|^[^/]+/||;
+ }
+ }
+ if ($name eq '') {
+ if ($base =~ m|.*mod_([a-zA-Z0-9_]+)\..+|) {
+ $name = "$1";
+ $filename = $base;
+ $filename =~ s|^[^/]+/||;
+ }
+ }
+ if ($name eq '') {
+ error("Sorry, cannot determine bootstrap symbol name");
+ error("Please specify one with option `-n'");
+ exit(1);
+ }
+ }
+ if ($filename eq '') {
+ $filename = "mod_${name}.c";
+ }
+ my $dir = $CFG_LIBEXECDIR;
+ $dir =~ s|^$CFG_PREFIX/?||;
+ $dir =~ s|(.)$|$1/|;
+ $t =~ s|\.la$|.so|;
+ push(@lmd, sprintf("LoadModule %-18s %s", "${name}_module", "$dir$t"));
+ push(@amd, sprintf("AddModule %s", $filename));
+ }
+
+ # execute the commands
+ &execute_cmds(@cmds);
+
+ # activate module via LoadModule/AddModule directive
+ if ($opt_a or $opt_A) {
+ if (not -f "$CFG_SYSCONFDIR/$CFG_SYSCONF") {
+ error("Config file $CFG_SYSCONFDIR/$CFG_SYSCONF not found");
+ exit(1);
+ }
+
+ open(FP, "<$CFG_SYSCONFDIR/$CFG_SYSCONF")
+ || die "Cannot open $CFG_SYSCONFDIR/$CFG_SYSCONF: $!";
+ my $content = join('', <FP>);
+ close(FP);
+
+ if ($content !~ m|\n\#?\s*LoadModule\s+|) {
+ error("Activation failed for custom $CFG_SYSCONFDIR/$CFG_SYSCONF file.");
+ error("At least one `LoadModule' directive already has to exist.");
+ exit(1);
+ }
+
+ my $lmd;
+ my $c = '';
+ $c = '#' if ($opt_A);
+ foreach $lmd (@lmd) {
+ my $what = $opt_A ? "preparing" : "activating";
+ if ($content !~ m|\n\#?\s*$lmd|) {
+ # check for open <containers>, so that the new LoadModule
+ # directive always appears *outside* of an <container>.
+
+ my $before =
+ ($content =~ m|^(.*\n)\#?\s*LoadModule\s+[^\n]+\n|s)[0];
+
+ # the '()=' trick forces list context and the scalar
+ # assignment counts the number of list members (aka number
+ # of matches) then
+ my $cntopen = () = ($before =~ m|^\s*<[^/].*$|mg);
+ my $cntclose = () = ($before =~ m|^\s*</.*$|mg);
+
+ if ($cntopen == $cntclose) {
+ # fine. Last LoadModule is contextless.
+ $content =~ s|^(.*\n\#?\s*LoadModule\s+[^\n]+\n)|$1$c$lmd\n|s;
+ }
+ elsif ($cntopen < $cntclose) {
+ error('Configuration file is not valid. There are sections'
+ . ' closed before opened.');
+ exit(1);
+ }
+ else {
+ # put our cmd after the section containing the last
+ # LoadModule.
+ my $found =
+ $content =~ s!\A ( # string and capture start
+ (?:(?:
+ ^\s* # start of conf line with a
+ (?:[^<]|<[^/]) # directive which
+ # does not
+ # start with '</'
+
+ .*(?:$)\n # rest of the line.
+ # the '$' is in parentheses
+ # to avoid misinterpreting
+ # the string "$\" as
+ # perl variable.
+
+ )* # catch as much as possible
+ # of such lines. (including
+ # zero)
+
+ ^\s*</.*(?:$)\n?
+ # after the above, we
+ # expect a config line with
+ # a closing container (</)
+
+ ) {$cntopen}
+ # the whole pattern (bunch
+ # of lines that end up with
+ # a closing directive) must
+ # be repeated $cntopen
+ # times. That's it.
+ # Simple, eh? ;-)
+
+ ) # capture end
+ !$1$c$lmd\n!mx;
+ unless ($found) {
+ error('Configuration file is not valid. There are '
+ . 'sections opened and not closed.');
+ exit(1);
+ }
+ }
+ }
+ else {
+ # replace already existing LoadModule line
+ $content =~ s|^(.*\n)\#?\s*$lmd[^\n]*\n|$1$c$lmd\n|s;
+ }
+ $lmd =~ m|LoadModule\s+(.+?)_module.*|;
+ notice("[$what module `$1' in $CFG_SYSCONFDIR/$CFG_SYSCONF]");
+ }
+ my $amd;
+ foreach $amd (@amd) {
+ if ($content !~ m|\n\#?\s*$amd|) {
+ $content =~ s|^(.*\n\#?\s*AddModule\s+[^\n]+\n)|$1$c$amd\n|sg;
+ }
+ else {
+ $content =~ s|^(.*\n)\#?\s*$amd[^\n]*\n|$1$c$amd\n|sg;
+ }
+ }
+
+ if (@lmd or @amd) {
+ if (open(FP, ">$CFG_SYSCONFDIR/$CFG_SYSCONF.new")) {
+ print FP $content;
+ close(FP);
+ copy("$CFG_SYSCONFDIR/$CFG_SYSCONF",
+ "$CFG_SYSCONFDIR/$CFG_SYSCONF.bak") or
+ die "Backup of $CFG_SYSCONFDIR/$CFG_SYSCONF failed: $!";
+ copy("$CFG_SYSCONFDIR/$CFG_SYSCONF.new",
+ "$CFG_SYSCONFDIR/$CFG_SYSCONF") or
+ die "Copying $CFG_SYSCONFDIR/$CFG_SYSCONF.new to $CFG_SYSCONFDIR/$CFG_SYSCONF failed: $!";
+ unlink "$CFG_SYSCONFDIR/$CFG_SYSCONF.new" or
+ die "Removing $CFG_SYSCONFDIR/$CFG_SYSCONF.new failed: $!";
+ }
+ else {
+ notice("unable to open configuration file");
+ }
+ }
+ }
+}
+
+sub error{
+ print STDERR "apxs:Error: $_[0].\n";
+}
+
+sub notice{
+ print STDERR "$_[0]\n";
+}
+
+##EOF##
+__DATA__
+##
+## Makefile -- Build procedure for sample %NAME% Apache module
+## Autogenerated via ``apxs -n %NAME% -g''.
+##
+
+builddir=.
+top_srcdir=%PREFIX%
+top_builddir=%PREFIX%
+
+# the used tools
+APXS=apxs
+APACHECTL=Apache.exe -k
+
+# additional defines, includes and libraries
+#DEFS=-Dmy_define=my_value
+#INCLUDES=-Imy/include/dir
+#LIBS=-Lmy/lib/dir -lmylib
+
+# the default target
+all: local-shared-build
+
+# install the shared object file into Apache
+install: install-modules
+
+# cleanup
+clean:
+ -@erase mod_%NAME%.lo mod_%NAME%.ilk mod_%NAME%.so mod_%NAME%.lib mod_%NAME%.exp mod_%NAME%.pdb
+
+# simple test
+test: reload
+ GET http://localhost/%NAME%
+
+# install and activate shared object by reloading Apache to
+# force a reload of the shared object file
+reload: install restart
+
+# the general Apache start/restart/stop
+# procedures
+start:
+ $(APACHECTL) start
+restart:
+ $(APACHECTL) restart
+stop:
+ $(APACHECTL) stop
+
+-=#=-
+/*
+** mod_%NAME%.c -- Apache sample %NAME% module
+** [Autogenerated via ``apxs -n %NAME% -g'']
+**
+** To play with this sample module first compile it into a
+** DSO file and install it into Apache's modules directory
+** by running:
+**
+** $ apxs -c -i mod_%NAME%.c
+**
+** Then activate it in Apache's %SYSCONF% file for instance
+** for the URL /%NAME% in as follows:
+**
+** # %SYSCONF%
+** LoadModule %NAME%_module modules/mod_%NAME%.so
+** <Location /%NAME%>
+** SetHandler %NAME%
+** </Location>
+**
+** Then after restarting Apache via
+**
+** $ apachectl restart
+**
+** you immediately can request the URL /%NAME% and watch for the
+** output of this module. This can be achieved for instance via:
+**
+** $ lynx -mime_header http://localhost/%NAME%
+**
+** The output should be similar to the following one:
+**
+** HTTP/1.1 200 OK
+** Date: Tue, 31 Mar 1998 14:42:22 GMT
+** Server: Apache/1.3.4 (Unix)
+** Connection: close
+** Content-Type: text/html
+**
+** The sample page from mod_%NAME%.c
+*/
+
+#include "httpd.h"
+#include "http_config.h"
+#include "http_protocol.h"
+#include "ap_config.h"
+
+/* The sample content handler */
+static int %NAME%_handler(request_rec *r)
+{
+ if (strcmp(r->handler, "%NAME%")) {
+ return DECLINED;
+ }
+ r->content_type = "text/html";
+
+ if (!r->header_only)
+ ap_rputs("The sample page from mod_%NAME%.c\n", r);
+ return OK;
+}
+
+static void %NAME%_register_hooks(apr_pool_t *p)
+{
+ ap_hook_handler(%NAME%_handler, NULL, NULL, APR_HOOK_MIDDLE);
+}
+
+/* Dispatch list for API hooks */
+module AP_MODULE_DECLARE_DATA %NAME%_module = {
+ STANDARD20_MODULE_STUFF,
+ NULL, /* create per-dir config structures */
+ NULL, /* merge per-dir config structures */
+ NULL, /* create per-server config structures */
+ NULL, /* merge per-server config structures */
+ NULL, /* table of config file commands */
+ %NAME%_register_hooks /* register hooks */
+};
Added: perl/apxs/trunk/apxs_win32.pl
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/apxs_win32.pl?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/apxs_win32.pl (added)
+++ perl/apxs/trunk/apxs_win32.pl Tue Nov 19 11:05:39 2013
@@ -0,0 +1,206 @@
+#!C:/Perl/bin/perl
+use strict;
+use warnings;
+use Getopt::Long;
+require Win32;
+use Config;
+use ExtUtils::MakeMaker;
+require 'util.pl';
+my ($apache, $help);
+GetOptions( 'with-apache2=s' => \$apache,
+ 'help' => \$help,
+ ) or usage($0);
+usage($0) if $help;
+
+unless (defined $apache and -d $apache) {
+ $apache = prompt("Please give the path to your Apache2 installation:",
+ $apache);
+}
+die "Can't find a suitable Apache2 installation!"
+ unless (-d $apache and check($apache));
+
+$apache = Win32::GetShortPathName($apache);
+$apache =~ s!\\!/!g;
+
+(my $perl = which('perl')) =~ s!\\!/!g;
+my %subs_cfg = (
+ '%APACHE2%' => $apache,
+ '%AWK%' => which('awk') || which('gawk') || '',
+ '%CC%' => $Config{cc},
+ '%CPP%' => $Config{cpp},
+ '%SHELL%' => $ENV{COMSPEC},
+ '%LD%' => $Config{ld},
+ );
+
+my $pat = join '|', keys %subs_cfg;
+my $build_dir = $apache . '/build';
+my $cfg_mk = $build_dir . '/config_vars.mk';
+unless (-d $build_dir) {
+ mkdir $build_dir or die "Cannot mkdir $build_dir: $!";
+}
+open(my $cfg, ">$cfg_mk")
+ or die qq{Cannot open $cfg_mk: $!};
+while (<DATA>) {
+ s/($pat)/$subs_cfg{$1}/;
+ print $cfg $_;
+}
+close $cfg;
+
+my %subs_apxs = (
+ '%perlbin%' => which('perl'),
+ '%exp_installbuilddir%' => $build_dir,
+ '%RM_F%' => qq{$perl -MExtUtils::Command -e rm_f},
+ '%CP%' => qq{$perl -MExtUtils::Command -e cp},
+ '%CHMOD%' => qq{$perl -MExtUtils::Command -e chmod},
+ '%TOUCH%' => qq{$perl -MExtUtils::Command -e touch},
+ );
+$pat = join '|', keys %subs_apxs;
+my $apxs_out = $apache . '/bin/apxs.pl';
+my $apxs_in = 'apxs_win32';
+open(my $out, ">$apxs_out")
+ or die "Cannot open $apxs_out: $!";
+open(my $in, $apxs_in)
+ or die "Cannot open $apxs_in: $!";
+while (<$in>) {
+ s/($pat)/$subs_apxs{$1}/;
+ print $out $_;
+}
+close $in;
+close $out;
+
+system ('pl2bat', $apxs_out) == 0
+ or die "system pl2bat $apxs_out failed: $?";
+print qq{\napxs.bat has been created under $apache/bin.\n\n};
+
+__DATA__
+exp_exec_prefix = %APACHE2%
+rel_exec_prefix =
+exp_bindir = %APACHE2%/bin
+rel_bindir = bin
+exp_sbindir = %APACHE2%/bin
+rel_sbindir = bin
+exp_libdir = %APACHE2%/lib
+rel_libdir = lib
+exp_libexecdir = %APACHE2%/modules
+rel_libexecdir = modules
+exp_sysconfdir = %APACHE2%/conf
+rel_sysconfdir = conf
+exp_datadir = %APACHE2%
+rel_datadir =
+exp_installbuilddir = %APACHE2%/build
+rel_installbuilddir = build
+exp_errordir = %APACHE2%/error
+rel_errordir = error
+exp_iconsdir = %APACHE2%/icons
+rel_iconsdir = icons
+exp_htdocsdir = %APACHE2%/htdocs
+rel_htdocsdir = htdocs
+exp_manualdir = %APACHE2%/manual
+rel_manualdir = manual
+exp_cgidir = %APACHE2%/cgi-bin
+rel_cgidir = cgi-bin
+exp_includedir = %APACHE2%/include
+rel_includedir = include
+exp_localstatedir = %APACHE2%
+rel_localstatedir =
+exp_runtimedir = %APACHE2%/logs
+rel_runtimedir = logs
+exp_logfiledir = %APACHE2%/logs
+rel_logfiledir = logs
+exp_proxycachedir = %APACHE2%/proxy
+rel_proxycachedir = proxy
+SHLTCFLAGS =
+LTCFLAGS =
+MPM_NAME = winnt
+MPM_SUBDIR_NAME = winnt
+htpasswd_LTFLAGS =
+htdigest_LTFLAGS =
+rotatelogs_LTFLAGS =
+logresolve_LTFLAGS =
+htdbm_LTFLAGS =
+ab_LTFLAGS =
+checkgid_LTFLAGS =
+APACHECTL_ULIMIT =
+progname = Apache.exe
+MPM_LIB = server/mpm/winnt/
+OS = win32
+OS_DIR = win32
+BUILTIN_LIBS =
+SHLIBPATH_VAR =
+OS_SPECIFIC_VARS =
+PRE_SHARED_CMDS =
+POST_SHARED_CMDS =
+shared_build =
+AP_LIBS =
+AP_BUILD_SRCLIB_DIRS = apr apr-util
+AP_CLEAN_SRCLIB_DIRS = apr-util apr
+abs_srcdir =
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/bin
+cgidir = ${datadir}/cgi-bin
+logfiledir = ${localstatedir}/logs
+exec_prefix = ${prefix}
+datadir = ${prefix}
+localstatedir = ${prefix}
+mandir = ${prefix}/man
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/modules
+htdocsdir = ${datadir}/htdocs
+manualdir = ${datadir}/manual
+includedir = ${prefix}/include
+errordir = ${datadir}/error
+iconsdir = ${datadir}/icons
+sysconfdir = ${prefix}/conf
+sysconf = httpd.conf
+installbuilddir = ${datadir}/build
+runtimedir = ${localstatedir}/logs
+proxycachedir = ${localstatedir}/proxy
+other_targets =
+unix_progname = httpd
+prefix = %APACHE2%
+AWK = %AWK%
+CC = %CC%
+LD = %LD%
+CPP = %CPP%
+CXX =
+CPPFLAGS =
+CFLAGS = /nologo /MD /W3 /O2 /D "WIN32" /D "_WINDOWS" /D "NDEBUG"
+CXXFLAGS =
+LTFLAGS =
+LDFLAGS = kernel32.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"${prefix}/lib"
+LT_LDFLAGS =
+SH_LDFLAGS =
+HTTPD_LDFLAGS =
+UTIL_LDFLAGS =
+LIBS =
+DEFS =
+INCLUDES =
+NOTEST_CPPFLAGS =
+NOTEST_CFLAGS =
+NOTEST_CXXFLAGS =
+NOTEST_LDFLAGS =
+NOTEST_LIBS =
+EXTRA_CPPFLAGS =
+EXTRA_CFLAGS =
+EXTRA_CXXFLAGS =
+EXTRA_LDFLAGS =
+EXTRA_LIBS =
+EXTRA_INCLUDES =
+LIBTOOL =
+SHELL = %SHELL%
+MODULE_DIRS = aaa filters loggers metadata proxy http generators mappers
+MODULE_CLEANDIRS = arch/win32 cache echo experimental ssl test dav/main dav/fs
+PORT = 80
+nonssl_listen_stmt_1 =
+nonssl_listen_stmt_2 = Listen @@Port@@
+CORE_IMPLIB_FILE =
+CORE_IMPLIB =
+SH_LIBS =
+SH_LIBTOOL =
+MK_IMPLIB =
+INSTALL_PROG_FLAGS =
+DSO_MODULES =
+APR_BINDIR = %APACHE2%/bin
+APR_INCLUDEDIR =
+APU_BINDIR = %APACHE2%/bin
+APU_INCLUDEDIR =
Added: perl/apxs/trunk/util.pl
URL: http://svn.apache.org/viewvc/perl/apxs/trunk/util.pl?rev=1543377&view=auto
==============================================================================
--- perl/apxs/trunk/util.pl (added)
+++ perl/apxs/trunk/util.pl Tue Nov 19 11:05:39 2013
@@ -0,0 +1,32 @@
+sub usage {
+ my $script = shift;
+ print <<"END";
+
+ Usage: perl $script [--with-apache2=C:\Path\to\Apache2]
+ perl $script --help
+
+Options:
+
+ --with-apache2=C:\Path\to\Apache2 : specify the top-level Apache2 directory
+ --help : print this help message
+
+With no options specified, an attempt will be made to find a suitable
+Apache2 directory.
+
+END
+ exit;
+}
+
+sub check {
+ my $apache = shift;
+ die qq{No libhttpd library found under $apache/lib}
+ unless -e qq{$apache/lib/libhttpd.lib};
+ die qq{No httpd header found under $apache/include}
+ unless -e qq{$apache/include/httpd.h};
+ my $vers = qx{"$apache/bin/Apache.exe" -v};
+ die qq{"$apache" does not appear to be version 2.0}
+ unless $vers =~ m!Apache/2.0!;
+ return 1;
+}
+
+1;