aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kconfig/symbol.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kconfig/symbol.c')
-rw-r--r--scripts/kconfig/symbol.c79
1 files changed, 55 insertions, 24 deletions
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index c35dcc5d6189..3929e5b35e79 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -34,6 +34,8 @@ struct symbol *sym_defconfig_list;
34struct symbol *modules_sym; 34struct symbol *modules_sym;
35tristate modules_val; 35tristate modules_val;
36 36
37struct expr *sym_env_list;
38
37void sym_add_default(struct symbol *sym, const char *def) 39void sym_add_default(struct symbol *sym, const char *def)
38{ 40{
39 struct property *prop = prop_alloc(P_DEFAULT, sym); 41 struct property *prop = prop_alloc(P_DEFAULT, sym);
@@ -45,7 +47,6 @@ void sym_init(void)
45{ 47{
46 struct symbol *sym; 48 struct symbol *sym;
47 struct utsname uts; 49 struct utsname uts;
48 char *p;
49 static bool inited = false; 50 static bool inited = false;
50 51
51 if (inited) 52 if (inited)
@@ -54,20 +55,6 @@ void sym_init(void)
54 55
55 uname(&uts); 56 uname(&uts);
56 57
57 sym = sym_lookup("ARCH", 0);
58 sym->type = S_STRING;
59 sym->flags |= SYMBOL_AUTO;
60 p = getenv("ARCH");
61 if (p)
62 sym_add_default(sym, p);
63
64 sym = sym_lookup("KERNELVERSION", 0);
65 sym->type = S_STRING;
66 sym->flags |= SYMBOL_AUTO;
67 p = getenv("KERNELVERSION");
68 if (p)
69 sym_add_default(sym, p);
70
71 sym = sym_lookup("UNAME_RELEASE", 0); 58 sym = sym_lookup("UNAME_RELEASE", 0);
72 sym->type = S_STRING; 59 sym->type = S_STRING;
73 sym->flags |= SYMBOL_AUTO; 60 sym->flags |= SYMBOL_AUTO;
@@ -117,6 +104,15 @@ struct property *sym_get_choice_prop(struct symbol *sym)
117 return NULL; 104 return NULL;
118} 105}
119 106
107struct property *sym_get_env_prop(struct symbol *sym)
108{
109 struct property *prop;
110
111 for_all_properties(sym, prop, P_ENV)
112 return prop;
113 return NULL;
114}
115
120struct property *sym_get_default_prop(struct symbol *sym) 116struct property *sym_get_default_prop(struct symbol *sym)
121{ 117{
122 struct property *prop; 118 struct property *prop;
@@ -199,7 +195,7 @@ static void sym_calc_visibility(struct symbol *sym)
199 tri = no; 195 tri = no;
200 for_all_prompts(sym, prop) { 196 for_all_prompts(sym, prop) {
201 prop->visible.tri = expr_calc_value(prop->visible.expr); 197 prop->visible.tri = expr_calc_value(prop->visible.expr);
202 tri = E_OR(tri, prop->visible.tri); 198 tri = EXPR_OR(tri, prop->visible.tri);
203 } 199 }
204 if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) 200 if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
205 tri = yes; 201 tri = yes;
@@ -247,8 +243,7 @@ static struct symbol *sym_calc_choice(struct symbol *sym)
247 243
248 /* just get the first visible value */ 244 /* just get the first visible value */
249 prop = sym_get_choice_prop(sym); 245 prop = sym_get_choice_prop(sym);
250 for (e = prop->expr; e; e = e->left.expr) { 246 expr_list_for_each_sym(prop->expr, e, def_sym) {
251 def_sym = e->right.sym;
252 sym_calc_visibility(def_sym); 247 sym_calc_visibility(def_sym);
253 if (def_sym->visible != no) 248 if (def_sym->visible != no)
254 return def_sym; 249 return def_sym;
@@ -303,7 +298,7 @@ void sym_calc_value(struct symbol *sym)
303 if (sym_is_choice_value(sym) && sym->visible == yes) { 298 if (sym_is_choice_value(sym) && sym->visible == yes) {
304 prop = sym_get_choice_prop(sym); 299 prop = sym_get_choice_prop(sym);
305 newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; 300 newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
306 } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { 301 } else if (EXPR_OR(sym->visible, sym->rev_dep.tri) != no) {
307 sym->flags |= SYMBOL_WRITE; 302 sym->flags |= SYMBOL_WRITE;
308 if (sym_has_value(sym)) 303 if (sym_has_value(sym))
309 newval.tri = sym->def[S_DEF_USER].tri; 304 newval.tri = sym->def[S_DEF_USER].tri;
@@ -312,7 +307,7 @@ void sym_calc_value(struct symbol *sym)
312 if (prop) 307 if (prop)
313 newval.tri = expr_calc_value(prop->expr); 308 newval.tri = expr_calc_value(prop->expr);
314 } 309 }
315 newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); 310 newval.tri = EXPR_OR(EXPR_AND(newval.tri, sym->visible), sym->rev_dep.tri);
316 } else if (!sym_is_choice(sym)) { 311 } else if (!sym_is_choice(sym)) {
317 prop = sym_get_default_prop(sym); 312 prop = sym_get_default_prop(sym);
318 if (prop) { 313 if (prop) {
@@ -347,6 +342,9 @@ void sym_calc_value(struct symbol *sym)
347 ; 342 ;
348 } 343 }
349 344
345 if (sym->flags & SYMBOL_AUTO)
346 sym->flags &= ~SYMBOL_WRITE;
347
350 sym->curr = newval; 348 sym->curr = newval;
351 if (sym_is_choice(sym) && newval.tri == yes) 349 if (sym_is_choice(sym) && newval.tri == yes)
352 sym->curr.val = sym_calc_choice(sym); 350 sym->curr.val = sym_calc_choice(sym);
@@ -361,12 +359,14 @@ void sym_calc_value(struct symbol *sym)
361 } 359 }
362 360
363 if (sym_is_choice(sym)) { 361 if (sym_is_choice(sym)) {
362 struct symbol *choice_sym;
364 int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); 363 int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
364
365 prop = sym_get_choice_prop(sym); 365 prop = sym_get_choice_prop(sym);
366 for (e = prop->expr; e; e = e->left.expr) { 366 expr_list_for_each_sym(prop->expr, e, choice_sym) {
367 e->right.sym->flags |= flags; 367 choice_sym->flags |= flags;
368 if (flags & SYMBOL_CHANGED) 368 if (flags & SYMBOL_CHANGED)
369 sym_set_changed(e->right.sym); 369 sym_set_changed(choice_sym);
370 } 370 }
371 } 371 }
372} 372}
@@ -849,7 +849,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym)
849struct symbol *prop_get_symbol(struct property *prop) 849struct symbol *prop_get_symbol(struct property *prop)
850{ 850{
851 if (prop->expr && (prop->expr->type == E_SYMBOL || 851 if (prop->expr && (prop->expr->type == E_SYMBOL ||
852 prop->expr->type == E_CHOICE)) 852 prop->expr->type == E_LIST))
853 return prop->expr->left.sym; 853 return prop->expr->left.sym;
854 return NULL; 854 return NULL;
855} 855}
@@ -859,6 +859,8 @@ const char *prop_get_type_name(enum prop_type type)
859 switch (type) { 859 switch (type) {
860 case P_PROMPT: 860 case P_PROMPT:
861 return "prompt"; 861 return "prompt";
862 case P_ENV:
863 return "env";
862 case P_COMMENT: 864 case P_COMMENT:
863 return "comment"; 865 return "comment";
864 case P_MENU: 866 case P_MENU:
@@ -876,3 +878,32 @@ const char *prop_get_type_name(enum prop_type type)
876 } 878 }
877 return "unknown"; 879 return "unknown";
878} 880}
881
882void prop_add_env(const char *env)
883{
884 struct symbol *sym, *sym2;
885 struct property *prop;
886 char *p;
887
888 sym = current_entry->sym;
889 sym->flags |= SYMBOL_AUTO;
890 for_all_properties(sym, prop, P_ENV) {
891 sym2 = prop_get_symbol(prop);
892 if (strcmp(sym2->name, env))
893 menu_warn(current_entry, "redefining environment symbol from %s",
894 sym2->name);
895 return;
896 }
897
898 prop = prop_alloc(P_ENV, sym);
899 prop->expr = expr_alloc_symbol(sym_lookup(env, 1));
900
901 sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
902 sym_env_list->right.sym = sym;
903
904 p = getenv(env);
905 if (p)
906 sym_add_default(sym, p);
907 else
908 menu_warn(current_entry, "environment variable %s undefined", env);
909}