mirror of
https://github.com/torvalds/linux.git
synced 2025-11-04 18:49:34 +02:00
kconfig: Fix defconfig when one choice menu selects options that another choice menu depends on
The defconfig and Kconfig combination below, which is based on 3.10-rc4
Kconfigs, resulted in several options getting set to "m" instead of "y".
defconfig.choice:
---8<---
CONFIG_MODULES=y
CONFIG_USB_ZERO=y
---8<---
Kconfig.choice:
---8<---
menuconfig MODULES
bool "Enable loadable module support"
config CONFIGFS_FS
tristate "Userspace-driven configuration filesystem"
config OCFS2_FS
tristate "OCFS2 file system support"
depends on CONFIGFS_FS
select CRC32
config USB_LIBCOMPOSITE
tristate
select CONFIGFS_FS
choice
tristate "USB Gadget Drivers"
default USB_ETH
config USB_ZERO
tristate "Gadget Zero (DEVELOPMENT)"
select USB_LIBCOMPOSITE
config USB_ETH
tristate "Ethernet Gadget (with CDC Ethernet support)"
select USB_LIBCOMPOSITE
endchoice
config CRC32
tristate "CRC32/CRC32c functions"
default y
choice
prompt "CRC32 implementation"
depends on CRC32
default CRC32_SLICEBY8
config CRC32_SLICEBY8
bool "Slice by 8 bytes"
endchoice
---8<---
$ scripts/kconfig/conf --defconfig=defconfig.choice Kconfig.choice
would result in:
.config:
---8<---
CONFIG_MODULES=y
CONFIG_CONFIGFS_FS=m
CONFIG_USB_LIBCOMPOSITE=m
CONFIG_USB_ZERO=m
CONFIG_CRC32=y
CONFIG_CRC32_SLICEBY8=y
---8<---
when the expected result would be:
.config:
---8<---
CONFIG_MODULES=y
CONFIG_CONFIGFS_FS=y
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_ZERO=y
CONFIG_CRC32=y
CONFIG_CRC32_SLICEBY8=y
---8<---
Signed-off-by: Arve Hjønnevåg <arve@android.com>
[yann.morin.1998@free.fr: add the resulting .config to commit log,
remove unneeded USB_GADGET from the defconfig]
Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
This commit is contained in:
parent
f722406faa
commit
fbe98bb9ed
4 changed files with 25 additions and 4 deletions
|
|
@ -1083,7 +1083,7 @@ static void randomize_choice_values(struct symbol *csym)
|
||||||
csym->flags &= ~(SYMBOL_VALID);
|
csym->flags &= ~(SYMBOL_VALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_all_choice_values(struct symbol *csym)
|
void set_all_choice_values(struct symbol *csym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
|
@ -1100,7 +1100,7 @@ static void set_all_choice_values(struct symbol *csym)
|
||||||
}
|
}
|
||||||
csym->flags |= SYMBOL_DEF_USER;
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
/* clear VALID to get value calculated */
|
/* clear VALID to get value calculated */
|
||||||
csym->flags &= ~(SYMBOL_VALID);
|
csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
|
|
@ -1202,6 +1202,14 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
* selected in a choice block and we set it to yes,
|
* selected in a choice block and we set it to yes,
|
||||||
* and the rest to no.
|
* and the rest to no.
|
||||||
*/
|
*/
|
||||||
|
if (mode != def_random) {
|
||||||
|
for_all_symbols(i, csym) {
|
||||||
|
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
|
||||||
|
sym_is_choice_value(csym))
|
||||||
|
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for_all_symbols(i, csym) {
|
for_all_symbols(i, csym) {
|
||||||
if (sym_has_value(csym) || !sym_is_choice(csym))
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -1209,7 +1217,5 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
sym_calc_value(csym);
|
sym_calc_value(csym);
|
||||||
if (mode == def_random)
|
if (mode == def_random)
|
||||||
randomize_choice_values(csym);
|
randomize_choice_values(csym);
|
||||||
else
|
|
||||||
set_all_choice_values(csym);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,9 @@ struct symbol {
|
||||||
#define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */
|
#define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */
|
||||||
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
||||||
|
|
||||||
|
/* choice values need to be set before calculating this symbol value */
|
||||||
|
#define SYMBOL_NEED_SET_CHOICE_VALUES 0x100000
|
||||||
|
|
||||||
#define SYMBOL_MAXLENGTH 256
|
#define SYMBOL_MAXLENGTH 256
|
||||||
#define SYMBOL_HASHSIZE 9973
|
#define SYMBOL_HASHSIZE 9973
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@ char *conf_get_default_confname(void);
|
||||||
void sym_set_change_count(int count);
|
void sym_set_change_count(int count);
|
||||||
void sym_add_change_count(int count);
|
void sym_add_change_count(int count);
|
||||||
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||||
|
void set_all_choice_values(struct symbol *csym);
|
||||||
|
|
||||||
struct conf_printer {
|
struct conf_printer {
|
||||||
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
|
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,14 @@ void sym_calc_value(struct symbol *sym)
|
||||||
|
|
||||||
if (sym->flags & SYMBOL_VALID)
|
if (sym->flags & SYMBOL_VALID)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (sym_is_choice_value(sym) &&
|
||||||
|
sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) {
|
||||||
|
sym->flags &= ~SYMBOL_NEED_SET_CHOICE_VALUES;
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
sym_calc_value(prop_get_symbol(prop));
|
||||||
|
}
|
||||||
|
|
||||||
sym->flags |= SYMBOL_VALID;
|
sym->flags |= SYMBOL_VALID;
|
||||||
|
|
||||||
oldval = sym->curr;
|
oldval = sym->curr;
|
||||||
|
|
@ -425,6 +433,9 @@ void sym_calc_value(struct symbol *sym)
|
||||||
|
|
||||||
if (sym->flags & SYMBOL_AUTO)
|
if (sym->flags & SYMBOL_AUTO)
|
||||||
sym->flags &= ~SYMBOL_WRITE;
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES)
|
||||||
|
set_all_choice_values(sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_clear_all_valid(void)
|
void sym_clear_all_valid(void)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue