diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-05-17 17:18:24 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-05-17 17:18:24 +0200 |
| commit | be47ebb0eb17e47c9f1f84156e17aa6970d47435 (patch) | |
| tree | c7351c27390bb6eefef00d526dd1c448648c627d /pkg/kernel | |
| parent | 28cbff8c7d91cd42ee29ebf80c6e9fc4dfbf50e9 (diff) | |
pkg/kernel: allow to split full make output
Currently kernel build failures are insanely verbose
(contain full kernel build output) and there is no
way to separate short descriptions from full output.
Make it possible.
Also try to extract failure root cause froom build log.
Use this in pkg/bisect to not pollute log on build failures.
Update #501
Diffstat (limited to 'pkg/kernel')
| -rw-r--r-- | pkg/kernel/kernel.go | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/pkg/kernel/kernel.go b/pkg/kernel/kernel.go index 21612f10a..454ed8eb3 100644 --- a/pkg/kernel/kernel.go +++ b/pkg/kernel/kernel.go @@ -12,6 +12,7 @@ package kernel import ( + "bytes" "fmt" "io/ioutil" "os" @@ -50,8 +51,10 @@ func Build(dir, compiler string, config []byte) error { } cmd.Dir = dir // Build of a large kernel can take a while on a 1 CPU VM. - _, err := osutil.Run(3*time.Hour, cmd) - return err + if _, err := osutil.Run(3*time.Hour, cmd); err != nil { + return extractRootCause(err) + } + return nil } func Clean(dir string) error { @@ -122,3 +125,39 @@ func CompilerIdentity(compiler string) (string, error) { } return strings.Split(string(output), "\n")[0], nil } + +func extractRootCause(err error) error { + verr, ok := err.(*osutil.VerboseError) + if !ok { + return err + } + var cause []byte + for _, line := range bytes.Split(verr.Output, []byte{'\n'}) { + for _, pattern := range buildFailureCauses { + if pattern.weak && cause != nil { + continue + } + if bytes.Contains(line, pattern.pattern) { + cause = line + break + } + } + } + if cause != nil { + verr.Title = string(cause) + } + return verr +} + +type buildFailureCause struct { + pattern []byte + weak bool +} + +var buildFailureCauses = [...]buildFailureCause{ + {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: ")}, +} |
