X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=bin%2Fblhc;h=a884e11407188fcf0e679416e695150cbf4f4b08;hb=ca67c9cf80b5b8e3ca1c0e44d1d10e4d67020d5e;hp=d2e5df761c09e45e5943cc7ba328cd8f34f3746f;hpb=ea4a36f6673fe09075554d52d327149469d427a7;p=blhc%2Fblhc.git diff --git a/bin/blhc b/bin/blhc index d2e5df7..a884e11 100755 --- a/bin/blhc +++ b/bin/blhc @@ -37,7 +37,7 @@ my $warning_regex = qr/^(.+?):([0-9]+):[0-9]+: warning: (.+?) \[(.+?)\]$/; # Expected (hardening) flags. All flags are used as regexps. my @cflags = ( '-g', - '-O2', + '-O(?:2|3)', ); my @cflags_format = ( '-Wformat', @@ -71,6 +71,7 @@ my @ldflags_pie = ( ); # Renaming rules for the output so the regex parts are not visible. my %flag_renames = ( + '-O(?:2|3)' => '-O2', '-Wl,(-z,)?relro' => '-Wl,-z,relro', '-Wl,(-z,)?now' => '-Wl,-z,now', ); @@ -165,7 +166,7 @@ sub is_non_verbose_build { my ($line, $next_line, $skip_ref) = @_; if (not ($line =~ /^checking if you want to see long compiling messages\.\.\. no/ - or $line =~ /^\s*(?:CC|CCLD)\s+(.+?)$/ + or $line =~ /^\s*\[?(?:CC|CCLD|LD)\]?\s+(.+?)$/ or $line =~ /^\s*(?:C|c)ompiling\s+(.+?)(?:\.\.\.)?$/ or $line =~ /^\s*(?:B|b)uilding (?:program|shared library)\s+(.+?)$/ or $line =~ /^\s*\[[\d ]+%\] Building (?:C|CXX) object (.+?)$/)) { @@ -265,6 +266,7 @@ my @input = (); my $start = 0; my $continuation = 0; +my $complete_line = undef; while (my $line = <>) { # We skip over unimportant lines at the beginning to prevent false # positives. @@ -280,6 +282,13 @@ while (my $line = <>) { # Ignore compiler warnings for now. next if $line =~ /$warning_regex/; + # Remove all ANSI color sequences which are sometimes used in non-verbose + # builds. + $line = Term::ANSIColor::colorstrip($line); + # Also strip '\0xf' (delete previous character), used by Elink's build + # system. + $line =~ s/\x0f//g; + # Check if this line indicates a non verbose build. my $non_verbose = is_non_verbose_build($line); @@ -296,10 +305,26 @@ while (my $line = <>) { # Join lines, but leave the "\" in place so it's clear where the # original line break was. - chomp $input[-1]; - $input[-1] .= ' ' . $line; + chomp $complete_line; + $complete_line .= ' ' . $line; + } + # Line continuation, line ends with "\". + if ($line =~ /\\\s*$/) { + $continuation = 1; + # Start line continuation. + if (not defined $complete_line) { + $complete_line = $line; + } + next; + } + + if (not $continuation) { + # Use the complete line if a line continuation occurred. + if (defined $complete_line) { + $line = $complete_line; + $complete_line = undef; + } - } else { # Ignore lines with no compiler commands. next if $line !~ /\b$cc_regex(?:\s|\\)/ and not $non_verbose; @@ -307,14 +332,13 @@ while (my $line = <>) { # # `./configure` output. next if not $non_verbose and $line =~ /^checking /; + next if $line =~ /^\s*(?:C|c)ompiler[\s.]*:\s+$cc_regex(?:\s-std=[a-z0-9:+]+)?\s*$/ + or $line =~ /^\s*(?:- )?(?:CC|CXX)\s*=\s*$cc_regex\s*$/ + or $line =~ /^\s*-- Check for working (?:C|CXX) compiler: / + or $line =~ /^\s*(?:echo )?Using [A-Z_]+\s*=\s*/; push @input, $line; } - - # Line continuation, line ends with "\". - if ($line =~ /\\\s*$/) { - $continuation = 1; - } } } @@ -386,12 +410,6 @@ for (my $i = 0; $i < scalar @input; $i++) { # Even if it's a verbose build, we might have to skip this line. next if $skip; - # Ignore false positives. - # - # ./configure summary. - next if $line =~ /^\s*(?:C|c)ompiler[\s.]*:\s+$cc_regex(?:\s-std=[a-z0-9:+]+)?\s*$/ - or $line =~ /^\s*- (?:CC|CXX)\s*=\s*$cc_regex\s*$/ - or $line =~ /^\s*-- Check for working (?:C|CXX) compiler: /; # Is this a compiler or linker command? my $compiler = 1; @@ -403,7 +421,8 @@ for (my $i = 0; $i < scalar @input; $i++) { (?:[/.A-Za-z0-9~_-]+/)? # path to file [A-Za-z0-9~_-]+ # binary name (no dots!) (?:[0-9.]*\.so[0-9.]*[a-z]? # library (including version) - |\.la)? + |\.la + |\.cgi)? # CGI binary (?:\s|\\|$) # end of file name }x or $line =~ /^libtool: link: /