• Ulf Magnusson's avatar
    kconfig: only write '# CONFIG_FOO is not set' for visible symbols · f467c564
    Ulf Magnusson authored
    === Background ===
    
     - Visible n-valued bool/tristate symbols generate a
       '# CONFIG_FOO is not set' line in the .config file. The idea is to
       remember the user selection without having to set a Makefile
       variable. Having n correspond to the variable being undefined in the
       Makefiles makes for easy CONFIG_* tests.
    
     - Invisible n-valued bool/tristate symbols normally do not generate a
       '# CONFIG_FOO is not set' line, because user values from .config
       files have no effect on invisible symbols anyway.
    
    Currently, there is one exception to this rule: Any bool/tristate symbol
    that gets the value n through a 'default' property generates a
    '# CONFIG_FOO is not set' line, even if the symbol is invisible.
    
    Note that this only applies to explicitly given defaults, and not when
    the symbol implicitly defaults to n (like bool/tristate symbols without
    'default' properties do).
    
    This is inconsistent, and seems redundant:
    
      - As mentioned, the '# CONFIG_FOO is not set' won't affect the symbol
        once the .config is read back in.
    
      - Even if the symbol is invisible at first but becomes visible later,
        there shouldn't be any harm in recalculating the default value
        rather than viewing the '# CONFIG_FOO is not set' as a previous
        user value of n.
    
    === Changes ===
    
    Change sym_calc_value() to only set SYMBOL_WRITE (write to .config) for
    non-n-valued 'default' properties.
    
    Note that SYMBOL_WRITE is always set for visible symbols regardless of whether
    they have 'default' properties or not, so this change only affects invisible
    symbols.
    
    This reduces the size of the x86 .config on my system by about 1% (due
    to removed '# CONFIG_FOO is not set' entries).
    
    One side effect of (and the main motivation for) this change is making
    the following two definitions behave exactly the same:
    
    	config FOO
    		bool
    
    	config FOO
    		bool
    		default n
    
    With this change, neither of these will generate a
    '# CONFIG_FOO is not set' line (assuming FOO isn't selected/implied).
    That might make it clearer to people that a bare 'default n' is
    redundant.
    
    This change only affects generated .config files and not autoconf.h:
    autoconf.h only includes #defines for non-n bool/tristate symbols.
    
    === Testing ===
    
    The following testing was done with the x86 Kconfigs:
    
     - .config files generated before and after the change were compared to
       verify that the only difference is some '# CONFIG_FOO is not set'
       entries disappearing. A couple of these were inspected manually, and
       most turned out to be from redundant 'default n/def_bool n'
       properties.
    
     - The generated include/generated/autoconf.h was compared before and
       after the change and verified to be identical.
    
     - As a sanity check, the same modification was done to Kconfiglib.
       The Kconfiglib test suite was then run to check for any mismatches
       against the output of the C implementation.
    Signed-off-by: default avatarUlf Magnusson <ulfalizer@gmail.com>
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    f467c564
symbol.c 30.5 KB