diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2021-04-15 20:17:09 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2021-04-16 13:57:41 +0200 |
| commit | 45d1c1e0a0baa138cfcbe9caf8cf6bf2ddc7bbf6 (patch) | |
| tree | dcee5eb7cbe94edc947c7ffa737e8e74eba2d438 /tools/syz-kconf | |
| parent | a02cf8b55bd7864e7d40abada7caaf4ac5b784f9 (diff) | |
tools/syz-kconf: improve support for third-party config files
Allow and "_" instance that can list intentionally unused features.
This allows to reuse upstream config bits (e.g. debug.yml)
and avoid "unknown feature" warnings.
Diffstat (limited to 'tools/syz-kconf')
| -rw-r--r-- | tools/syz-kconf/kconf.go | 10 | ||||
| -rw-r--r-- | tools/syz-kconf/parser.go | 20 |
2 files changed, 21 insertions, 9 deletions
diff --git a/tools/syz-kconf/kconf.go b/tools/syz-kconf/kconf.go index 06d043790..92a86e0b4 100644 --- a/tools/syz-kconf/kconf.go +++ b/tools/syz-kconf/kconf.go @@ -51,11 +51,11 @@ func main() { if err != nil { tool.Failf("failed to create repo: %v", err) } - instances, err := parseMainSpec(*flagConfig) + instances, unusedFeatures, err := parseMainSpec(*flagConfig) if err != nil { tool.Fail(err) } - if err := checkConfigs(instances); err != nil { + if err := checkConfigs(instances, unusedFeatures); err != nil { tool.Fail(err) } // In order to speed up the process we generate instances that use the same kernel revision in parallel. @@ -115,8 +115,11 @@ func main() { } } -func checkConfigs(instances []*Instance) error { +func checkConfigs(instances []*Instance, unusedFeatures []string) error { allFeatures := make(Features) + for _, feat := range unusedFeatures { + allFeatures[feat] = true + } for _, inst := range instances { for feat := range inst.Features { allFeatures[feat] = true @@ -239,6 +242,7 @@ func (ctx *Context) executeShell() error { args := strings.Split(shell.Cmd, " ") for i := 1; i < len(args); i++ { args[i] = strings.ReplaceAll(args[i], "${BUILDDIR}", ctx.BuildDir) + args[i] = strings.ReplaceAll(args[i], "${ARCH}", ctx.Target.KernelArch) } if args[0] == "make" { if err := ctx.Make(args[1:]...); err != nil { diff --git a/tools/syz-kconf/parser.go b/tools/syz-kconf/parser.go index 0f7d330a0..6f46151ed 100644 --- a/tools/syz-kconf/parser.go +++ b/tools/syz-kconf/parser.go @@ -83,33 +83,41 @@ type rawFile struct { Config []yaml.Node } -func parseMainSpec(file string) ([]*Instance, error) { +func parseMainSpec(file string) ([]*Instance, []string, error) { data, err := ioutil.ReadFile(file) if err != nil { - return nil, fmt.Errorf("failed to read config file: %v", err) + return nil, nil, fmt.Errorf("failed to read config file: %v", err) } dec := yaml.NewDecoder(bytes.NewReader(data)) dec.KnownFields(true) raw := new(rawMain) if err := dec.Decode(raw); err != nil { - return nil, fmt.Errorf("failed to parse %v: %v", file, err) + return nil, nil, fmt.Errorf("failed to parse %v: %v", file, err) } + var unusedFeatures []string var instances []*Instance for _, inst := range raw.Instances { for name, features := range inst { + if name == "_" { + unusedFeatures = features + continue + } inst, err := parseInstance(name, filepath.Dir(file), features, raw.Includes) if err != nil { - return nil, err + return nil, nil, err } instances = append(instances, inst) + if constraintsInclude(features, featBaseline) { + continue + } inst, err = parseInstance(name+"-base", filepath.Dir(file), append(features, featBaseline), raw.Includes) if err != nil { - return nil, err + return nil, nil, err } instances = append(instances, inst) } } - return instances, nil + return instances, unusedFeatures, nil } func parseInstance(name, configDir string, features []string, includes []map[string][]string) (*Instance, error) { |
