diff options
| author | Greg Steuck <blackgnezdo@gmail.com> | 2019-02-11 02:09:05 -0800 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-02-11 11:09:05 +0100 |
| commit | 5e5bb28ebfd9b28ed8fcdc9def45ee0b1d8a5d4a (patch) | |
| tree | 4c94f8155f108687bdbb8fa3e14fca13252590b6 | |
| parent | b4f792e401f416ff9fc75716d2500971ba63d1db (diff) | |
pkg/build: share extractRootCause with openbsd
* pkg/build: share extractRootCause with openbsd
This should get kernel build errors reported in syz-ci console.
* Add a test
* lint
| -rw-r--r-- | pkg/build/build.go | 42 | ||||
| -rw-r--r-- | pkg/build/build_test.go | 24 | ||||
| -rw-r--r-- | pkg/build/linux.go | 37 | ||||
| -rw-r--r-- | pkg/build/openbsd.go | 2 |
4 files changed, 67 insertions, 38 deletions
diff --git a/pkg/build/build.go b/pkg/build/build.go index b7fdb1664..64f32f29e 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -5,6 +5,7 @@ package build import ( + "bytes" "fmt" "path/filepath" "strings" @@ -113,3 +114,44 @@ func CompilerIdentity(compiler string) (string, error) { } return "", fmt.Errorf("no output from compiler --version") } + +func extractRootCause(err error) error { + verr, ok := err.(*osutil.VerboseError) + if !ok { + return err + } + cause := extractCauseInner(verr.Output) + if cause != nil { + verr.Title = string(cause) + } + return KernelBuildError{verr} +} + +func extractCauseInner(s []byte) []byte { + var cause []byte + for _, line := range bytes.Split(s, []byte{'\n'}) { + for _, pattern := range buildFailureCauses { + if pattern.weak && cause != nil { + continue + } + if bytes.Contains(line, pattern.pattern) { + cause = line + break + } + } + } + return cause +} + +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: ")}, +} diff --git a/pkg/build/build_test.go b/pkg/build/build_test.go index 1698d3bd8..830c4f39c 100644 --- a/pkg/build/build_test.go +++ b/pkg/build/build_test.go @@ -4,6 +4,7 @@ package build import ( + "bytes" "os/exec" "strings" "testing" @@ -34,3 +35,26 @@ func TestCompilerIdentity(t *testing.T) { }) } } + +func TestExtractRootCause(t *testing.T) { + for _, s := range []struct{ e, expect string }{ + {` +cc -g -Werror db_break.c +sys/dev/kcov.c:93:6: error: use of undeclared identifier 'kcov_cold123'; did you mean 'kcov_cold'? + if (kcov_cold123) + ^~~~~~~~~~~~ + kcov_cold +sys/dev/kcov.c:65:5: note: 'kcov_cold' declared here +int kcov_cold = 1; + ^ +1 error generated. +`, + "sys/dev/kcov.c:93:6: error: use of undeclared identifier 'kcov_cold123'; did you mean 'kcov_cold'?", + }, + } { + got := extractCauseInner([]byte(s.e)) + if !bytes.Equal([]byte(s.expect), got) { + t.Errorf("Expected %s, got %s", s.expect, got) + } + } +} diff --git a/pkg/build/linux.go b/pkg/build/linux.go index dbe9cfbb7..f4dff538f 100644 --- a/pkg/build/linux.go +++ b/pkg/build/linux.go @@ -10,7 +10,6 @@ package build import ( - "bytes" "fmt" "io/ioutil" "os" @@ -124,39 +123,3 @@ func (linux) clean(kernelDir string) error { _, err := osutil.Run(10*time.Minute, cmd) return err } - -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 KernelBuildError{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: ")}, -} diff --git a/pkg/build/openbsd.go b/pkg/build/openbsd.go index d7fe62f36..9c4b7f119 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 err + return extractRootCause(err) } } for _, s := range []struct{ dir, src, dst string }{ |
