dougm 00/06/08 21:30:12
Added: lib/ModPerl BuildOptions.pm
Log:
new module for dealing with mod_perl configuration options
Revision Changes Path
1.1 modperl-2.0/lib/ModPerl/BuildOptions.pm
Index: BuildOptions.pm
===================================================================
package ModPerl::BuildOptions;
use strict;
use warnings;
my $param_qr = qr([\s=]+);
use constant VERBOSE => 1;
use constant UNKNOWN_FATAL => 2;
sub init {
my($self, $build) = @_;
#@ARGV should override what's in .makepl_args.mod_perl2
#but @ARGV might also override the default MP_OPTS_FILE
#so snag that first
parse($build, [grep { /^MP_OPTIONS_FILE/ } @ARGV]);
parse_file($build);
parse_argv($build);
if ($build->{MP_DEBUG} and $build->{MP_USE_GTOP}) {
$build->{MP_USE_GTOP} = 0 unless $build->find_dlfile('gtop');
}
}
sub parse {
my($self, $lines, $opts) = @_;
$opts = VERBOSE|UNKNOWN_FATAL unless defined $opts;
my $table = table();
my @unknown;
my $continue = "";
for (@$lines) {
#XXX: this "parser" should be more robust
chomp;
s/^\s+//; s/\s+$//;
next if /^\#/ || /^$/;
last if /^__END__/;
$_ = "$continue $_" if $continue;
if (/^MP_/) {
my($key, $val) = split $param_qr, $_, 2;
$val ||= "";
$continue = $val =~ s/\\$// ? $key : "";
if (!$table->{$key} and $opts & UNKNOWN_FATAL) {
my $usage = usage();
die "Unknown Option: $key\nUsage:\n$usage";
}
if ($self->{$key}) {
$self->{$key} .= ' ';
}
$self->{$key} .= $val;
print " $key = $val\n" if $opts & VERBOSE;
}
else {
push @unknown, $_;
}
}
return \@unknown;
}
sub parse_file {
my $self = shift;
my $fh;
my @files = map { $_ . 'makepl_args.mod_perl2' }
qw(./ ../ ./. ../.), "$ENV{HOME}/.";
unshift @files, $self->{MP_OPTIONS_FILE} if $self->{MP_OPTIONS_FILE};
for my $file (@files) {
if (open $fh, $file) {
$self->{MP_OPTIONS_FILE} = $file;
last;
}
$fh = undef;
}
return unless $fh;
print "Reading Makefile.PL args from $self->{MP_OPTIONS_FILE}\n";
my $unknowns = parse($self, [<$fh>]);
push @ARGV, @$unknowns if $unknowns;
close $fh;
}
sub parse_argv {
my $self = shift;
return unless @ARGV;
my @args = @ARGV;
@ARGV = ();
print "Reading Makefile.PL args from \@ARGV\n";
my $unknowns = parse($self, \@args);
push @ARGV, @$unknowns if $unknowns;
}
sub usage {
my $table = table();
my @opts = map { "$_ - $table->{$_}" } sort keys %$table;
join "\n", @opts;
}
sub parse_table {
my($fh) = @_;
my %table;
local $_;
while (<$fh>) {
chomp;
s/^\s+//; s/\s+$//;
next if /^\#/ || /^$/;
last if /^__END__/;
my($key, $val) = split /\s+/, $_, 2;
$table{'MP_' . $key} = $val;
}
return \%table;
}
my $Table;
sub table {
$Table ||= parse_table(\*DATA);
}
1;
__DATA__
USE_GTOP Link with libgtop and enable libgtop reporting
DEBUG Turning on debugging (-g -Wall -lperld) and tracing
CCOPTS Add to compiler flags
TRACE Turn on tracing
USE_DSO Build mod_perl as a dso
INST_APACHE2 Install *.pm relative to Apache2/ directory
PROMPT_DEFAULT Accept default value for all would-be prompts
OPTIONS_FILE Read options from given file
DYNAMIC Build Apache::*.xs as dynamic extensions