#
# Object used in the various Makefile.PL's
#
#
# Copyright (C) 2003 Sam Horrocks
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
package SpeedyMake;
use Exporter;
@ISA = 'Exporter';
@EXPORT_OK = qw(@src_generated %write_makefile_common);
use strict;
use ExtUtils::MakeMaker;
use ExtUtils::Embed;
use Cwd;
use vars qw(@src_generated %write_makefile_common);
# Use the following for debugging, etc.
#
# $EFENCE - to help debug malloc, set this to the path of the patched
# version of the efence ElectriceFence-2.1 distribution can be patched
# with util/patch_efence script to make it work with this code.
#
my $EFENCE = 0;
my $COVERAGE = 0; # Compile for coverage testing
my $PROFILING = 0; # Compile for profiling
my $DEVEL = 0 || $EFENCE; # Compile for debugging
# Options to produce warnings
my $WARNOPTS = ' -pedantic -Wall -W -Wtraditional -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wcast-qual -Wwrite-strings -Wstrict-prototypes -Wredundant-decls -Wnested-externs ';
my $pwd = &pwd;
use vars qw($OPTIMIZE $LD_OPTS);
if ($COVERAGE) {
$LD_OPTS = ' -fprofile-arcs -ftest-coverage -O ';
$OPTIMIZE = $WARNOPTS . $LD_OPTS .
'-DSPEEDY_PROFILING=\\\\\"`pwd`\\\\\"';
}
elsif ($PROFILING) {
$LD_OPTS = ' -pg -O ';
$OPTIMIZE = $WARNOPTS . $LD_OPTS .
'-DSPEEDY_PROFILING=\\\\\"`pwd`\\\\\"';
}
elsif ($DEVEL) {
$OPTIMIZE = $WARNOPTS . ' -g -DSPEEDY_DEBUG ';
}
else {
# Force -O here, because otherwise on Sun they use odd OPTIMIZE flags
# that make gcc fail.
$OPTIMIZE = '-O';
}
if ($EFENCE) {
$OPTIMIZE .= " -DSPEEDY_EFENCE ";
}
my %macro;
if ($macro{APACHE_APXS_WORKS} = &apxs_works) {
my $ver = &httpd_version;
$macro{APACHE_VERSION} = $ver;
$macro{MOD_SPEEDYCGI_DIR} = 'mod_speedycgi' . ($ver == 1 ? '' : 2);
foreach my $n (qw(LIBEXECDIR SYSCONFDIR)) {
$macro{"APACHE_$n"} = &apxs_query($n);
}
}
%write_makefile_common = (
'OPTIMIZE' => $OPTIMIZE,
'LINKTYPE' => ' ',
'macro' => \%macro,
);
@src_generated = qw(
speedy_optdefs.h speedy_optdefs.c mod_speedycgi_cmds.c
mod_speedycgi2_cmds.c SpeedyCGI.pm
);
sub init { my $class = shift;
foreach my $method (qw(makeaperl postamble)) {
eval "package MY; sub $method { $class->$method(\@_); }";
}
return $class;
}
sub am_frontend {1}
sub pwd {
return &Cwd::cwd;
}
sub my_name { die; }
sub my_name_full { my $class = shift;
$class->prefix . $class->my_name;
}
sub prefix {'speedy_'}
sub default_inc {'perl'}
sub inc {shift->default_inc}
sub main_file {
shift->my_name_full . '_main';
}
sub main_file_full {
shift->main_file;
}
sub main_h { shift->main_file_full }
sub src_files { my $class = shift;
(
$class->src_files_extra,
qw(
util
sig
frontend
backend
file
slot
poll
ipc
group
script
opt
optdefs
),
);
}
sub src_files_extra { (); }
sub src_files_full { my $class = shift;
(
$class->main_file_full,
$class->src_files_full_extra,
$class->add_prefix($class->prefix, $class->src_files),
);
}
sub src_files_full_extra { (); }
sub src_files_c { my $class = shift;
(
$class->add_suffix('.c', $class->src_files_full),
$class->src_files_c_extra,
);
}
sub src_files_c_extra { (); }
sub src_files_o { my $class = shift;
(
$class->add_suffix('.o', $class->src_files_full),
$class->src_files_o_extra,
);
}
sub src_files_o_extra { (); }
sub src_files_h {my $class = shift;
$class->add_suffix('.h', $class->src_files_full);
}
sub allinc { (<../src/*.h>) }
sub symlink_cmds { my $class = shift;
return join('', map {
sprintf("%s: ../src/%s\n\t\$(RM_F) %s\n\t\$(CP) ../src/%s %s\n\n",
($_) x 5
);
} @_);
}
sub symlink_c_files { my $class = shift;
$class->symlink_cmds($class->src_files_c);
}
sub make_speedy_h { my $class = shift;
my($pre, $incval, $main) = (
$class->prefix, $class->inc, $class->main_h
);
open(F, ">speedy.h") || die;
foreach ("${pre}inc_${incval}", "${pre}inc", $main) {
print F "#include \"$_.h\"\n";
}
close(F);
}
sub optdefs_cmds { my($class, $dir) = @_;
$dir ||= '../src';
my $gen = join(' ', map {"$dir/$_"} @src_generated);
"
${gen}: $dir/Makefile $dir/SpeedyCGI.src $dir/optdefs
cd $dir && \$(MAKE)
$dir/Makefile: $dir/Makefile.PL
cd $dir && \$(PERL) Makefile.PL
";
}
sub extra_defines { my $class = shift;
join(' ',
"-DSPEEDY_PROGNAME=\\\"" . $class->my_name_full . "\\\"",
"-DSPEEDY_VERSION=\\\"\$(VERSION)\\\"",
'-DSPEEDY_' . ($class->am_frontend ? 'FRONTEND' : 'BACKEND'),
);
}
sub mm_params { my $class = shift;
return (
NAME => $class->my_name_full,
MAP_TARGET => $class->my_name_full,
OBJECT => join(' ', $class->src_files_o),
INC => '-I../src -I.',
VERSION_FROM => '../src/SpeedyCGI.src',
PM => {},
DEFINE => $class->extra_defines,
%write_makefile_common
);
}
sub write_makefile {
WriteMakefile(shift->mm_params);
}
sub clean_files_full { my $class = shift;
(
$class->clean_files_full_extra,
$class->src_files_full
);
}
sub clean_files_full_extra { (); }
sub clean_files_c { my $class = shift;
$class->add_suffix('.c', $class->clean_files_full);
}
sub clean_files { my $class = shift;
(
$class->clean_files_c,
$class->add_suffix('.bb', $class->clean_files_full),
$class->add_suffix('.da', $class->clean_files_full),
$class->add_suffix('.bbg', $class->clean_files_full),
'*.gcov',
'gmon.out',
$class->clean_files_extra
);
}
sub clean_files_extra { (); }
sub add_prefix { my($class, $pre) = (shift, shift);
return (map {"$pre$_"} @_);
}
sub add_suffix { my($class, $suf) = (shift, shift);
return (map {"$_$suf"} @_);
}
sub mod_speedycgi_out { undef }
sub testing_postamble { my $class = shift;
my $module = $write_makefile_common{macro}{MOD_SPEEDYCGI_DIR} . "/" . $class->mod_speedycgi_out;
my $topdir = &pwd;
$topdir =~ s/\/[^\/]*$//;
"
TEST_SPEEDY = ${topdir}/speedy/speedy
TEST_SPEEDY_BACKENDPROG = ${topdir}/speedy_backend/speedy_backend
TEST_SPEEDY_MODULE = ${topdir}/$module
FULLPERL = SPEEDY=\$(TEST_SPEEDY) SPEEDY_BACKENDPROG=\$(TEST_SPEEDY_BACKENDPROG) SPEEDY_MODULE=\$(TEST_SPEEDY_MODULE) SPEEDY_TIMEOUT=300 \$(PERL)
test_install:
\$(MAKE) test TEST_SPEEDY=\$(INSTALLBIN)/speedy TEST_SPEEDY_BACKENDPROG=\$(INSTALLBIN)/speedy_backend TEST_SPEEDY_MODULE=\$(APACHE_LIBEXECDIR)/mod_speedycgi.so
";
}
sub postamble { my $class = shift;
$class->make_speedy_h;
my $optdefs = $class->optdefs_cmds;
my $allinc = join(' ', $class->allinc);
my $c_file_link = $class->symlink_c_files;
my $clean_files = join(' ', $class->clean_files);
my $my_name = $class->my_name_full;
$class->testing_postamble .
"
$c_file_link
$optdefs
\$(OBJECT) : $allinc speedy.h
clean ::
\$(RM_F) $clean_files speedy.h $my_name
";
}
sub check_syms_def {
$DEVEL ? '../util/check_syms' : '$(NOOP)';
}
sub remove_libs { undef }
sub get_ldopts {
$_ = "$LD_OPTS " . &ExtUtils::Embed::ldopts('-std');
$EFENCE && s/$/ $EFENCE/;
return $_;
}
sub get_ccopts {&ExtUtils::Embed::ccopts();}
sub makeaperl { my $class = shift;
my $my_name_val = $class->my_name_full;
my $ldopts = $class->get_ldopts;
my $check_syms = $class->check_syms_def;
my $remove_libs = $class->remove_libs;
"
all :: $my_name_val
${my_name_val}: \$(OBJECT)
\$(RM_F) ${my_name_val}
$remove_libs \$(CC) -o ${my_name_val} \$(OBJECT) $ldopts
$check_syms
echo ''
";
}
sub devel {$DEVEL}
sub apxs_query { my $var = shift;
my $val;
open(S, ">&STDERR");
open(STDERR, ">/dev/null");
$val = `apxs -q $var`;
if ($?) {
$val = undef;
} else {
chomp $val;
}
open(STDERR, ">&S");
close(S);
return $val;
}
sub apxs_works {
&apxs_query('CC') && 1;
}
sub httpd_version {
my $httpd = &find_httpd;
if (`$httpd -v 2>/dev/null` =~ /Apache.2/) {
return 2;
}
return 1;
}
sub find_httpd {
my $x = &apxs_query('SBINDIR') . '/httpd';
return -x $x ? $x : 'httpd';
}
1;