]> ruderich.org/simon Gitweb - blhc/blhc.git/blobdiff - bin/blhc
Abort with an error if no files are given.
[blhc/blhc.git] / bin / blhc
index eb803248d784514aff2143a3c4835d475daa25db..835e9e04e344cea2d96ffe44f5a4fc032343eb83 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -22,7 +22,6 @@ use strict;
 use warnings;
 
 use Getopt::Long ();
-use Term::ANSIColor ();
 use Text::ParseWords ();
 
 our $VERSION = '0.01';
@@ -129,14 +128,8 @@ my %extensions_compile_cpp = map { $_ => 1 } (
 );
 my %extension = map { $_ => 1 } (
     @source_no_preprocess,
-    @source_no_preprocess_compile,
-    @source_no_preprocess_compile_cpp,
-    @source_no_preprocess_no_compile,
     @header_preprocess,
     @source_preprocess,
-    @source_preprocess_compile,
-    @source_preprocess_compile_cpp,
-    @source_preprocess_no_compile,
 );
 
 # Regexp to match file extensions.
@@ -144,7 +137,7 @@ my $file_extension_regex = qr/
     \s
     \S+             # Filename without extension.
     \.
-    ([^\\.,;:\s]+)  # File 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
@@ -181,10 +174,10 @@ my @def_cppflags_fortify = (
 );
 my @def_ldflags = ();
 my @def_ldflags_relro = (
-    '-Wl,(-z,)?relro',
+    '-Wl,(?:-z,)?relro',
 );
 my @def_ldflags_bindnow = (
-    '-Wl,(-z,)?now',
+    '-Wl,(?:-z,)?now',
 );
 my @def_ldflags_pie = (
     '-fPIE',
@@ -195,12 +188,32 @@ my @def_ldflags_pic = (
     '-fpic',
     '-shared',
 );
+# References to all flags checked by the parser.
+my @flag_refs = (
+    \@def_cflags,
+    \@def_cflags_format,
+    \@def_cflags_fortify,
+    \@def_cflags_stack,
+    \@def_cflags_pie,
+    \@def_cxxflags,
+    \@def_cppflags,
+    \@def_cppflags_fortify,
+    \@def_ldflags,
+    \@def_ldflags_relro,
+    \@def_ldflags_bindnow,
+);
+# References to all used flags.
+my @flag_refs_all = (
+    @flag_refs,
+    \@def_ldflags_pie,
+    \@def_ldflags_pic,
+);
 # Renaming rules for the output so the regex parts are not visible. Also
 # stores string values of flag regexps above, see compile_flag_regexp().
 my %flag_renames = (
-    '-O(?:2|3)'       => '-O2',
-    '-Wl,(-z,)?relro' => '-Wl,-z,relro',
-    '-Wl,(-z,)?now'   => '-Wl,-z,now',
+    '-O(?:2|3)'         => '-O2',
+    '-Wl,(?:-z,)?relro' => '-Wl,-z,relro',
+    '-Wl,(?:-z,)?now'   => '-Wl,-z,now',
 );
 
 my %exit_code = (
@@ -337,7 +350,14 @@ sub is_non_verbose_build {
     }
 
     # False positives.
+    #
+    # 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+(.+?)(?:\.\.\.)?$/) {
+        # $file_extension_regex may need spaces around the filename.
+        return 0 if not " $1 " =~ /$file_extension_regex/o;
+    }
 
     my $file = $1;
 
@@ -421,7 +441,8 @@ if (not Getopt::Long::GetOptions(
             'color'    => \$option_color,
             'arch=s'   => \$option_arch,
             'buildd'   => \$option_buildd,
-        )) {
+        )
+        or scalar @ARGV == 0) {
     require Pod::Usage;
     Pod::Usage::pod2usage(2);
 }
@@ -448,6 +469,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     exit 0;
 }
 
