/x;
# Regex to catch (GCC) compiler warnings.
my $warning_regex = qr/^(.+?):(\d+):\d+: warning: (.+?) \[(.+?)\]$/;
+# Regex to catch libtool commands and not lines which show commands executed
+# by libtool (e.g. libtool: link: ...).
+my $libtool_regex = qr/\blibtool\s.*--mode=/;
# List of source file extensions which require preprocessing.
my @source_preprocess_compile_cpp = (
sub is_non_verbose_build {
my ($line, $next_line, $skip_ref) = @_;
+ if ($line =~ /$libtool_regex/o) {
+ # libtool's --silent hides the real compiler flags.
+ if ($line =~ /\s--silent/) {
+ return 1;
+ # If --silent is not present, skip this line as some compiler flags
+ # might be missing (e.g. -fPIE) which are handled correctly by libtool
+ # internally. libtool displays the real compiler command on the next
+ # line, so the flags are checked as usual.
+ } else {
+ ${$skip_ref} = 1;
+ return 0;
+ }
+ }
+
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*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/
# C++ compiler setting.
return 0 if $line =~ /^\s*C\+\+.+?:\s+(?:yes|no)\s*$/;
return 0 if $line =~ /^\s*C\+\+ Library: stdc\+\+$/;
+ # "Compiling" non binary files.
+ return 0 if $line =~ /^\s*Compiling \S+\.(?:py|el)['"]?(?:\.\.\.)?$/;
# "Compiling" with no file name.
if ($line =~ /^\s*[Cc]ompiling\s+(.+?)(?:\.\.\.)?$/) {
# $file_extension_regex may need spaces around the filename.
my $continuation = 0;
my $complete_line = undef;
+ my $non_verbose;
while (my $line = <$fh>) {
# 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
last if index($line, 'Build finished at ') == 0
and $line =~ /^Build finished at \d{8}-\d{4}$/;
+ if (not $continuation) {
+ $non_verbose = 0;
+ }
+
# Detect architecture automatically unless overridden.
if (not $arch
and index($line, 'dpkg-buildpackage: host architecture ') == 0) {
}
# Check if this line indicates a non verbose build.
- my $non_verbose = is_non_verbose_build($line);
+ my $skip = 0;
+ $non_verbose |= is_non_verbose_build($line, undef, \$skip);
+ next if $skip;
# One line may contain multiple commands (";"). Treat each one as
# single line. parse_line() is slow, only use it when necessary.