]> ruderich.org/simon Gitweb - blhc/blhc.git/blobdiff - bin/blhc
Change "no-compiler-commands", "invalid-cmake-used" buildd tags to I-.
[blhc/blhc.git] / bin / blhc
index e3b83d9853910168a05dcb7ac9870f9244200c39..6156b7d1a9b47616e6391b1887ade3cf2453c6c0 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -24,7 +24,7 @@ use warnings;
 use Getopt::Long ();
 use Text::ParseWords ();
 
 use Getopt::Long ();
 use Text::ParseWords ();
 
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 
 # CONSTANTS/VARIABLES
 
 
 # CONSTANTS/VARIABLES
@@ -43,7 +43,7 @@ my $cc_regex_full = qr/
     $cc_regex
     /x;
 # Regex to catch (GCC) compiler warnings.
     $cc_regex
     /x;
 # Regex to catch (GCC) compiler warnings.
-my $warning_regex = qr/^(.+?):([0-9]+):[0-9]+: warning: (.+?) \[(.+?)\]$/;
+my $warning_regex = qr/^(.+?):(\d+):\d+: warning: (.+?) \[(.+?)\]$/;
 
 # List of source file extensions which require preprocessing.
 my @source_preprocess_compile_cpp = (
 
 # List of source file extensions which require preprocessing.
 my @source_preprocess_compile_cpp = (
@@ -153,8 +153,7 @@ my @def_cflags = (
 );
 my @def_cflags_format = (
     '-Wformat',
 );
 my @def_cflags_format = (
     '-Wformat',
-    '-Wformat-security',
-    '-Werror=format-security',
+    '-Werror=format-security', # implies -Wformat-security
 );
 my @def_cflags_fortify = (
     # fortify needs at least -O1, but -O2 is recommended anyway
 );
 my @def_cflags_fortify = (
     # fortify needs at least -O1, but -O2 is recommended anyway
@@ -227,6 +226,14 @@ my %exit_code = (
     invalid_cmake        => 1 << 5,
 );
 
     invalid_cmake        => 1 << 5,
 );
 
+my %buildd_tag = (
+    no_compiler_commands => 'I-no-compiler-commands',
+    non_verbose_build    => 'W-compiler-flags-hidden',
+    flags_missing        => 'W-dpkg-buildflags-missing',
+    hardening_wrapper    => 'I-hardening-wrapper-used',
+    invalid_cmake        => 'I-invalid-cmake-used',
+);
+
 # Statistics of missing flags and non-verbose build commands. Used for
 # $option_buildd.
 my %statistics = (
 # Statistics of missing flags and non-verbose build commands. Used for
 # $option_buildd.
 my %statistics = (
@@ -257,14 +264,14 @@ sub error_flags {
         } @{$missing_flags_ref};
 
     my $flags = join ' ', @missing_flags;
         } @{$missing_flags_ref};
 
     my $flags = join ' ', @missing_flags;
-    printf "%s (%s)%s %s",
+    printf '%s (%s)%s %s',
            error_color($message, 'red'), $flags, error_color(':', 'yellow'),
            $line;
 }
 sub error_non_verbose_build {
     my ($line) = @_;
 
            error_color($message, 'red'), $flags, error_color(':', 'yellow'),
            $line;
 }
 sub error_non_verbose_build {
     my ($line) = @_;
 
-    printf "%s%s %s",
+    printf '%s%s %s',
            error_color('NONVERBOSE BUILD', 'red'),
            error_color(':', 'yellow'),
            $line;
            error_color('NONVERBOSE BUILD', 'red'),
            error_color(':', 'yellow'),
            $line;
@@ -345,8 +352,8 @@ sub is_non_verbose_build {
 
     if (not (index($line, 'checking if you want to see long compiling messages... no') == 0
                 or $line =~ /^\s*\[?(?:CC|CCLD|C\+\+|CXX|CXXLD|LD|LINK)\]?\s+(.+?)$/
 
     if (not (index($line, 'checking if you want to see long compiling messages... no') == 0
                 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*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/
+                or $line =~ /^\s*[Bb]uilding (?:program|shared library)\s+(.+?)$/
                 or $line =~ /^\s*\[[\d ]+%\] Building (?:C|CXX) object (.+?)$/)) {
         return 0;
     }
                 or $line =~ /^\s*\[[\d ]+%\] Building (?:C|CXX) object (.+?)$/)) {
         return 0;
     }
@@ -356,7 +363,7 @@ sub is_non_verbose_build {
     # C++ compiler setting.
     return 0 if $line =~ /^\s*C\+\+.+?:\s+(?:yes|no)\s*$/;
     # "Compiling" with no file name.
     # C++ compiler setting.
     return 0 if $line =~ /^\s*C\+\+.+?:\s+(?:yes|no)\s*$/;
     # "Compiling" with no file name.
-    if ($line =~ /^\s*(?:C|c)ompiling\s+(.+?)(?:\.\.\.)?$/) {
+    if ($line =~ /^\s*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/) {
         # $file_extension_regex may need spaces around the filename.
         return 0 if not " $1 " =~ /$file_extension_regex/o;
     }
         # $file_extension_regex may need spaces around the filename.
         return 0 if not " $1 " =~ /$file_extension_regex/o;
     }
@@ -450,8 +457,7 @@ if (not Getopt::Long::GetOptions(
             'color'         => \$option_color,
             'arch=s'        => \$option_arch,
             'buildd'        => \$option_buildd,
             'color'         => \$option_color,
             'arch=s'        => \$option_arch,
             'buildd'        => \$option_buildd,
-        )
-        or scalar @ARGV == 0) {
+        )) {
     require Pod::Usage;
     Pod::Usage::pod2usage(2);
 }
     require Pod::Usage;
     Pod::Usage::pod2usage(2);
 }
@@ -478,6 +484,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     exit 0;
 }
 
     exit 0;
 }
 
+# Arguments missing.
+if (scalar @ARGV == 0) {
+    require Pod::Usage;
+    Pod::Usage::pod2usage(2);
+}
+
 # Don't load Term::ANSIColor in buildd mode because Term::ANSIColor is not
 # installed on Debian's buildds.
 if (not $option_buildd) {
 # Don't load Term::ANSIColor in buildd mode because Term::ANSIColor is not
 # installed on Debian's buildds.
 if (not $option_buildd) {
@@ -535,6 +547,15 @@ foreach my $file (@ARGV) {
     my $harden_pie     = $option_pie;     # defaults to 0
 
     while (my $line = <$fh>) {
     my $harden_pie     = $option_pie;     # defaults to 0
 
     while (my $line = <$fh>) {
+        # Detect architecture automatically unless overridden. For buildd logs
+        # only, doesn't use the dpkg-buildpackage header. Necessary to ignore
+        # build logs which aren't built (wrong architecture, build error,
+        # etc.).
+        if (not $arch
+                and $line =~ /^Architecture: (.+)$/) {
+            $arch = $1;
+        }
+
         # dpkg-buildflags only provides hardening flags since 1.16.1, don't
         # check for hardening flags in buildd mode if an older dpkg-dev is
         # used. Default flags (-g -O2) are still checked.
         # dpkg-buildflags only provides hardening flags since 1.16.1, don't
         # check for hardening flags in buildd mode if an older dpkg-dev is
         # used. Default flags (-g -O2) are still checked.
@@ -567,7 +588,7 @@ foreach my $file (@ARGV) {
             if (not $option_buildd) {
                 error_invalid_cmake($1);
             } else {
             if (not $option_buildd) {
                 error_invalid_cmake($1);
             } else {
-                print "W-invalid-cmake-used $1\n";
+                print "$buildd_tag{invalid_cmake} $1\n";
             }
             $exit |= $exit_code{invalid_cmake};
         }
             }
             $exit |= $exit_code{invalid_cmake};
         }
@@ -579,7 +600,7 @@ foreach my $file (@ARGV) {
             if (not $option_buildd) {
                 error_hardening_wrapper();
             } else {
             if (not $option_buildd) {
                 error_hardening_wrapper();
             } else {
-                print "I-hardening-wrapper-used\n";
+                print "$buildd_tag{hardening_wrapper}\n";
             }
             $exit |= $exit_code{hardening_wrapper};
             next FILE;
             }
             $exit |= $exit_code{hardening_wrapper};
             next FILE;
@@ -635,7 +656,7 @@ foreach my $file (@ARGV) {
                        $_ =~ s/\s+$//;
                        $_ .= "\n";
                    } Text::ParseWords::parse_line(';', 1, $line);
                        $_ =~ s/\s+$//;
                        $_ .= "\n";
                    } Text::ParseWords::parse_line(';', 1, $line);
-        foreach $line (@line) {
+        foreach my $line (@line) {
             if ($continuation) {
                 $continuation = 0;
 
             if ($continuation) {
                 $continuation = 0;
 
@@ -674,9 +695,9 @@ foreach my $file (@ARGV) {
             #
             # `./configure` output.
             next if not $non_verbose
             #
             # `./configure` output.
             next if not $non_verbose
-                    and $line =~ /^(?:checking|(?:C|c)onfigure:) /;
+                    and $line =~ /^(?:checking|[Cc]onfigure:) /;
             next if $line =~ /^\s*(?:Host\s+)?(?:C(?:\+\+)?\s+)?
             next if $line =~ /^\s*(?:Host\s+)?(?:C(?:\+\+)?\s+)?
-                                (?:C|c)ompiler[\s.]*:?\s+
+                                [Cc]ompiler[\s.]*:?\s+
                                 /xo;
             next if $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex_full\s*$/o;
 
                                 /xo;
             next if $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex_full\s*$/o;
 
@@ -689,7 +710,7 @@ foreach my $file (@ARGV) {
         }
     }
 
         }
     }
 
-    close $fh;
+    close $fh or die $!;
 
     # Ignore arch if requested.
     if (scalar @option_ignore_arch > 0 and $arch) {
 
     # Ignore arch if requested.
     if (scalar @option_ignore_arch > 0 and $arch) {
@@ -705,7 +726,7 @@ foreach my $file (@ARGV) {
         if (not $option_buildd) {
             print "No compiler commands!\n";
         } else {
         if (not $option_buildd) {
             print "No compiler commands!\n";
         } else {
-            print "W-no-compiler-commands\n";
+            print "$buildd_tag{no_compiler_commands}\n";
         }
         $exit |= $exit_code{no_compiler_commands};
         next FILE;
         }
         $exit |= $exit_code{no_compiler_commands};
         next FILE;
@@ -932,32 +953,32 @@ if ($option_buildd) {
     my @warning;
 
     if ($statistics{preprocess_missing}) {
     my @warning;
 
     if ($statistics{preprocess_missing}) {
-        push @warning, sprintf "CPPFLAGS %d (of %d)",
+        push @warning, sprintf 'CPPFLAGS %d (of %d)',
                                $statistics{preprocess_missing},
                                $statistics{preprocess};
     }
     if ($statistics{compile_missing}) {
                                $statistics{preprocess_missing},
                                $statistics{preprocess};
     }
     if ($statistics{compile_missing}) {
-        push @warning, sprintf "CFLAGS %d (of %d)",
+        push @warning, sprintf 'CFLAGS %d (of %d)',
                                $statistics{compile_missing},
                                $statistics{compile};
     }
     if ($statistics{compile_cpp_missing}) {
                                $statistics{compile_missing},
                                $statistics{compile};
     }
     if ($statistics{compile_cpp_missing}) {
-        push @warning, sprintf "CXXFLAGS %d (of %d)",
+        push @warning, sprintf 'CXXFLAGS %d (of %d)',
                                $statistics{compile_cpp_missing},
                                $statistics{compile_cpp};
     }
     if ($statistics{link_missing}) {
                                $statistics{compile_cpp_missing},
                                $statistics{compile_cpp};
     }
     if ($statistics{link_missing}) {
-        push @warning, sprintf "LDFLAGS %d (of %d)",
+        push @warning, sprintf 'LDFLAGS %d (of %d)',
                                $statistics{link_missing},
                                $statistics{link};
     }
     if (scalar @warning) {
         local $" = ', '; # array join string
                                $statistics{link_missing},
                                $statistics{link};
     }
     if (scalar @warning) {
         local $" = ', '; # array join string
-        print "W-dpkg-buildflags-missing @warning missing\n";
+        print "$buildd_tag{flags_missing} @warning missing\n";
     }
 
     if ($statistics{commands_nonverbose}) {
     }
 
     if ($statistics{commands_nonverbose}) {
-        printf "W-compiler-flags-hidden %d (of %d) hidden\n",
+        printf "$buildd_tag{non_verbose_build} %d (of %d) hidden\n",
                $statistics{commands_nonverbose},
                $statistics{commands},
     }
                $statistics{commands_nonverbose},
                $statistics{commands},
     }
@@ -1140,11 +1161,11 @@ CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS missing.
 
 =item
 
 
 =item
 
-B<W-invalid-cmake-used> (version)
+B<I-invalid-cmake-used> (version)
 
 =item
 
 
 =item
 
-B<W-no-compiler-commands>
+B<I-no-compiler-commands>
 
 No compiler commands were detected. Either the log contains none or they were
 not correctly detected by blhc (please report the bug in this case).
 
 No compiler commands were detected. Either the log contains none or they were
 not correctly detected by blhc (please report the bug in this case).