kconfig: do not write choice values when their dependency becomes n

"Linux Kernel Mailing List" <[email protected]>
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/cb67ab2cd2b8abd9650292c986c79901e3073a59
Commit:     cb67ab2cd2b8abd9650292c986c79901e3073a59
Parent:     a2b0fe7435faee6f6fbb27409878013bc4727e98
Refname:    refs/heads/master
Author:     Masahiro Yamada <[email protected]>
AuthorDate: Tue Feb 6 09:34:42 2018 +0900
Committer:  Masahiro Yamada <[email protected]>
CommitDate: Fri Feb 9 04:08:05 2018 +0900

    kconfig: do not write choice values when their dependency becomes n
    
    "# CONFIG_... is not set" for choice values are wrongly written into
    the .config file if they are once visible, then become invisible later.
    
      Test case
      ---------
    
    ---------------------------(Kconfig)----------------------------
    config A
            bool "A"
    
    choice
            prompt "Choice ?"
            depends on A
    
    config CHOICE_B
            bool "Choice B"
    
    config CHOICE_C
            bool "Choice C"
    
    endchoice
    ----------------------------------------------------------------
    
    ---------------------------(.config)----------------------------
    CONFIG_A=y
    ----------------------------------------------------------------
    
    With the Kconfig and .config above,
    
      $ make config
      scripts/kconfig/conf  --oldaskconfig Kconfig
      *
      * Linux Kernel Configuration
      *
      A (A) [Y/n] n
      #
      # configuration written to .config
      #
      $ cat .config
      #
      # Automatically generated file; DO NOT EDIT.
      # Linux Kernel Configuration
      #
      # CONFIG_A is not set
      # CONFIG_CHOICE_B is not set
      # CONFIG_CHOICE_C is not set
    
    Here,
    
      # CONFIG_CHOICE_B is not set
      # CONFIG_CHOICE_C is not set
    
    should not be written into the .config file because their dependency
    "depends on A" is unmet.
    
    Currently, there is no code that clears SYMBOL_WRITE of choice values.
    
    Clear SYMBOL_WRITE for all symbols in sym_calc_value(), then set it
    again after calculating visibility.  To simplify the logic, set the
    flag if they have non-n visibility, regardless of types, and regardless
    of whether they are choice values or not.
    
    Signed-off-by: Masahiro Yamada <[email protected]>
    Reviewed-by: Ulf Magnusson <[email protected]>
---
 scripts/kconfig/symbol.c | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index c9123ed2b791..13f7fdfe328d 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -371,11 +371,13 @@ void sym_calc_value(struct symbol *sym)
 		sym->curr.tri = no;
 		return;
 	}
-	if (!sym_is_choice_value(sym))
-		sym->flags &= ~SYMBOL_WRITE;
+	sym->flags &= ~SYMBOL_WRITE;
 
 	sym_calc_visibility(sym);
 
+	if (sym->visible != no)
+		sym->flags |= SYMBOL_WRITE;
+
 	/* set default if recursively called */
 	sym->curr = newval;
 
@@ -390,7 +392,6 @@ void sym_calc_value(struct symbol *sym)
 				/* if the symbol is visible use the user value
 				 * if available, otherwise try the default value
 				 */
-				sym->flags |= SYMBOL_WRITE;
 				if (sym_has_value(sym)) {
 					newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri,
 							      sym->visible);
@@ -433,12 +434,9 @@ void sym_calc_value(struct symbol *sym)
 	case S_STRING:
 	case S_HEX:
 	case S_INT:
-		if (sym->visible != no) {
-			sym->flags |= SYMBOL_WRITE;
-			if (sym_has_value(sym)) {
-				newval.val = sym->def[S_DEF_USER].val;
-				break;
-			}
+		if (sym->visible != no && sym_has_value(sym)) {
+			newval.val = sym->def[S_DEF_USER].val;
+			break;
 		}
 		prop = sym_get_default_prop(sym);
 		if (prop) {
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.