diff options
author | Jason Vas Dias <unknown> | 2006-01-31 01:50:32 -0800 |
---|---|---|
committer | H.Merijn Brand <h.m.brand@xs4all.nl> | 2006-03-02 20:07:51 +0000 |
commit | ddfca5da10590b8934c0a4e6b1f77a03901648cf (patch) | |
tree | d721dcb84267415c1e8d4efd4fa39033a0ed5fac | |
parent | 2664ba31e585823b9cf5eeb21aacafe2a554582a (diff) | |
download | perl-ddfca5da10590b8934c0a4e6b1f77a03901648cf.tar.gz |
[perl #38385] _h2ph_pre.ph / $Config{cppsymbols} omits gcc-3.4+ cpp "predefined macros"
From: Jason Vas Dias (via RT) <perlbug-followup@perl.org>
p4raw-id: //depot/perl@27363
-rwxr-xr-x | Configure | 17 | ||||
-rw-r--r-- | utils/h2ph.PL | 63 |
2 files changed, 50 insertions, 30 deletions
@@ -26,7 +26,7 @@ # $Id: Head.U,v 3.0.1.9 1997/02/28 15:02:09 ram Exp $ # -# Generated on Wed Feb 15 09:59:58 CET 2006 [metaconfig 3.0 PL70] +# Generated on Thu Mar 2 21:01:10 CET 2006 [metaconfig 3.0 PL70] # (with additional metaconfig patches by perlbug@perl.org) cat >c1$$ <<EOF @@ -20187,7 +20187,7 @@ set prot.h i_prot eval $inhdr echo " " -$echo "Guessing which symbols your C compiler and preprocessor define..." >&4 +$echo "Guessing which symbols your C compiler and preprocessor define..." >&4 $cat <<'EOSH' > Cppsym.know a29k ABI64 aegis AES_SOURCE AIX AIX32 AIX370 AIX41 AIX42 AIX43 AIX_SOURCE aixpc ALL_SOURCE @@ -20318,6 +20318,19 @@ EOSH chmod +x Cppsym.try $eunicefix Cppsym.try ./Cppsym < Cppsym.know > Cppsym.true +: Add in any linux cpp "predefined macros": +if [[ "$osname" == *linux* ]] && [[ "$gccversion" != "" ]]; then + tHdrH=_tmpHdr + rm -f $tHdrH'.h' $tHdrH + touch $tHdrH'.h' + if cpp -dM $tHdrH'.h' > $tHdrH'_cppsym.h' && [ -s $tHdrH'_cppsym.h' ]; then + sed 's/#define[\ \ ]*//;s/[\ \ ].*$//' <$tHdrH'_cppsym.h' >$tHdrH'_cppsym.real' + if [ -s $tHdrH'_cppsym.real' ]; then + cat $tHdrH'_cppsym.real' Cppsym.know | sort | uniq | ./Cppsym | sort | uniq > Cppsym.true + fi + fi + rm -f $tHdrH'.h' $tHdrH'_cppsym.h' $tHdrH'_cppsym.real' +fi : now check the C compiler for additional symbols postprocess_cc_v='' case "$osname" in diff --git a/utils/h2ph.PL b/utils/h2ph.PL index 78e10a4637..5fe2e9f458 100644 --- a/utils/h2ph.PL +++ b/utils/h2ph.PL @@ -772,25 +772,33 @@ sub build_preamble_if_necessary my (%define) = _extract_cc_defines(); open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!"; - print PREAMBLE "# This file was created by h2ph version $VERSION\n"; + print PREAMBLE "# This file was created by h2ph version $VERSION\n"; - foreach (sort keys %define) { - if ($opt_D) { - print PREAMBLE "# $_=$define{$_}\n"; - } - - if ($define{$_} =~ /^(\d+)U?L{0,2}$/i) { - print PREAMBLE - "unless (defined &$_) { sub $_() { $1 } }\n\n"; - } elsif ($define{$_} =~ /^\w+$/) { - print PREAMBLE - "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n"; - } else { - print PREAMBLE - "unless (defined &$_) { sub $_() { \"", - quotemeta($define{$_}), "\" } }\n\n"; - } - } + foreach (sort keys %define) { + if ($opt_D) { + print PREAMBLE "# $_=$define{$_}\n"; + } + if ($define{$_} =~ /^\((.*)\)$/) { + # parenthesized value: d=(v) + $define{$_} = $1; + } + if ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) { + # float: + print PREAMBLE + "unless (defined &$_) { sub $_() { $1 } }\n\n"; + } elsif ($define{$_} =~ /^([+-]?\d+)U?L{0,2}$/i) { + # integer: + print PREAMBLE + "unless (defined &$_) { sub $_() { $1 } }\n\n"; + } elsif ($define{$_} =~ /^\w+$/) { + print PREAMBLE + "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n"; + } else { + print PREAMBLE + "unless (defined &$_) { sub $_() { \"", + quotemeta($define{$_}), "\" } }\n\n"; + } + } close PREAMBLE or die "Cannot close $preamble: $!"; } @@ -802,15 +810,14 @@ sub _extract_cc_defines { my %define; my $allsymbols = join " ", - @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'}; + @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'}; # Split compiler pre-definitions into `key=value' pairs: - foreach (split /\s+/, $allsymbols) { - /(.+?)=(.+)/ and $define{$1} = $2; - - if ($opt_D) { - print STDERR "$_: $1 -> $2\n"; - } + while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) { + $define{$1} = $2; + if ($opt_D) { + print STDERR "$_: $1 -> $2\n"; + } } return %define; @@ -945,10 +952,10 @@ installation. Doesn't handle complicated expressions built piecemeal, a la: enum { - FIRST_VALUE, - SECOND_VALUE, + FIRST_VALUE, + SECOND_VALUE, #ifdef ABC - THIRD_VALUE + THIRD_VALUE #endif }; |