X-Git-Url: https://ruderich.org/simon/gitweb/?p=blhc%2Fblhc.git;a=blobdiff_plain;f=bin%2Fblhc;h=835e9e04e344cea2d96ffe44f5a4fc032343eb83;hp=f2e7295f3c79c34dd65f413fa7a0c09a4644692b;hb=c2dd74aada8d92258b14727c057e5d02a4c8c7a4;hpb=0de8fe5bbd96d47e03fa301d2762eae2f70b4a91 diff --git a/bin/blhc b/bin/blhc index f2e7295..835e9e0 100755 --- 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 @@ -195,10 +188,30 @@ 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', + '-O(?:2|3)' => '-O2', '-Wl,(?:-z,)?relro' => '-Wl,-z,relro', '-Wl,(?:-z,)?now' => '-Wl,-z,now', ); @@ -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 . 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,19 +482,9 @@ 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; @@ -562,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); @@ -737,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; @@ -746,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. @@ -933,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>