提交 face4374 编写于 作者: R Roman Zippel 提交者: Sam Ravnborg

kconfig: add defconfig_list/module option

This makes it possible to change two options which were hardcoded sofar.
1. Any symbol can now take the role of CONFIG_MODULES
2. The more useful option is to change the list of default file names,
   which kconfig uses to load the base configuration if .config isn't
   available.
Signed-off-by: NRoman Zippel <zippel@linux-m68k.org>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NSam Ravnborg <sam@ravnborg.org>
上级 f6a88aa8
config DEFCONFIG_LIST
string
option defconfig_list
default "/lib/modules/$UNAME_RELEASE/.config"
default "/etc/kernel-config"
default "/boot/config-$UNAME_RELEASE"
default "arch/$ARCH/defconfig"
menu "Code maturity level options" menu "Code maturity level options"
config EXPERIMENTAL config EXPERIMENTAL
......
...@@ -25,15 +25,6 @@ const char conf_def_filename[] = ".config"; ...@@ -25,15 +25,6 @@ const char conf_def_filename[] = ".config";
const char conf_defname[] = "arch/$ARCH/defconfig"; const char conf_defname[] = "arch/$ARCH/defconfig";
const char *conf_confnames[] = {
".config",
"/lib/modules/$UNAME_RELEASE/.config",
"/etc/kernel-config",
"/boot/config-$UNAME_RELEASE",
conf_defname,
NULL,
};
static void conf_warning(const char *fmt, ...) static void conf_warning(const char *fmt, ...)
{ {
va_list ap; va_list ap;
...@@ -98,16 +89,21 @@ int conf_read_simple(const char *name, int def) ...@@ -98,16 +89,21 @@ int conf_read_simple(const char *name, int def)
if (name) { if (name) {
in = zconf_fopen(name); in = zconf_fopen(name);
} else { } else {
const char **names = conf_confnames; struct property *prop;
name = *names++;
if (!name) name = conf_def_filename;
return 1;
in = zconf_fopen(name); in = zconf_fopen(name);
if (in) if (in)
goto load; goto load;
sym_change_count++; sym_change_count++;
while ((name = *names++)) { if (!sym_defconfig_list)
name = conf_expand_value(name); return 1;
for_all_defaults(sym_defconfig_list, prop) {
if (expr_calc_value(prop->visible.expr) == no ||
prop->expr->type != E_SYMBOL)
continue;
name = conf_expand_value(prop->expr->left.sym->name);
in = zconf_fopen(name); in = zconf_fopen(name);
if (in) { if (in) {
printf(_("#\n" printf(_("#\n"
......
...@@ -156,6 +156,7 @@ struct file *lookup_file(const char *name); ...@@ -156,6 +156,7 @@ 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);
......
...@@ -104,6 +104,7 @@ const char *str_get(struct gstr *gs); ...@@ -104,6 +104,7 @@ const char *str_get(struct gstr *gs);
/* symbol.c */ /* symbol.c */
void sym_init(void); void sym_init(void);
void sym_clear_all_valid(void); void sym_clear_all_valid(void);
void sym_set_all_changed(void);
void sym_set_changed(struct symbol *sym); void sym_set_changed(struct symbol *sym);
struct symbol *sym_check_deps(struct symbol *sym); struct symbol *sym_check_deps(struct symbol *sym);
struct property *prop_alloc(enum prop_type type, struct symbol *sym); struct property *prop_alloc(enum prop_type type, struct symbol *sym);
......
...@@ -154,6 +154,20 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) ...@@ -154,6 +154,20 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
void menu_add_option(int token, char *arg) void menu_add_option(int token, char *arg)
{ {
struct property *prop;
switch (token) {
case T_OPT_MODULES:
prop = prop_alloc(P_DEFAULT, modules_sym);
prop->expr = expr_alloc_symbol(current_entry->sym);
break;
case T_OPT_DEFCONFIG_LIST:
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");
break;
}
} }
static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2) static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
......
...@@ -31,6 +31,7 @@ struct symbol symbol_yes = { ...@@ -31,6 +31,7 @@ struct symbol symbol_yes = {
}; };
int sym_change_count; int sym_change_count;
struct symbol *sym_defconfig_list;
struct symbol *modules_sym; struct symbol *modules_sym;
tristate modules_val; tristate modules_val;
...@@ -352,10 +353,13 @@ void sym_calc_value(struct symbol *sym) ...@@ -352,10 +353,13 @@ void sym_calc_value(struct symbol *sym)
sym->curr.val = sym_calc_choice(sym); sym->curr.val = sym_calc_choice(sym);
sym_validate_range(sym); sym_validate_range(sym);
if (memcmp(&oldval, &sym->curr, sizeof(oldval))) if (memcmp(&oldval, &sym->curr, sizeof(oldval))) {
sym_set_changed(sym); sym_set_changed(sym);
if (modules_sym == sym) if (modules_sym == sym) {
modules_val = modules_sym->curr.tri; sym_set_all_changed();
modules_val = modules_sym->curr.tri;
}
}
if (sym_is_choice(sym)) { if (sym_is_choice(sym)) {
int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
...@@ -449,11 +453,8 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) ...@@ -449,11 +453,8 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val)
} }
sym->def[S_DEF_USER].tri = val; sym->def[S_DEF_USER].tri = val;
if (oldval != val) { if (oldval != val)
sym_clear_all_valid(); sym_clear_all_valid();
if (sym == modules_sym)
sym_set_all_changed();
}
return true; return true;
} }
......
...@@ -2112,7 +2112,9 @@ void conf_parse(const char *name) ...@@ -2112,7 +2112,9 @@ void conf_parse(const char *name)
sym_init(); sym_init();
menu_init(); menu_init();
modules_sym = sym_lookup("MODULES", 0); modules_sym = sym_lookup(NULL, 0);
modules_sym->type = S_BOOLEAN;
modules_sym->flags |= SYMBOL_AUTO;
rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
#if YYDEBUG #if YYDEBUG
...@@ -2122,6 +2124,12 @@ void conf_parse(const char *name) ...@@ -2122,6 +2124,12 @@ void conf_parse(const char *name)
zconfparse(); zconfparse();
if (zconfnerrs) if (zconfnerrs)
exit(1); exit(1);
if (!modules_sym->prop) {
struct property *prop;
prop = prop_alloc(P_DEFAULT, modules_sym);
prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
}
menu_finalize(&rootmenu); menu_finalize(&rootmenu);
for_all_symbols(i, sym) { for_all_symbols(i, sym) {
sym_check_deps(sym); sym_check_deps(sym);
......
...@@ -481,7 +481,9 @@ void conf_parse(const char *name) ...@@ -481,7 +481,9 @@ void conf_parse(const char *name)
sym_init(); sym_init();
menu_init(); menu_init();
modules_sym = sym_lookup("MODULES", 0); modules_sym = sym_lookup(NULL, 0);
modules_sym->type = S_BOOLEAN;
modules_sym->flags |= SYMBOL_AUTO;
rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
#if YYDEBUG #if YYDEBUG
...@@ -491,6 +493,12 @@ void conf_parse(const char *name) ...@@ -491,6 +493,12 @@ void conf_parse(const char *name)
zconfparse(); zconfparse();
if (zconfnerrs) if (zconfnerrs)
exit(1); exit(1);
if (!modules_sym->prop) {
struct property *prop;
prop = prop_alloc(P_DEFAULT, modules_sym);
prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
}
menu_finalize(&rootmenu); menu_finalize(&rootmenu);
for_all_symbols(i, sym) { for_all_symbols(i, sym) {
sym_check_deps(sym); sym_check_deps(sym);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册