Skip to content
  • Yann E. MORIN's avatar
    kconfig: fix randomising choice entries in presence of KCONFIG_ALLCONFIG · 8357b485
    Yann E. MORIN authored
    
    
    Currently, randconfig does randomise choice entries, unless KCONFIG_ALLCONFIG
    is specified.
    
    For example, given those two files (Thomas' test-case):
    
        ---8<--- Config.test.in
        config OPTIONA
            bool "Option A"
    
        choice
            prompt "This is a choice"
    
        config CHOICE_OPTIONA
            bool "Choice Option A"
    
        config CHOICE_OPTIONB
            bool "Choice Option B"
    
        endchoice
    
        config OPTIONB
            bool "Option B"
        ---8<--- Config.test.in
    
        ---8<--- config.defaults
        CONFIG_OPTIONA=y
        ---8<--- config.defaults
    
    And running:
        ./scripts/kconfig/conf --randconfig Config.test.in
    
    does properly randomise the two choice symbols (and the two booleans).
    
    However, running:
        KCONFIG_ALLCONFIG=config.defaults \
        ./scripts/kconfig/conf --randconfig Config.test.in
    
    does *not* reandomise the two choice entries, and only CHOICE_OPTIONA
    will ever be selected. (OPTIONA will always be set (expected), and
    OPTIONB will be be properly randomised (expected).)
    
    This patch defers setting that a choice has a value until a symbol for
    that choice is indeed set, so that choices are properly randomised when
    KCONFIG_ALLCONFIG is set, but not if a symbol for that choice is set.
    
    Reported-by: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Signed-off-by: default avatar"Yann E. MORIN" <yann.morin.1998@free.fr>
    Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Cc: Michal Marek <mmarek@suse.cz>
    Cc: Sam Ravnborg <sam@ravnborg.org>
    Cc: Sedat Dilek <sedat.dilek@gmail.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Stephen Rothwell <sfr@canb.auug.org.au>
    
    ---
    Changes v3 -> v4
      - fix previous issue where some choices would not be set, which would
        cause silentoldconfig to ask for them and was then breaking this
        workflow (as reported by Arnd and Sedat):
            KCONFIG_ALLCONFIG=foo.defconfig make randconfig
            make silentoldconfig </dev/nullo
        which I have tested (3h28min!) with:
            touch defconfig
            for(( i=0; i<10000; i++ )); do
                KCONFIG_ALLCONFIG=$(pwd)/defconfig make randconfig >/dev/null 2>&1
                make silentoldconfig </dev/null >/dev/null 2>&1 || break
            done
        which did not break at all.
      - change done in v3 (below) is already fixed by a previous patch
    
    Changes v2 -> v3
      - ensure only one symbol is set in a choice
    
    Changes v1 -> v2:
      - further postpone setting that a choice has a value until
        one is indeed set
      - do not print symbols that are part of an invisible choice
    8357b485