📄 buildoptions.pm
字号:
# Copyright 2000-2005 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.#package ModPerl::BuildOptions;use strict;use warnings;use Apache2::Build ();use Apache::TestTrace;my $param_qr = qr([\s=]+);use constant VERBOSE => 1;use constant UNKNOWN_FATAL => 2;use File::Spec;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 AP_PREFIX is used apxs and apr-config from the apache build # tree won't work, so it can't co-exist with APXS and APR_CONFIG # options if ($build->{MP_AP_PREFIX} and $build->{MP_APXS}) { error "You need to pass either MP_AP_PREFIX or MP_APXS, but not both"; die "\n"; } if ($build->{MP_AP_PREFIX} and $build->{MP_APR_CONFIG}) { error "You need to pass either MP_AP_PREFIX or MP_APR_CONFIG, " . "but not both"; die "\n"; } if ($build->{MP_DEBUG} and $build->{MP_USE_GTOP} and !$build->find_gtop) { error "Can't find libgtop, resetting MP_USE_GTOP=0"; $build->{MP_USE_GTOP} = 0; } unless ($build->{MP_USE_DSO} or $build->{MP_USE_STATIC}) { # default to DSO $build->{MP_USE_DSO} = 1; } $build->{MP_GENERATE_XS} = 1 unless exists $build->{MP_GENERATE_XS}; # define MP_COMPAT_1X unless explicitly told to disable it $build->{MP_COMPAT_1X} = 1 unless exists $build->{MP_COMPAT_1X} && !$build->{MP_COMPAT_1X};}sub parse { my ($self, $lines, $opts) = @_; $opts = VERBOSE|UNKNOWN_FATAL unless defined $opts; my $table = table(); my @unknown; my $continue = ""; my @data = (); for (@$lines) { chomp; s/^\s+//; s/\s+$//; next if /^\#/ || /^$/; last if /^__END__/; # more than one entry on the same line (but make sure to leave # -DMP_* alone) push @data, split /(?=\WMP_)/, $_; } for (@data) { #XXX: this "parser" should be more robust s/^\s+//; s/\s+$//; $_ = "$continue $_" if $continue; #example: +"MP_CCOPTS=-Werror" if $] >= 5.007 if (s/^\+//) { $_ = eval $_; } if (/^MP_/) { my ($key, $val) = split $param_qr, $_, 2; $val ||= "" unless defined $val && $val eq '0'; $continue = $val =~ s/\\$// ? $key : ""; if (!$table->{$key} and $opts & UNKNOWN_FATAL) { my $usage = usage(); die "Unknown Option: $key\nUsage:\n$usage\n"; } if ($key eq 'MP_APXS') { $val = File::Spec->canonpath(File::Spec->rel2abs($val)); } if ($key eq 'MP_AP_PREFIX') { $val = File::Spec->canonpath(File::Spec->rel2abs($val)); if (Apache2::Build::WIN32()) { # MP_AP_PREFIX may not contain spaces require Win32; $val = Win32::GetShortPathName($val); } } if ($table->{$key}->{append}){ $self->{$key} = join " ", grep $_, $self->{$key}, $val; } else { $self->{$key} = $val; } print " $key = $val\n" if $opts & VERBOSE; } else { push @unknown, $_; } } return \@unknown;}sub parse_file { my $self = shift; my $fh; my @dirs = qw(./ ../ ./. ../.); push @dirs, "$ENV{HOME}/." if exists $ENV{HOME}; my @files = map { $_ . 'makepl_args.mod_perl2' } @dirs; 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->{$_}->{val}" } 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, $append, $val) = split /\s+/, $_, 3; $table{'MP_' . $key} = { append => $append, val => $val }; } return \%table;}my $Table;sub table { $Table ||= parse_table(\*DATA);}1;# __DATA__ format:# key append description# where:# key: is the option name# append: is whether we want to replace a default option (0)# or append the arg to the option (1)# desc: description for this option__DATA__USE_GTOP 0 Link with libgtop and enable libgtop reportingDEBUG 0 Turning on debugging (-g -lperld) and tracingMAINTAINER 0 Maintainer mode: DEBUG=1 -DAP_DEBUG -Wall ...CCOPTS 1 Add to compiler flagsTRACE 0 Turn on tracingUSE_DSO 0 Build mod_perl as a dsoUSE_STATIC 0 Build mod_perl staticPROMPT_DEFAULT 0 Accept default value for all would-be promptsOPTIONS_FILE 0 Read options from given fileSTATIC_EXTS 0 Build Apache2::*.xs as static extensionsAPXS 0 Path to apxsAP_DESTDIR 0 Destination for Apache specific mod_perl bitsAP_PREFIX 0 Apache installation or source tree prefixAP_CONFIGURE 0 Apache ./configure argumentsAPR_CONFIG 0 Path to apr-configAPU_CONFIG 0 Path to apu-configXS_GLUE_DIR 1 Directories containing extension glueINCLUDE_DIR 1 Add directories to search for header filesGENERATE_XS 0 Generate XS code based on httpd versionLIBNAME 0 Name of the modperl dso library (default is mod_perl)COMPAT_1X 0 Compile-time mod_perl 1.0 backcompat (default is on)APR_LIB 0 Lib used to build APR::* on Win32 (default is aprext)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -