From be47ebb0eb17e47c9f1f84156e17aa6970d47435 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 17 May 2018 17:18:24 +0200 Subject: 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 --- pkg/kernel/kernel.go | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'pkg/kernel') 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: ")}, +} -- cgit mrf-deployment