]> ruderich.org/simon Gitweb - blhc/blhc.git/blobdiff - bin/blhc
Detect more CXX non-verbose builds.
[blhc/blhc.git] / bin / blhc
index 38ca653cd655b8dd6209df0229fdf86e1754edc6..bcae721394c72702bf21630df02e75c71211be77 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -30,7 +30,9 @@ our $VERSION = '0.01';
 # CONSTANTS/VARIABLES
 
 # Regex to catch compiler commands.
-my $cc_regex = qr/(?:x86_64-linux-gnu-)?(?:(?<!\.)cc|gcc|g\+\+|c\+\+)(?:-[\d.]+)?/;
+my $cc_regex = qr/(?:[a-z0-9_]+-(?:linux|kfreebsd)-gnu(?:eabi|eabihf)?-)?
+                  (?:(?<!\.)cc|gcc|g\+\+|c\+\+)
+                  (?:-[\d.]+)?/x;
 # Regex to catch (GCC) compiler warnings.
 my $warning_regex = qr/^(.+?):([0-9]+):[0-9]+: warning: (.+?) \[(.+?)\]$/;
 
@@ -166,7 +168,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|CXX|CXXLD|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 (.+?)$/)) {
@@ -266,6 +268,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.
@@ -281,6 +284,16 @@ 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;
+    # And "ESC(B" which seems to be used on armhf and hurd (not sure what it
+    # does).
+    $line =~ s/\033\(B//g;
+
     # Check if this line indicates a non verbose build.
     my $non_verbose = is_non_verbose_build($line);
 
@@ -297,10 +310,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;
 
@@ -308,13 +337,20 @@ while (my $line = <>) {
             #
             # `./configure` output.
             next if not $non_verbose and $line =~ /^checking /;
+            next if $line =~ /^\s*(?:C\s+)?
+                               (?:C|c)ompiler[\s.]*:\s+
+                               $cc_regex
+                               (?:\s-std=[a-z0-9:+]+)?\s*$
+                             /x
+                    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*/;
+            # Debian buildd output.
+            next if $line =~ /^\s*Depends: .*?$cc_regex.*?$/
+                    and $line !~ /\s-./; # option, prevent false negatives
 
-            push @input, $line;
-        }
 
-        # Line continuation, line ends with "\".
-        if ($line =~ /\\\s*$/) {
-            $continuation = 1;
+            push @input, $line;
         }
     }
 }
@@ -387,12 +423,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;
@@ -404,7 +434,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: /