|
@@ -126,6 +126,7 @@ my $start_minconfig_defined;
|
|
|
my $output_minconfig;
|
|
|
my $minconfig_type;
|
|
|
my $use_output_minconfig;
|
|
|
+my $warnings_file;
|
|
|
my $ignore_config;
|
|
|
my $ignore_errors;
|
|
|
my $addconfig;
|
|
@@ -193,6 +194,9 @@ my $patchcheck_end;
|
|
|
# which would require more options.
|
|
|
my $buildonly = 1;
|
|
|
|
|
|
+# tell build not to worry about warnings, even when WARNINGS_FILE is set
|
|
|
+my $warnings_ok = 0;
|
|
|
+
|
|
|
# set when creating a new config
|
|
|
my $newconfig = 0;
|
|
|
|
|
@@ -235,6 +239,7 @@ my %option_map = (
|
|
|
"START_MIN_CONFIG" => \$start_minconfig,
|
|
|
"MIN_CONFIG_TYPE" => \$minconfig_type,
|
|
|
"USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig,
|
|
|
+ "WARNINGS_FILE" => \$warnings_file,
|
|
|
"IGNORE_CONFIG" => \$ignore_config,
|
|
|
"TEST" => \$run_test,
|
|
|
"ADD_CONFIG" => \$addconfig,
|
|
@@ -1924,7 +1929,60 @@ sub start_monitor_and_boot {
|
|
|
return monitor;
|
|
|
}
|
|
|
|
|
|
+my $check_build_re = ".*:.*(warning|error|Error):.*";
|
|
|
+my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})";
|
|
|
+
|
|
|
+# Read buildlog and check against warnings file for any
|
|
|
+# new warnings.
|
|
|
+#
|
|
|
+# Returns 1 if OK
|
|
|
+# 0 otherwise
|
|
|
sub check_buildlog {
|
|
|
+ return 1 if (!defined $warnings_file);
|
|
|
+
|
|
|
+ my %warnings_list;
|
|
|
+
|
|
|
+ # Failed builds should not reboot the target
|
|
|
+ my $save_no_reboot = $no_reboot;
|
|
|
+ $no_reboot = 1;
|
|
|
+
|
|
|
+ if (-f $warnings_file) {
|
|
|
+ open(IN, $warnings_file) or
|
|
|
+ dodie "Error opening $warnings_file";
|
|
|
+
|
|
|
+ while (<IN>) {
|
|
|
+ if (/$check_build_re/) {
|
|
|
+ chomp;
|
|
|
+ $warnings_list{$_} = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ close(IN);
|
|
|
+ }
|
|
|
+
|
|
|
+ # If warnings file didn't exist, and WARNINGS_FILE exist,
|
|
|
+ # then we fail on any warning!
|
|
|
+
|
|
|
+ open(IN, $buildlog) or dodie "Can't open $buildlog";
|
|
|
+ while (<IN>) {
|
|
|
+ if (/$check_build_re/) {
|
|
|
+
|
|
|
+ # Some compilers use UTF-8 extended for quotes
|
|
|
+ # for distcc heterogeneous systems, this causes issues
|
|
|
+ s/$utf8_quote/'/g;
|
|
|
+
|
|
|
+ chomp;
|
|
|
+ if (!defined $warnings_list{$_}) {
|
|
|
+ fail "New warning found (not in $warnings_file)\n$_\n";
|
|
|
+ $no_reboot = $save_no_reboot;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $no_reboot = $save_no_reboot;
|
|
|
+ close(IN);
|
|
|
+}
|
|
|
+
|
|
|
+sub check_patch_buildlog {
|
|
|
my ($patch) = @_;
|
|
|
|
|
|
my @files = `git show $patch | diffstat -l`;
|
|
@@ -3080,11 +3138,13 @@ sub patchcheck {
|
|
|
build "oldconfig" or return 0;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- if (!defined($ignored_warnings{$sha1})) {
|
|
|
- check_buildlog $sha1 or return 0;
|
|
|
+ # No need to do per patch checking if warnings file exists
|
|
|
+ if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) {
|
|
|
+ check_patch_buildlog $sha1 or return 0;
|
|
|
}
|
|
|
|
|
|
+ check_buildlog or return 0;
|
|
|
+
|
|
|
next if ($type eq "build");
|
|
|
|
|
|
my $failed = 0;
|
|
@@ -3642,6 +3702,39 @@ sub make_min_config {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+sub make_warnings_file {
|
|
|
+ my ($i) = @_;
|
|
|
+
|
|
|
+ if (!defined($warnings_file)) {
|
|
|
+ dodie "Must define WARNINGS_FILE for make_warnings_file test";
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($build_type eq "nobuild") {
|
|
|
+ dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test";
|
|
|
+ }
|
|
|
+
|
|
|
+ build $build_type or dodie "Failed to build";
|
|
|
+
|
|
|
+ open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file";
|
|
|
+
|
|
|
+ open(IN, $buildlog) or dodie "Can't open $buildlog";
|
|
|
+ while (<IN>) {
|
|
|
+
|
|
|
+ # Some compilers use UTF-8 extended for quotes
|
|
|
+ # for distcc heterogeneous systems, this causes issues
|
|
|
+ s/$utf8_quote/'/g;
|
|
|
+
|
|
|
+ if (/$check_build_re/) {
|
|
|
+ print OUT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ close(IN);
|
|
|
+
|
|
|
+ close(OUT);
|
|
|
+
|
|
|
+ success $i;
|
|
|
+}
|
|
|
+
|
|
|
$#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
|
|
|
|
|
|
if ($#ARGV == 0) {
|
|
@@ -3843,9 +3936,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
|
|
|
$run_type = $bisect_type;
|
|
|
} elsif ($test_type eq "config_bisect") {
|
|
|
$run_type = $config_bisect_type;
|
|
|
- }
|
|
|
-
|
|
|
- if ($test_type eq "make_min_config") {
|
|
|
+ } elsif ($test_type eq "make_min_config") {
|
|
|
+ $run_type = "";
|
|
|
+ } elsif ($test_type eq "make_warnings_file") {
|
|
|
$run_type = "";
|
|
|
}
|
|
|
|
|
@@ -3902,10 +3995,15 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
|
|
|
} elsif ($test_type eq "make_min_config") {
|
|
|
make_min_config $i;
|
|
|
next;
|
|
|
+ } elsif ($test_type eq "make_warnings_file") {
|
|
|
+ $no_reboot = 1;
|
|
|
+ make_warnings_file $i;
|
|
|
+ next;
|
|
|
}
|
|
|
|
|
|
if ($build_type ne "nobuild") {
|
|
|
build $build_type or next;
|
|
|
+ check_buildlog or next;
|
|
|
}
|
|
|
|
|
|
if ($test_type eq "install") {
|