+# Don't load Term::ANSIColor in buildd mode because Term::ANSIColor is not
+# installed on Debian's buildds.
+if (not $option_buildd) {
+    require Term::ANSIColor;
+}
+
 if ($option_all) {
     $option_pie     = 1;
     $option_bindnow = 1;
@@ -455,24 +482,16 @@ if ($option_all) {
 
 # Precompile all flag regexps. any_flags_used(), all_flags_used() get a lot
 # faster with this.
-@def_cflags           = compile_flag_regexp(\%flag_renames, @def_cflags);
-@def_cflags_format    = compile_flag_regexp(\%flag_renames, @def_cflags_format);
-@def_cflags_fortify   = compile_flag_regexp(\%flag_renames, @def_cflags_fortify);
-@def_cflags_stack     = compile_flag_regexp(\%flag_renames, @def_cflags_stack);
-@def_cflags_pie       = compile_flag_regexp(\%flag_renames, @def_cflags_pie);
-@def_cxxflags         = compile_flag_regexp(\%flag_renames, @def_cxxflags);
-@def_cppflags         = compile_flag_regexp(\%flag_renames, @def_cppflags);
-@def_cppflags_fortify = compile_flag_regexp(\%flag_renames, @def_cppflags_fortify);
-@def_ldflags          = compile_flag_regexp(\%flag_renames, @def_ldflags);
-@def_ldflags_relro    = compile_flag_regexp(\%flag_renames, @def_ldflags_relro);
-@def_ldflags_bindnow  = compile_flag_regexp(\%flag_renames, @def_ldflags_bindnow);
-@def_ldflags_pie      = compile_flag_regexp(\%flag_renames, @def_ldflags_pie);
-@def_ldflags_pic      = compile_flag_regexp(\%flag_renames, @def_ldflags_pic);
+foreach my $flags (@flag_refs_all) {
+    @{$flags} = compile_flag_regexp(\%flag_renames, @{$flags});
+}
 
 # Final exit code.
 my $exit = 0;
 
 FILE: foreach my $file (@ARGV) {
+    print "checking '$file'...\n" if scalar @ARGV > 1;
+
     open my $fh, '<', $file or die "$!: $file";
 
     # Architecture of this file.
@@ -560,7 +579,7 @@ FILE: foreach my $file (@ARGV) {
         # Ignore compiler warnings for now.
         next if $line =~ /$warning_regex/o;
 
-        if ($line =~ /\033/) { # esc
+        if (not $option_buildd and $line =~ /\033/) { # esc
             # Remove all ANSI color sequences which are sometimes used in
             # non-verbose builds.
             $line = Term::ANSIColor::colorstrip($line);
@@ -735,6 +754,7 @@ FILE: foreach my $file (@ARGV) {
         # Skip unnecessary tests when only preprocessing.
         my $flag_preprocess = 0;
 
+        my $dependency = 0;
         my $preprocess = 0;
         my $compile    = 0;
         my $link       = 0;
@@ -744,11 +764,25 @@ FILE: foreach my $file (@ARGV) {
             $preprocess      = 1;
             $flag_preprocess = 1 if $1 eq '-E';
             $compile         = 1 if $1 eq '-S' or $1 eq '-c';
+        # Dependency generation for Makefiles. The other flags (-MF -MG -MP
+        # -MT -MQ) are always used with -M/-MM.
+        } elsif ($line =~ /\s(?:-M|-MM)\b/) {
+            $dependency = 1;
         # Otherwise assume we are linking.
         } else {
             $link = 1;
         }
 
+        # -MD/-MMD also cause dependency generation, but they don't imply -E!
+        if ($line =~ /\s(?:-MD|-MMD)\b/) {
+            $dependency      = 0;
+            $flag_preprocess = 0;
+        }
+
+        # Dependency generation for Makefiles, no preprocessing or other flags
+        # needed.
+        next if $dependency;
+
         # Get all file extensions on this line.
         my @extensions = $line =~ /$file_extension_regex/go;
         # Ignore all unknown extensions to speedup the search below.
@@ -931,9 +965,18 @@ changes are in effect:
 
 =item
 
+Print tags instead of normal warnings, see README file for a list of possible
+tags.
+
+=item
+
 Don't check hardening flags in old log files (if dpkg-dev << 1.16.1 is
 detected).
 
+=item
+
+Don't require Term::ANSIColor.
+
 =back
 
 =item B<--color>