Commit 1175c025 authored by Masahiro Yamada's avatar Masahiro Yamada

kconfig: support simply expanded variable

The previous commit added variable and user-defined function.  They
work similarly in the sense that the evaluation is deferred until
they are used.

This commit adds another type of variable, simply expanded variable,
as we see in Make.

The := operator defines a simply expanded variable, expanding the
righthand side immediately.  This works like traditional programming
language variables.
Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
parent 9ced3bdd
...@@ -49,8 +49,13 @@ const char * sym_get_string_value(struct symbol *sym); ...@@ -49,8 +49,13 @@ const char * sym_get_string_value(struct symbol *sym);
const char * prop_get_type_name(enum prop_type type); const char * prop_get_type_name(enum prop_type type);
/* preprocess.c */ /* preprocess.c */
enum variable_flavor {
VAR_SIMPLE,
VAR_RECURSIVE,
};
void env_write_dep(FILE *f, const char *auto_conf_name); void env_write_dep(FILE *f, const char *auto_conf_name);
void variable_add(const char *name, const char *value); void variable_add(const char *name, const char *value,
enum variable_flavor flavor);
void variable_all_del(void); void variable_all_del(void);
char *expand_string(const char *in); char *expand_string(const char *in);
char *expand_dollar(const char **str); char *expand_dollar(const char **str);
......
...@@ -185,6 +185,7 @@ static LIST_HEAD(variable_list); ...@@ -185,6 +185,7 @@ static LIST_HEAD(variable_list);
struct variable { struct variable {
char *name; char *name;
char *value; char *value;
enum variable_flavor flavor;
struct list_head node; struct list_head node;
}; };
...@@ -203,15 +204,22 @@ static struct variable *variable_lookup(const char *name) ...@@ -203,15 +204,22 @@ static struct variable *variable_lookup(const char *name)
static char *variable_expand(const char *name, int argc, char *argv[]) static char *variable_expand(const char *name, int argc, char *argv[])
{ {
struct variable *v; struct variable *v;
char *res;
v = variable_lookup(name); v = variable_lookup(name);
if (!v) if (!v)
return NULL; return NULL;
return expand_string_with_args(v->value, argc, argv); if (v->flavor == VAR_RECURSIVE)
res = expand_string_with_args(v->value, argc, argv);
else
res = xstrdup(v->value);
return res;
} }
void variable_add(const char *name, const char *value) void variable_add(const char *name, const char *value,
enum variable_flavor flavor)
{ {
struct variable *v; struct variable *v;
...@@ -224,6 +232,11 @@ void variable_add(const char *name, const char *value) ...@@ -224,6 +232,11 @@ void variable_add(const char *name, const char *value)
list_add_tail(&v->node, &variable_list); list_add_tail(&v->node, &variable_list);
} }
v->flavor = flavor;
if (flavor == VAR_SIMPLE)
v->value = expand_string(value);
else
v->value = xstrdup(value); v->value = xstrdup(value);
} }
......
...@@ -114,7 +114,8 @@ n [A-Za-z0-9_-] ...@@ -114,7 +114,8 @@ n [A-Za-z0-9_-]
yylval.string = text; yylval.string = text;
return T_VARIABLE; return T_VARIABLE;
} }
"=" { BEGIN(ASSIGN_VAL); return T_ASSIGN; } "=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_RECURSIVE; return T_ASSIGN; }
":=" { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_SIMPLE; return T_ASSIGN; }
[[:blank:]]+ [[:blank:]]+
. warn_ignored_character(*yytext); . warn_ignored_character(*yytext);
\n { \n {
......
...@@ -41,6 +41,7 @@ static struct menu *current_menu, *current_entry; ...@@ -41,6 +41,7 @@ static struct menu *current_menu, *current_entry;
struct expr *expr; struct expr *expr;
struct menu *menu; struct menu *menu;
const struct kconf_id *id; const struct kconf_id *id;
enum variable_flavor flavor;
} }
%token <id>T_MAINMENU %token <id>T_MAINMENU
...@@ -78,7 +79,7 @@ static struct menu *current_menu, *current_entry; ...@@ -78,7 +79,7 @@ static struct menu *current_menu, *current_entry;
%token T_OPEN_PAREN %token T_OPEN_PAREN
%token T_EOL %token T_EOL
%token <string> T_VARIABLE %token <string> T_VARIABLE
%token T_ASSIGN %token <flavor> T_ASSIGN
%token <string> T_ASSIGN_VAL %token <string> T_ASSIGN_VAL
%left T_OR %left T_OR
...@@ -517,7 +518,7 @@ word_opt: /* empty */ { $$ = NULL; } ...@@ -517,7 +518,7 @@ word_opt: /* empty */ { $$ = NULL; }
/* assignment statement */ /* assignment statement */
assignment_stmt: T_VARIABLE T_ASSIGN assign_val T_EOL { variable_add($1, $3); free($1); free($3); } assignment_stmt: T_VARIABLE T_ASSIGN assign_val T_EOL { variable_add($1, $3, $2); free($1); free($3); }
assign_val: assign_val:
/* empty */ { $$ = xstrdup(""); }; /* empty */ { $$ = xstrdup(""); };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment