diff options
Diffstat (limited to 'pkg/kernel/kernel.go')
| -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: ")}, +} |
