aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2021-04-15 20:17:09 +0200
committerDmitry Vyukov <dvyukov@google.com>2021-04-16 13:57:41 +0200
commit45d1c1e0a0baa138cfcbe9caf8cf6bf2ddc7bbf6 (patch)
treedcee5eb7cbe94edc947c7ffa737e8e74eba2d438
parenta02cf8b55bd7864e7d40abada7caaf4ac5b784f9 (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.
-rw-r--r--tools/syz-kconf/kconf.go10
-rw-r--r--tools/syz-kconf/parser.go20
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) {