• Masahiro Yamada's avatar
    kconfig: hide irrelevant sub-menus for oldconfig · 2aad9b89
    Masahiro Yamada authored
    Historically, "make oldconfig" has changed its behavior several times,
    quieter or louder.  (I attached the history below.)  Currently, it is
    not as quiet as it should be.  This commit addresses it.
    
      Test Case
      ---------
    
    ---------------------------(Kconfig)----------------------------
    menu "menu"
    
    config FOO
            bool "foo"
    
    menu "sub menu"
    
    config BAR
            bool "bar"
    
    endmenu
    
    endmenu
    
    menu "sibling menu"
    
    config BAZ
            bool "baz"
    
    endmenu
    ----------------------------------------------------------------
    
    ---------------------------(.config)----------------------------
    CONFIG_BAR=y
    CONFIG_BAZ=y
    ----------------------------------------------------------------
    
    With the Kconfig and .config above, "make silentoldconfig" and
    "make oldconfig" work differently, like follows:
    
      $ make silentoldconfig
      scripts/kconfig/conf  --silentoldconfig Kconfig
      *
      * Restart config...
      *
      *
      * menu
      *
      foo (FOO) [N/y/?] (NEW) y
      #
      # configuration written to .config
      #
    
      $ make oldconfig
      scripts/kconfig/conf  --oldconfig Kconfig
      *
      * Restart config...
      *
      *
      * menu
      *
      foo (FOO) [N/y/?] (NEW) y
      *
      * sub menu
      *
      bar (BAR) [Y/n/?] y
      #
      # configuration written to .config
      #
    
    Both hide "sibling node" since it is irrelevant.  The difference is
    that silentoldconfig hides "sub menu" whereas oldconfig does not.
    The behavior of silentoldconfig is preferred since the "sub menu"
    does not contain any new symbol.
    
    The root cause is in conf().  There are three input modes that can
    call conf(); oldaskconfig, oldconfig, and silentoldconfig.
    
    Everytime conf() encounters a menu entry, it calls check_conf() to
    check if it contains new symbols.  If no new symbol is found, the
    menu is just skipped.
    
    Currently, this happens only when input_mode == silentoldconfig.
    The oldaskconfig enters into the check_conf() loop as silentoldconfig,
    so oldaskconfig works likewise for the second loop or later, but it
    never happens for oldconfig.  So, irrelevant sub-menus are shown for
    oldconfig.
    
    Change the test condition to "input_mode != oldaskconfig".  This is
    false only for the first loop of oldaskconfig; it must ask the user
    all symbols, so no need to call check_conf().
    
      History of oldconfig
      --------------------
    
    [0] Originally, "make oldconfig" was as loud as "make config"  (It
        showed the entire .config file)
    
    [1] Commit cd9140e1 ("kconfig: make oldconfig is now less chatty")
        made oldconfig quieter, but it was still less quieter than
        silentoldconfig.  (oldconfig did not hide sub-menus)
    
    [2] Commit 204c96f6 ("kconfig: fix silentoldconfig") changed
        the input_mode of oldconfig to "ask_silent" from "ask_new".
        So, oldconfig really became as quiet as silentoldconfig.
        (oldconfig hided irrelevant sub-menus)
    
    [3] Commit 4062f1a4 ("kconfig: use long options in conf") made
        oldconfig as loud as [0] due to misconversion.
    
    [4] Commit 14828349 ("kconfig: fix make oldconfig") addressed
        the misconversion of [3], but it made oldconfig quieter only to
        the same level as [1], not [2].
    
    This commit is restoring the behavior of [2].
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Reviewed-by: default avatarUlf Magnusson <ulfalizer@gmail.com>
    2aad9b89
conf.c 15.3 KB