aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/kernel/kernel.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/kernel/kernel.go')
-rw-r--r--pkg/kernel/kernel.go43
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: ")},
+}