aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-03-29 11:00:34 +0100
committerDmitry Vyukov <dvyukov@google.com>2019-03-29 11:00:34 +0100
commit9633c5c8a1a030cdfdc0f94ae460314c7fc15faa (patch)
tree01efde3d54f1261007510e6662045f07f1621cd2
parent6b138f0f3ced97b0260f6253874d7c84c6408662 (diff)
pkg/build: extract bazel build errors
We currently manually call extractRootCause in few selected places to denote kernel build errors that we want to report to developers. The rest are considered infra errors that we don't report. This does not work well. We are missing fuchsia and gvisor build errors. Treat all external command exection failures as kernel build errors instead. Let's see how this works in practice. Also add bazel-specfic error patterns and tests.
-rw-r--r--pkg/build/build.go8
-rw-r--r--pkg/build/build_test.go18
-rw-r--r--pkg/build/linux.go2
-rw-r--r--pkg/build/netbsd.go4
-rw-r--r--pkg/build/openbsd.go2
5 files changed, 29 insertions, 5 deletions
diff --git a/pkg/build/build.go b/pkg/build/build.go
index 31910e04b..8d1b7a0f0 100644
--- a/pkg/build/build.go
+++ b/pkg/build/build.go
@@ -41,7 +41,8 @@ func Image(targetOS, targetArch, vmType, kernelDir, outputDir, compiler, userspa
return fmt.Errorf("failed to write config file: %v", err)
}
}
- return builder.build(targetArch, vmType, kernelDir, outputDir, compiler, userspaceDir, cmdlineFile, sysctlFile, config)
+ err = builder.build(targetArch, vmType, kernelDir, outputDir, compiler, userspaceDir, cmdlineFile, sysctlFile, config)
+ return extractRootCause(err)
}
func Clean(targetOS, targetArch, vmType, kernelDir string) error {
@@ -125,6 +126,9 @@ func CompilerIdentity(compiler string) (string, error) {
}
func extractRootCause(err error) error {
+ if err == nil {
+ return nil
+ }
verr, ok := err.(*osutil.VerboseError)
if !ok {
return err
@@ -159,8 +163,10 @@ type buildFailureCause struct {
var buildFailureCauses = [...]buildFailureCause{
{pattern: []byte(": error: ")},
+ {pattern: []byte("ERROR: ")},
{pattern: []byte(": fatal error: ")},
{pattern: []byte(": undefined reference to")},
{weak: true, pattern: []byte(": final link failed: ")},
{weak: true, pattern: []byte("collect2: error: ")},
+ {weak: true, pattern: []byte("FAILED: Build did NOT complete")},
}
diff --git a/pkg/build/build_test.go b/pkg/build/build_test.go
index 3900dfaf7..7f0a9e607 100644
--- a/pkg/build/build_test.go
+++ b/pkg/build/build_test.go
@@ -66,6 +66,24 @@ make: *** Waiting for unfinished jobs....
`,
"/gcc-5.5.0/bin/../lib/gcc/x86_64-unknown-linux-gnu/5.5.0/plugin/include/builtins.h:23:17: fatal error: mpc.h: No such file or directory",
},
+ {`
+Starting local Bazel server and connecting to it...
+Loading:
+Loading: 0 packages loaded
+Analyzing: target //runsc:runsc (1 packages loaded)
+Analyzing: target //runsc:runsc (5 packages loaded)
+Analyzing: target //runsc:runsc (15 packages loaded)
+Analyzing: target //runsc:runsc (92 packages loaded)
+Analyzing: target //runsc:runsc (99 packages loaded)
+Analyzing: target //runsc:runsc (115 packages loaded)
+ERROR: /syzkaller/managers/ptrace-direct-overlay-host/kernel/vdso/BUILD:13:1: no such target '@bazel_tools//tools/cpp:cc_flags': target 'cc_flags' not declared in package 'tools/cpp' defined by /syzkaller/home/.cache/bazel/_bazel_root/e1c9d86bae2b34f90e83d224bc900958/external/bazel_tools/tools/cpp/BUILD and referenced by '//vdso:vdso'
+ERROR: Analysis of target '//runsc:runsc' failed; build aborted: Analysis failed
+INFO: Elapsed time: 14.914s
+INFO: 0 processes.
+FAILED: Build did NOT complete successfully (189 packages loaded)
+`,
+ "ERROR: Analysis of target '//runsc:runsc' failed; build aborted: Analysis failed",
+ },
} {
got := extractCauseInner([]byte(s.e))
if !bytes.Equal([]byte(s.expect), got) {
diff --git a/pkg/build/linux.go b/pkg/build/linux.go
index 8b57cbec4..bdfa0edd2 100644
--- a/pkg/build/linux.go
+++ b/pkg/build/linux.go
@@ -66,7 +66,7 @@ func (linux) buildKernel(kernelDir, outputDir, compiler string, config []byte) e
}
cmd.Dir = kernelDir
if _, err := osutil.Run(time.Hour, cmd); err != nil {
- return extractRootCause(err)
+ return err
}
vmlinux := filepath.Join(kernelDir, "vmlinux")
outputVmlinux := filepath.Join(outputDir, "obj", "vmlinux")
diff --git a/pkg/build/netbsd.go b/pkg/build/netbsd.go
index 91280577e..315a996f6 100644
--- a/pkg/build/netbsd.go
+++ b/pkg/build/netbsd.go
@@ -41,13 +41,13 @@ no options SVS
// Build tools before building kernel
if _, err := osutil.RunCmd(10*time.Minute, kernelDir, "./build.sh", "-m", targetArch,
"-U", "-u", "-j"+strconv.Itoa(runtime.NumCPU()), "tools"); err != nil {
- return extractRootCause(err)
+ return err
}
// Build kernel
if _, err := osutil.RunCmd(10*time.Minute, kernelDir, "./build.sh", "-m", targetArch,
"-U", "-u", "-j"+strconv.Itoa(runtime.NumCPU()), "kernel="+kernelName); err != nil {
- return extractRootCause(err)
+ return err
}
for _, s := range []struct{ dir, src, dst string }{
{compileDir, "netbsd.gdb", "obj/netbsd.gdb"},
diff --git a/pkg/build/openbsd.go b/pkg/build/openbsd.go
index 24bd7a7d4..49c78c6d0 100644
--- a/pkg/build/openbsd.go
+++ b/pkg/build/openbsd.go
@@ -35,7 +35,7 @@ func (ctx openbsd) build(targetArch, vmType, kernelDir, outputDir, compiler, use
}
for _, tgt := range []string{"clean", "obj", "config", "all"} {
if err := ctx.make(compileDir, tgt); err != nil {
- return extractRootCause(err)
+ return err
}
}
for _, s := range []struct{ dir, src, dst string }{