]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
kconfig: change defconfig_list option to environment variable
authorMasahiro Yamada <masahiroy@kernel.org>
Sat, 13 Mar 2021 19:48:32 +0000 (04:48 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Wed, 14 Apr 2021 06:22:48 +0000 (15:22 +0900)
"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>
12 files changed:
Documentation/kbuild/kconfig-language.rst
Documentation/kbuild/kconfig.rst
init/Kconfig
scripts/kconfig/Makefile
scripts/kconfig/confdata.c
scripts/kconfig/expr.h
scripts/kconfig/lexer.l
scripts/kconfig/lkc.h
scripts/kconfig/menu.c
scripts/kconfig/parser.y
scripts/kconfig/symbol.c
scripts/kconfig/tests/conftest.py

index 226ae072da7da6ac0b0bbcfdbd1f58ea8f81f657..3cbccfc427987992a51d391fee75800b6ac4c898 100644 (file)
@@ -229,11 +229,6 @@ applicable everywhere (see syntax).
   which can modify the behaviour of the menu entry and its config
   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"
     This declares the symbol to be used as the MODULES symbol, which
     enables the third modular state for all config symbols.
index dce6801d66c9b5e575ad9c4b4e8a557181bf7e8f..5967c79c3baa76d0a9bd955ffed4840e3f022fa1 100644 (file)
@@ -41,6 +41,14 @@ KCONFIG_CONFIG
 This environment variable can be used to specify a default kernel 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
 -----------------------
 If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
index 5f5c776ef192116166d3bd448f66777f5fe2253b..8578c60096740eb8b1dc8e1a2f5354be8969344e 100644 (file)
@@ -1,13 +1,4 @@
 # 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
        string
        default "$(CC_VERSION_TEXT)"
index 8c19b82c603521753eb859fce5dd08e26723cd8d..31c5735663c8bb3acaa9ea74868e7423c1e5c580 100644 (file)
@@ -13,6 +13,16 @@ ifeq ($(quiet),silent_)
 silent := -s
 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
 unexport CONFIG_
 
index 198f70957fbf790c3c140543082cfc91f7f9a02c..f3998d5ddd02903041f9040b8ac4aa72b1ad91bd 100644 (file)
@@ -360,28 +360,46 @@ int conf_read_simple(const char *name, int def)
        if (name) {
                in = zconf_fopen(name);
        } else {
-               struct property *prop;
+               char *env;
 
                name = conf_get_configname();
                in = zconf_fopen(name);
                if (in)
                        goto load;
                sym_add_change_count(1);
-               if (!sym_defconfig_list)
+
+               env = getenv("KCONFIG_DEFCONFIG_LIST");
+               if (!env)
                        return 1;
 
-               for_all_defaults(sym_defconfig_list, prop) {
-                       if (expr_calc_value(prop->visible.expr) == no ||
-                           prop->expr->type != E_SYMBOL)
-                               continue;
-                       sym_calc_value(prop->expr->left.sym);
-                       name = sym_get_string_value(prop->expr->left.sym);
-                       in = zconf_fopen(name);
+               while (1) {
+                       bool is_last;
+
+                       while (isspace(*env))
+                               env++;
+
+                       if (!*env)
+                               break;
+
+                       p = env;
+                       while (*p && !isspace(*p))
+                               p++;
+
+                       is_last = (*p == '\0');
+
+                       *p = '\0';
+
+                       in = zconf_fopen(env);
                        if (in) {
                                conf_message("using defaults found in %s",
-                                        name);
+                                            env);
                                goto load;
                        }
+
+                       if (is_last)
+                               break;
+
+                       env = p + 1;
                }
        }
        if (!in)
index bbca80a0dc24eabc08f4e3270202cd3e89ba194e..dc17152b1f14a232e2a5d752a6e455f9fdda21a9 100644 (file)
@@ -287,7 +287,6 @@ struct file *lookup_file(const char *name);
 
 extern struct symbol symbol_yes, symbol_no, symbol_mod;
 extern struct symbol *modules_sym;
-extern struct symbol *sym_defconfig_list;
 extern int cdebug;
 struct expr *expr_alloc_symbol(struct symbol *sym);
 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
index 9c22cb5546734a80f27d8ee22fc7dba585c00ec4..e918950f94a656e795d7b6e834fe51fb0ad32d35 100644 (file)
@@ -99,7 +99,6 @@ n     [A-Za-z0-9_-]
 "def_bool"             return T_DEF_BOOL;
 "def_tristate"         return T_DEF_TRISTATE;
 "default"              return T_DEFAULT;
-"defconfig_list"       return T_DEFCONFIG_LIST;
 "depends"              return T_DEPENDS;
 "endchoice"            return T_ENDCHOICE;
 "endif"                        return T_ENDIF;
index 1c15e3c98bdff5e90a0e92663f08eeda4ea7375a..7378e966add5471ba2d598a6d2e326e194788fef 100644 (file)
@@ -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_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
 void menu_add_option_modules(void);
-void menu_add_option_defconfig_list(void);
 void menu_add_option_allnoconfig_y(void);
 void menu_finalize(struct menu *parent);
 void menu_set_type(int type);
index a5fbd6ccc006e05308f0ef24cf3cb1545a55cb15..5dcfc173da41856cf22f24fed058b6b3ccfe60be 100644 (file)
@@ -219,15 +219,6 @@ void menu_add_option_modules(void)
        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)
 {
        current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
index 190f1117f35a2e7aa0c3ea4bcb4c98d1e4e96620..f11d8382e9e6817261c9a2b978c96aaa9eab41dd 100644 (file)
@@ -53,7 +53,6 @@ static struct menu *current_menu, *current_entry;
 %token T_COMMENT
 %token T_CONFIG
 %token T_DEFAULT
-%token T_DEFCONFIG_LIST
 %token T_DEF_BOOL
 %token T_DEF_TRISTATE
 %token T_DEPENDS
@@ -223,11 +222,6 @@ config_option: T_OPTION T_MODULES T_EOL
        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
 {
        menu_add_option_allnoconfig_y();
index fe38e6fd2c2a4555adfcd78a135e977c78aa4ac4..36b0fcb18117aa8e6ac93805cfdd2bcbbfb2c3c0 100644 (file)
@@ -35,7 +35,6 @@ static struct symbol symbol_empty = {
        .flags = SYMBOL_VALID,
 };
 
-struct symbol *sym_defconfig_list;
 struct symbol *modules_sym;
 static tristate modules_val;
 
index 0345ef6e3273995dce4b8474c4688ccc8a1641dc..af8774a5697c8d0b83a577f4de702505242d74fd 100644 (file)
@@ -53,6 +53,10 @@ class Conf:
         # Override 'srctree' environment to make the test as the top directory
         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.
         # This directory is automatically removed when done.
         with tempfile.TemporaryDirectory() as temp_dir: