This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix Errno.pm generation for gcc-5.0
authorPetr Písař <ppisar@redhat.com>
Wed, 11 Feb 2015 14:46:37 +0000 (15:46 +0100)
committerTony Cook <tony@develop-help.com>
Mon, 16 Feb 2015 23:21:43 +0000 (10:21 +1100)
gcc-5.0 -E interleaves now line numbers with expended macros, so that
the generated errno.c will be preprocessed to

EBFONT => [[
           59
                ]]

which is hard to parse in in line-based reader.

So use -P option with gcc >= 5.0. Global -P usage would break makedepend,
global -ftrack-macro-expansion=0 would break lib/h2ph.t.

RT#123784

ext/Errno/Errno_pm.PL

index 3dadfce..c6bfa06 100644 (file)
@@ -2,7 +2,7 @@ use ExtUtils::MakeMaker;
 use Config;
 use strict;
 
-our $VERSION = "1.22";
+our $VERSION = "1.23";
 
 my %err = ();
 
@@ -215,20 +215,31 @@ sub write_errno_pm {
     {  # BeOS (support now removed) did not enter this block
     # invoke CPP and read the output
 
+       my $inhibit_linemarkers = '';
+       if ($Config{gccversion} =~ /\A(\d+)\./ and $1 >= 5) {
+           # GCC 5.0 interleaves expanded macros with line numbers breaking
+           # each line into multiple lines. RT#123784
+           $inhibit_linemarkers = ' -P';
+       }
+
        if ($^O eq 'VMS') {
-           my $cpp = "$Config{cppstdin} $Config{cppflags} $Config{cppminus}";
+           my $cpp = "$Config{cppstdin} $Config{cppflags}" .
+               $inhibit_linemarkers . " $Config{cppminus}";
            $cpp =~ s/sys\$input//i;
            open(CPPO,"$cpp  errno.c |") or
                die "Cannot exec $Config{cppstdin}";
        } elsif ($IsMSWin32 || $^O eq 'NetWare') {
-           open(CPPO,"$Config{cpprun} $Config{cppflags} errno.c |") or
-               die "Cannot run '$Config{cpprun} $Config{cppflags} errno.c'";
+           my $cpp = "$Config{cpprun} $Config{cppflags}" .
+               $inhibit_linemarkers;
+           open(CPPO,"$cpp errno.c |") or
+               die "Cannot run '$cpp errno.c'";
        } elsif ($IsSymbian) {
-            my $cpp = "gcc -E -I$ENV{SDK}\\epoc32\\include\\libc -";
+            my $cpp = "gcc -E -I$ENV{SDK}\\epoc32\\include\\libc" .
+               $inhibit_linemarkers ." -";
            open(CPPO,"$cpp < errno.c |")
                or die "Cannot exec $cpp";
         } else {
-           my $cpp = default_cpp();
+           my $cpp = default_cpp() . $inhibit_linemarkers;
            open(CPPO,"$cpp < errno.c |")
                or die "Cannot exec $cpp";
        }