diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2019-03-29 11:00:34 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-03-29 11:00:34 +0100 |
| commit | 9633c5c8a1a030cdfdc0f94ae460314c7fc15faa (patch) | |
| tree | 01efde3d54f1261007510e6662045f07f1621cd2 /pkg | |
| parent | 6b138f0f3ced97b0260f6253874d7c84c6408662 (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.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/build/build.go | 8 | ||||
| -rw-r--r-- | pkg/build/build_test.go | 18 | ||||
| -rw-r--r-- | pkg/build/linux.go | 2 | ||||
| -rw-r--r-- | pkg/build/netbsd.go | 4 | ||||
| -rw-r--r-- | pkg/build/openbsd.go | 2 |
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 }{ |
