kconfig: support simply expanded variable
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 28 May 2018 09:21:50 +0000 (18:21 +0900)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 21:13:33 +0000 (22:13 +0100)
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: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/lkc_proto.h
config/preprocess.c
config/zconf.l
config/zconf.y

index 2b16d6e1b2dbd9874fd822763035c644b8888924..6303193f43f21c978b8e685b13e1f8672324d663 100644 (file)
@@ -49,8 +49,13 @@ const char * sym_get_string_value(struct symbol *sym);
 const char * prop_get_type_name(enum prop_type type);
 
 /* preprocess.c */
+enum variable_flavor {
+       VAR_SIMPLE,
+       VAR_RECURSIVE,
+};
 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);
 char *expand_string(const char *in);
 char *expand_dollar(const char **str);
index 46487fe6b36cd99e9ea04cc0bc2cbe7708b98121..d103683b386edc551ffc526d28bf74434856d7b1 100644 (file)
@@ -185,6 +185,7 @@ static LIST_HEAD(variable_list);
 struct variable {
        char *name;
        char *value;
+       enum variable_flavor flavor;
        struct list_head node;
 };
 
@@ -203,15 +204,22 @@ static struct variable *variable_lookup(const char *name)
 static char *variable_expand(const char *name, int argc, char *argv[])
 {
        struct variable *v;
+       char *res;
 
        v = variable_lookup(name);
        if (!v)
                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;
 
@@ -224,7 +232,12 @@ void variable_add(const char *name, const char *value)
                list_add_tail(&v->node, &variable_list);
        }
 
-       v->value = xstrdup(value);
+       v->flavor = flavor;
+
+       if (flavor == VAR_SIMPLE)
+               v->value = expand_string(value);
+       else
+               v->value = xstrdup(value);
 }
 
 static void variable_del(struct variable *v)
index f1add9536c029ec77b01361dc8c4ac92265cd02b..d0f5b132a9b39802680a3f07343d0c36bf83e4ee 100644 (file)
@@ -114,7 +114,8 @@ n   [A-Za-z0-9_-]
                yylval.string = text;
                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:]]+
        .       warn_ignored_character(*yytext);
        \n      {
index addd4a68b549c5557a5ba41781e1a31d96ed7729..a4b17758bf1013422d0ea624ebd604092d236c89 100644 (file)
@@ -41,6 +41,7 @@ static struct menu *current_menu, *current_entry;
        struct expr *expr;
        struct menu *menu;
        const struct kconf_id *id;
+       enum variable_flavor flavor;
 }
 
 %token <id>T_MAINMENU
@@ -78,7 +79,7 @@ static struct menu *current_menu, *current_entry;
 %token T_OPEN_PAREN
 %token T_EOL
 %token <string> T_VARIABLE
-%token T_ASSIGN
+%token <flavor> T_ASSIGN
 %token <string> T_ASSIGN_VAL
 
 %left T_OR
@@ -517,7 +518,7 @@ word_opt: /* empty */                       { $$ = NULL; }
 
 /* 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:
        /* empty */             { $$ = xstrdup(""); };