]> ruderich.org/simon Gitweb - blhc/blhc.git/blobdiff - bin/blhc
Store exit codes in %exit_code.
[blhc/blhc.git] / bin / blhc
index 4a1c0b1a5b992f089932136e21fee6d8711b81b4..7f1fd84fe1b078841eebbcd06a1c4f83cd6a5e2c 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -142,13 +142,13 @@ my %extension = map { $_ => 1 } (
 # Regexp to match file extensions.
 my $file_extension_regex = qr/
     \s
-    \S+         # Filename without extension.
+    \S+             # Filename without extension.
     \.
-    ([^\\.,;:\s]+) # File extension.
-    (?=\s|\\)   # At end of word. Can't use \b because some files have non
-                # word characters at the end and because \b matches double
-                # extensions (like .cpp.o). Works always as all lines are
-                # terminated with "\n".
+    ([^\\.,;:\s]+)  # File extension.
+    (?=\s|\\)       # At end of word. Can't use \b because some files have non
+                    # word characters at the end and because \b matches double
+                    # extensions (like .cpp.o). Works always as all lines are
+                    # terminated with "\n".
     /x;
 
 # Expected (hardening) flags. All flags are used as regexps.
@@ -203,6 +203,14 @@ my %flag_renames = (
     '-Wl,(-z,)?now'   => '-Wl,-z,now',
 );
 
+my %exit_code = (
+    no_compiler_commands => 1 << 0,
+    # used by POD::Usage => 1 << 1,
+    non_verbose_build    => 1 << 2,
+    flags_missing        => 1 << 3,
+    hardening_wrapper    => 1 << 4,
+);
+
 # Statistics of missing flags and non-verbose build commands. Used for
 # $option_buildd.
 my %statistics = (
@@ -312,13 +320,16 @@ 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|CXX|CXXLD|LD|LINK)\]?\s+(.+?)$/
+                or $line =~ /^\s*\[?(?:CC|CCLD|C\+\+|CXX|CXXLD|LD|LINK)\]?\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 (.+?)$/)) {
         return 0;
     }
 
+    # False positives.
+    return 0 if $line =~ /^\s*C\+\+.+?:\s+(?:yes|no)\s*$/;
+
     my $file = $1;
 
     # On the first pass we only check if this line is verbose or not.
@@ -491,7 +502,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 print "I-hardening-wrapper-used\n";
             }
-            $exit |= 1 << 4;
+            $exit |= $exit_code{hardening_wrapper};
             next FILE;
         }
 
@@ -586,6 +597,9 @@ FILE: foreach my $file (@ARGV) {
                 # `./configure` output.
                 next if not $non_verbose
                         and $line =~ /^(?:checking|(?:C|c)onfigure:) /;
+                next if $line =~ /^\s*(?:Host\s+)?(?:C(?:\+\+)?\s+)?
+                                   (?:C|c)ompiler[\s.]*:?\s+
+                                 /xo;
                 next if $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex_full\s*$/o;
 
                 # Check if additional hardening options were used. Used to
@@ -606,7 +620,7 @@ FILE: foreach my $file (@ARGV) {
         } else {
             print "W-no-compiler-commands\n";
         }
-        $exit |= 1;
+        $exit |= $exit_code{no_compiler_commands};
         next FILE;
     }
 
@@ -676,7 +690,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 $statistics{commands_nonverbose}++;
             }
-            $exit |= 1 << 2;
+            $exit |= $exit_code{non_verbose_build};
             next;
         }
         # Even if it's a verbose build, we might have to skip this line.
@@ -765,7 +779,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 $statistics{compile_missing}++;
             }
-            $exit |= 1 << 3;
+            $exit |= $exit_code{flags_missing};
         } elsif ($compile_cpp and not all_flags_used($line, \@missing, @cflags)
                 # Libraries linked with -fPIC don't have to (and can't) be
                 # linked with -fPIE as well. It's no error if only PIE flags
@@ -778,7 +792,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 $statistics{compile_cpp_missing}++;
             }
-            $exit |= 1 << 3;
+            $exit |= $exit_code{flags_missing};
         }
         if ($preprocess and not all_flags_used($line, \@missing, @cppflags)
                 # Assume dpkg-buildflags returns the correct flags.
@@ -788,7 +802,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 $statistics{preprocess_missing}++;
             }
-            $exit |= 1 << 3;
+            $exit |= $exit_code{flags_missing};
         }
         if ($link and not all_flags_used($line, \@missing, @ldflags)
                 # Same here, -fPIC conflicts with -fPIE.
@@ -800,7 +814,7 @@ FILE: foreach my $file (@ARGV) {
             } else {
                 $statistics{link_missing}++;
             }
-            $exit |= 1 << 3;
+            $exit |= $exit_code{flags_missing};
         }
     }
 }