mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
kconfig: change defconfig_list option to environment variable
"defconfig_list" is a weird option that defines a static symbol that declares the list of base config files in case the .config does not exist yet. This is quite different from other normal symbols; we just abused the "string" type and the "default" properties to list out the input files. They must be fixed values since these are searched for and loaded in the parse stage. It is an ugly hack, and should not exist in the first place. Providing this feature as an environment variable is a saner approach. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
parent
406616213b
commit
b75b0a819a
@ -229,11 +229,6 @@ applicable everywhere (see syntax).
|
|||||||
which can modify the behaviour of the menu entry and its config
|
which can modify the behaviour of the menu entry and its config
|
||||||
symbol. These options are currently possible:
|
symbol. These options are currently possible:
|
||||||
|
|
||||||
- "defconfig_list"
|
|
||||||
This declares a list of default entries which can be used when
|
|
||||||
looking for the default configuration (which is used when the main
|
|
||||||
.config doesn't exists yet.)
|
|
||||||
|
|
||||||
- "modules"
|
- "modules"
|
||||||
This declares the symbol to be used as the MODULES symbol, which
|
This declares the symbol to be used as the MODULES symbol, which
|
||||||
enables the third modular state for all config symbols.
|
enables the third modular state for all config symbols.
|
||||||
|
@ -41,6 +41,14 @@ KCONFIG_CONFIG
|
|||||||
This environment variable can be used to specify a default kernel config
|
This environment variable can be used to specify a default kernel config
|
||||||
file name to override the default name of ".config".
|
file name to override the default name of ".config".
|
||||||
|
|
||||||
|
KCONFIG_DEFCONFIG_LIST
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This environment variable specifies a list of config files which can be used
|
||||||
|
as a base configuration in case the .config does not exist yet. Entries in
|
||||||
|
the list are separated with whitespaces to each other, and the first one
|
||||||
|
that exists is used.
|
||||||
|
|
||||||
KCONFIG_OVERWRITECONFIG
|
KCONFIG_OVERWRITECONFIG
|
||||||
-----------------------
|
-----------------------
|
||||||
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
|
||||||
|
@ -1,13 +1,4 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
config DEFCONFIG_LIST
|
|
||||||
string
|
|
||||||
depends on !UML
|
|
||||||
option defconfig_list
|
|
||||||
default "/lib/modules/$(shell,uname -r)/.config"
|
|
||||||
default "/etc/kernel-config"
|
|
||||||
default "/boot/config-$(shell,uname -r)"
|
|
||||||
default "arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)"
|
|
||||||
|
|
||||||
config CC_VERSION_TEXT
|
config CC_VERSION_TEXT
|
||||||
string
|
string
|
||||||
default "$(CC_VERSION_TEXT)"
|
default "$(CC_VERSION_TEXT)"
|
||||||
|
@ -13,6 +13,16 @@ ifeq ($(quiet),silent_)
|
|||||||
silent := -s
|
silent := -s
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
export KCONFIG_DEFCONFIG_LIST :=
|
||||||
|
ifneq ($(SRCARCH),um)
|
||||||
|
kernel-release := $(shell uname -r)
|
||||||
|
KCONFIG_DEFCONFIG_LIST := \
|
||||||
|
/lib/modules/$(kernel-release)/.config \
|
||||||
|
/etc/kernel-config \
|
||||||
|
/boot/config-$(kernel-release) \
|
||||||
|
arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)
|
||||||
|
endif
|
||||||
|
|
||||||
# We need this, in case the user has it in its environment
|
# We need this, in case the user has it in its environment
|
||||||
unexport CONFIG_
|
unexport CONFIG_
|
||||||
|
|
||||||
|
@ -360,28 +360,46 @@ int conf_read_simple(const char *name, int def)
|
|||||||
if (name) {
|
if (name) {
|
||||||
in = zconf_fopen(name);
|
in = zconf_fopen(name);
|
||||||
} else {
|
} else {
|
||||||
struct property *prop;
|
char *env;
|
||||||
|
|
||||||
name = conf_get_configname();
|
name = conf_get_configname();
|
||||||
in = zconf_fopen(name);
|
in = zconf_fopen(name);
|
||||||
if (in)
|
if (in)
|
||||||
goto load;
|
goto load;
|
||||||
sym_add_change_count(1);
|
sym_add_change_count(1);
|
||||||
if (!sym_defconfig_list)
|
|
||||||
|
env = getenv("KCONFIG_DEFCONFIG_LIST");
|
||||||
|
if (!env)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for_all_defaults(sym_defconfig_list, prop) {
|
while (1) {
|
||||||
if (expr_calc_value(prop->visible.expr) == no ||
|
bool is_last;
|
||||||
prop->expr->type != E_SYMBOL)
|
|
||||||
continue;
|
while (isspace(*env))
|
||||||
sym_calc_value(prop->expr->left.sym);
|
env++;
|
||||||
name = sym_get_string_value(prop->expr->left.sym);
|
|
||||||
in = zconf_fopen(name);
|
if (!*env)
|
||||||
|
break;
|
||||||
|
|
||||||
|
p = env;
|
||||||
|
while (*p && !isspace(*p))
|
||||||
|
p++;
|
||||||
|
|
||||||
|
is_last = (*p == '\0');
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
in = zconf_fopen(env);
|
||||||
if (in) {
|
if (in) {
|
||||||
conf_message("using defaults found in %s",
|
conf_message("using defaults found in %s",
|
||||||
name);
|
env);
|
||||||
goto load;
|
goto load;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_last)
|
||||||
|
break;
|
||||||
|
|
||||||
|
env = p + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!in)
|
if (!in)
|
||||||
|
@ -287,7 +287,6 @@ struct file *lookup_file(const char *name);
|
|||||||
|
|
||||||
extern struct symbol symbol_yes, symbol_no, symbol_mod;
|
extern struct symbol symbol_yes, symbol_no, symbol_mod;
|
||||||
extern struct symbol *modules_sym;
|
extern struct symbol *modules_sym;
|
||||||
extern struct symbol *sym_defconfig_list;
|
|
||||||
extern int cdebug;
|
extern int cdebug;
|
||||||
struct expr *expr_alloc_symbol(struct symbol *sym);
|
struct expr *expr_alloc_symbol(struct symbol *sym);
|
||||||
struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
|
struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
|
||||||
|
@ -99,7 +99,6 @@ n [A-Za-z0-9_-]
|
|||||||
"def_bool" return T_DEF_BOOL;
|
"def_bool" return T_DEF_BOOL;
|
||||||
"def_tristate" return T_DEF_TRISTATE;
|
"def_tristate" return T_DEF_TRISTATE;
|
||||||
"default" return T_DEFAULT;
|
"default" return T_DEFAULT;
|
||||||
"defconfig_list" return T_DEFCONFIG_LIST;
|
|
||||||
"depends" return T_DEPENDS;
|
"depends" return T_DEPENDS;
|
||||||
"endchoice" return T_ENDCHOICE;
|
"endchoice" return T_ENDCHOICE;
|
||||||
"endif" return T_ENDIF;
|
"endif" return T_ENDIF;
|
||||||
|
@ -96,7 +96,6 @@ struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr
|
|||||||
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
||||||
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
||||||
void menu_add_option_modules(void);
|
void menu_add_option_modules(void);
|
||||||
void menu_add_option_defconfig_list(void);
|
|
||||||
void menu_add_option_allnoconfig_y(void);
|
void menu_add_option_allnoconfig_y(void);
|
||||||
void menu_finalize(struct menu *parent);
|
void menu_finalize(struct menu *parent);
|
||||||
void menu_set_type(int type);
|
void menu_set_type(int type);
|
||||||
|
@ -219,15 +219,6 @@ void menu_add_option_modules(void)
|
|||||||
modules_sym = current_entry->sym;
|
modules_sym = current_entry->sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_add_option_defconfig_list(void)
|
|
||||||
{
|
|
||||||
if (!sym_defconfig_list)
|
|
||||||
sym_defconfig_list = current_entry->sym;
|
|
||||||
else if (sym_defconfig_list != current_entry->sym)
|
|
||||||
zconf_error("trying to redefine defconfig symbol");
|
|
||||||
sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void menu_add_option_allnoconfig_y(void)
|
void menu_add_option_allnoconfig_y(void)
|
||||||
{
|
{
|
||||||
current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
|
current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
|
||||||
|
@ -53,7 +53,6 @@ static struct menu *current_menu, *current_entry;
|
|||||||
%token T_COMMENT
|
%token T_COMMENT
|
||||||
%token T_CONFIG
|
%token T_CONFIG
|
||||||
%token T_DEFAULT
|
%token T_DEFAULT
|
||||||
%token T_DEFCONFIG_LIST
|
|
||||||
%token T_DEF_BOOL
|
%token T_DEF_BOOL
|
||||||
%token T_DEF_TRISTATE
|
%token T_DEF_TRISTATE
|
||||||
%token T_DEPENDS
|
%token T_DEPENDS
|
||||||
@ -223,11 +222,6 @@ config_option: T_OPTION T_MODULES T_EOL
|
|||||||
menu_add_option_modules();
|
menu_add_option_modules();
|
||||||
};
|
};
|
||||||
|
|
||||||
config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
|
|
||||||
{
|
|
||||||
menu_add_option_defconfig_list();
|
|
||||||
};
|
|
||||||
|
|
||||||
config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
|
config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
|
||||||
{
|
{
|
||||||
menu_add_option_allnoconfig_y();
|
menu_add_option_allnoconfig_y();
|
||||||
|
@ -35,7 +35,6 @@ static struct symbol symbol_empty = {
|
|||||||
.flags = SYMBOL_VALID,
|
.flags = SYMBOL_VALID,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct symbol *sym_defconfig_list;
|
|
||||||
struct symbol *modules_sym;
|
struct symbol *modules_sym;
|
||||||
static tristate modules_val;
|
static tristate modules_val;
|
||||||
|
|
||||||
|
@ -53,6 +53,10 @@ class Conf:
|
|||||||
# Override 'srctree' environment to make the test as the top directory
|
# Override 'srctree' environment to make the test as the top directory
|
||||||
extra_env['srctree'] = self._test_dir
|
extra_env['srctree'] = self._test_dir
|
||||||
|
|
||||||
|
# Clear KCONFIG_DEFCONFIG_LIST to keep unit tests from being affected
|
||||||
|
# by the user's environment.
|
||||||
|
extra_env['KCONFIG_DEFCONFIG_LIST'] = ''
|
||||||
|
|
||||||
# Run Kconfig in a temporary directory.
|
# Run Kconfig in a temporary directory.
|
||||||
# This directory is automatically removed when done.
|
# This directory is automatically removed when done.
|
||||||
with tempfile.TemporaryDirectory() as temp_dir:
|
with tempfile.TemporaryDirectory() as temp_dir:
|
||||||
|
Loading…
Reference in New Issue
Block a user