diff options
author | Karel Kočí <cynerd@email.cz> | 2015-09-17 13:03:02 +0200 |
---|---|---|
committer | Karel Kočí <cynerd@email.cz> | 2015-09-17 13:03:02 +0200 |
commit | 08d906b110f6a1a9985c4e03a13a2a97b0aaf818 (patch) | |
tree | a2ce6d3a4d0b39ed01064c6d21da911d417f5cf1 /scripts/parse_kconfig/parse.c | |
parent | 610845c6f99412010baa7a84ff8880bc7046c49a (diff) | |
download | linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.tar.gz linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.tar.bz2 linux-conf-perf-08d906b110f6a1a9985c4e03a13a2a97b0aaf818.zip |
Fix parse_kconfig symbol default
Generated rules for symbols default values was used without information
about their order. Kconfig documentation specifies that only first
valid default value specification should be used.
Diffstat (limited to 'scripts/parse_kconfig/parse.c')
-rw-r--r-- | scripts/parse_kconfig/parse.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/scripts/parse_kconfig/parse.c b/scripts/parse_kconfig/parse.c index 9de456f..6dc08ce 100644 --- a/scripts/parse_kconfig/parse.c +++ b/scripts/parse_kconfig/parse.c @@ -126,22 +126,46 @@ void cpy_dep() { goto choice_exception; } // Default value + struct boolexpr **defexpr = NULL; + size_t defexpr_size = 0; + int z; + bool exitdef = false; for_all_defaults(sym, prop) { Dprintf(" Default value:\n"); doutput_expr(prop->expr); struct boolexpr *def = boolexpr_kconfig(gsymlist, prop->expr, true, NULL); + struct boolexpr *vis; if (prop->visible.expr != NULL) - def = - boolexpr_and(def, - boolexpr_kconfig(gsymlist, - prop->visible.expr, - false, NULL)); - if (el->def == NULL) { - el->def = def; + vis = boolexpr_kconfig(gsymlist, prop->visible.expr, + false, NULL); + else + vis = boolexpr_true(); + if (vis->type != BT_TRUE) { + defexpr = realloc(defexpr, + ++defexpr_size * sizeof(struct boolexpr *)); + defexpr[defexpr_size - 1] = boolexpr_copy(vis); } else { + ++defexpr_size; + exitdef = true; + } + def = boolexpr_and(def, vis); + for (z = 0; z < ((int)defexpr_size - 1); z++) { + def = boolexpr_and(def, boolexpr_not( + boolexpr_copy(defexpr[z]))); + } + if (el->def == NULL) + el->def = def; + else el->def = boolexpr_or(el->def, def); + if (exitdef) + break; + } + if (defexpr != NULL) { + for (z = 0; z < defexpr_size - 1; z++) { + boolexpr_free(defexpr[z]); } + free(defexpr); } if (el->def == NULL) el->def = boolexpr_false(); |