X-Git-Url: https://ruderich.org/simon/gitweb/?p=blhc%2Fblhc.git;a=blobdiff_plain;f=bin%2Fblhc;h=168a1699c21744707ff22708aebd49e7c44ef20d;hp=b51d18653d0dfca5cd1c270683ba17e6ed7ce5ef;hb=47eb461331046250bbe1b2d39f73266a25bb5315;hpb=56ec5b40a99b961306fb0ae1a16cd1b66c351cf8 diff --git a/bin/blhc b/bin/blhc index b51d186..168a169 100755 --- a/bin/blhc +++ b/bin/blhc @@ -24,7 +24,7 @@ use warnings; use Getopt::Long (); use Text::ParseWords (); -our $VERSION = '0.07'; +our $VERSION = '0.08'; # CONSTANTS/VARIABLES @@ -349,7 +349,7 @@ sub array_equal { } sub error_flags { - my ($message, $missing_flags_ref, $flag_renames_ref, $line) = @_; + my ($message, $missing_flags_ref, $flag_renames_ref, $line, $number) = @_; # Get string value of qr//-escaped regexps and if requested rename them. my @missing_flags = map { @@ -357,6 +357,7 @@ sub error_flags { } @{$missing_flags_ref}; my $flags = join ' ', @missing_flags; + printf '%d:', $number if defined $number; printf '%s (%s)%s %s', error_color($message, 'red'), $flags, error_color(':', 'yellow'), $line; @@ -364,8 +365,9 @@ sub error_flags { return; } sub error_non_verbose_build { - my ($line) = @_; + my ($line, $number) = @_; + printf '%d:', $number if defined $number; printf '%s%s %s', error_color('NONVERBOSE BUILD', 'red'), error_color(':', 'yellow'), @@ -604,6 +606,7 @@ my $option_arch = undef; my $option_buildd = 0; my $option_debian = 0; $option_color = 0; +my $option_line_numbers = 0; if (not Getopt::Long::GetOptions( 'help|h|?' => \$option_help, 'version' => \$option_version, @@ -622,6 +625,7 @@ if (not Getopt::Long::GetOptions( 'arch=s' => \$option_arch, 'buildd' => \$option_buildd, 'debian' => \$option_debian, + 'line-numbers' => \$option_line_numbers, )) { require Pod::Usage; Pod::Usage::pod2usage(2); @@ -759,7 +763,10 @@ foreach my $file (@ARGV) { $disable_harden_pie = 1; } + my $number = 0; while (my $line = <$fh>) { + $number++; + # 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, @@ -865,7 +872,7 @@ foreach my $file (@ARGV) { # This flags is not always available, but if it is use it. if ($line =~ /^DEB_BUILD_OPTIONS=.*\bparallel=(\d+)/) { - $parallel = $1; + $parallel = $1 * 2; } # We skip over unimportant lines at the beginning of the log to @@ -879,11 +886,15 @@ foreach my $file (@ARGV) { # is_non_verbose_build() (which is quite slow) in the second loop when # it's already clear if a line is non-verbose or not. my @input_nonverbose = (); + # Input line number. + my @input_number = (); my $continuation = 0; my $complete_line = undef; my $non_verbose; while (my $line = <$fh>) { + $number++; + # And stop at the end of the build log. Package details (reported by # the buildd logs) are not important for us. This also prevents false # positives. @@ -1025,6 +1036,7 @@ foreach my $file (@ARGV) { push @input, $line; push @input_nonverbose, $non_verbose; + push @input_number, $number if $option_line_numbers; } } @@ -1056,11 +1068,11 @@ foreach my $file (@ARGV) { # Option or auto detected. if ($arch) { - # The following was partially copied from dpkg-dev 1.18.24 - # (/usr/share/perl5/Dpkg/Vendor/Debian.pm, _add_hardening_flags()), - # copyright Raphaël Hertzog , Kees Cook - # , Canonical, Ltd. licensed under GPL version 2 or - # later. Keep it in sync. + # The following was partially copied from dpkg-dev 1.19.0.5 + # (/usr/share/perl5/Dpkg/Vendor/Debian.pm, _add_build_flags()), + # copyright Raphaël Hertzog , Guillem Jover + # , Kees Cook , Canonical, Ltd. + # licensed under GPL version 2 or later. Keep it in sync. require Dpkg::Arch; my ($os, $cpu); @@ -1073,8 +1085,8 @@ foreach my $file (@ARGV) { } my %builtin_pie_arch = map { $_ => 1 } qw( - amd64 arm64 armel armhf i386 kfreebsd-amd64 kfreebsd-i386 - mips mipsel mips64el ppc64el s390x sparc sparc64 + amd64 arm64 armel armhf hurd-i386 i386 kfreebsd-amd64 kfreebsd-i386 + mips mipsel mips64el powerpc ppc64 ppc64el s390x sparc sparc64 ); # Disable unsupported hardening options. @@ -1181,7 +1193,7 @@ LINE: and is_non_verbose_build($line, \$skip, \@input, $i, $parallel)) { if (not $option_buildd) { - error_non_verbose_build($line); + error_non_verbose_build($line, $input_number[$i]); $exit |= $exit_code{non_verbose_build}; } else { $statistics{commands_nonverbose}++; @@ -1325,7 +1337,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{compile_missing}++; @@ -1338,7 +1351,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CXXFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CXXFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CXXFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{compile_cpp_missing}++; @@ -1352,7 +1366,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get CPPFLAGS`') == -1) { if (not $option_buildd) { - error_flags('CPPFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('CPPFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{preprocess_missing}++; @@ -1364,7 +1379,8 @@ LINE: # Assume dpkg-buildflags returns the correct flags. and index($line, '`dpkg-buildflags --get LDFLAGS`') == -1) { if (not $option_buildd) { - error_flags('LDFLAGS missing', \@missing, \%flag_renames, $input[$i]); + error_flags('LDFLAGS missing', \@missing, \%flag_renames, + $input[$i], $input_number[$i]); $exit |= $exit_code{flags_missing}; } else { $statistics{link_missing}++; @@ -1503,6 +1519,10 @@ compiler command line argument. Use colored (ANSI) output for warning messages. +=item B<--line-numbers> + +Display line numbers. + =item B<--ignore-arch> I Ignore build logs from architectures matching I. I is a string.