...regardless of visibility. When a symbol that is not visible by default (e.g. PNFS_FLEXFILE_LAYOUT) has a default value, it is impossible to set the value to something not the default: ~/packages/linux render-symbol-inputs grep FLEXFILE .config CONFIG_PNFS_FLEXFILE_LAYOUT=y ~/packages/linux render-symbol-inputs make oldconfig scripts/kconfig/conf --oldconfig Kconfig ~/packages/linux render-symbol-inputs grep FLEXFILE .config CONFIG_PNFS_FLEXFILE_LAYOUT=m There are two reasons for this: the symbol's user input value is only considered when it is visible (hunks 2 and 3), and the user values are explicitly ignored (hunk 1) if the symbols are not visible. It's not clear to me why hunk 1 exists. I'm sure it solve some problem, but I'm not sure why we would ever want to discard user input values, and causes a problem exactly as the comment describes. Signed-off-by: Tycho Andersen <tycho@xxxxxxxxxx> CC: Roman Zippel <zippel@xxxxxxxxxxxxxx> --- I don't know much about how kconfig works, I just noticed this when trying to do some automatic merging of configs. My main goal is to build a kernel without modules, but after a merge and running `make oldconfig`, some symbols always come back set as modules. --- scripts/kconfig/confdata.c | 7 ------- scripts/kconfig/symbol.c | 32 ++++++++++++++++++-------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 297b079..3537090 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -448,13 +448,6 @@ int conf_read(const char *name) for_all_symbols(i, sym) { if (sym_has_value(sym) && !sym_is_choice_value(sym)) { - /* Reset values of generates values, so they'll appear - * as new, if they should become visible, but that - * doesn't quite work if the Kconfig and the saved - * configuration disagree. - */ - if (sym->visible == no && !conf_unsaved) - sym->flags &= ~SYMBOL_DEF_USER; switch (sym->type) { case S_STRING: case S_INT: diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 20136ff..27fca39 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -386,17 +386,19 @@ void sym_calc_value(struct symbol *sym) prop = sym_get_choice_prop(sym); newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; } else { - if (sym->visible != no) { - /* if the symbol is visible use the user value - * if available, otherwise try the default value - */ + /* If the user defined a value, let's not ignore it, + * even if the symbol is not visible. + */ + if (sym_has_value(sym)) { sym->flags |= SYMBOL_WRITE; - if (sym_has_value(sym)) { - newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri, - sym->visible); - goto calc_newval; - } + newval.tri = sym->def[S_DEF_USER].tri; + goto calc_newval; } + + if (sym->visible != no) + sym->flags |= SYMBOL_WRITE; + + /* otherwise, let's use the default */ if (sym->rev_dep.tri != no) sym->flags |= SYMBOL_WRITE; if (!sym_is_choice(sym)) { @@ -433,13 +435,15 @@ void sym_calc_value(struct symbol *sym) case S_STRING: case S_HEX: case S_INT: - if (sym->visible != no) { + if (sym_has_value(sym)) { sym->flags |= SYMBOL_WRITE; - if (sym_has_value(sym)) { - newval.val = sym->def[S_DEF_USER].val; - break; - } + newval.val = sym->def[S_DEF_USER].val; + goto calc_newval; } + + if (sym->visible != no) + sym->flags |= SYMBOL_WRITE; + prop = sym_get_default_prop(sym); if (prop) { struct symbol *ds = prop_get_symbol(prop); -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html