diff options
Diffstat (limited to 'scripts/kconfig/symbol.c')
-rw-r--r-- | scripts/kconfig/symbol.c | 79 |
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; | |||
34 | struct symbol *modules_sym; | 34 | struct symbol *modules_sym; |
35 | tristate modules_val; | 35 | tristate modules_val; |
36 | 36 | ||
37 | struct expr *sym_env_list; | ||
38 | |||
37 | void sym_add_default(struct symbol *sym, const char *def) | 39 | void 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 | ||
107 | struct 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 | |||
120 | struct property *sym_get_default_prop(struct symbol *sym) | 116 | struct 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) | |||
849 | struct symbol *prop_get_symbol(struct property *prop) | 849 | struct 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 | |||
882 | void 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 | } | ||