kconfig: add 'info', 'warning-if', and 'error-if' built-in functions
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 28 May 2018 09:21:53 +0000 (18:21 +0900)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 21:13:36 +0000 (22:13 +0100)
Syntax:
  $(info,<text>)
  $(warning-if,<condition>,<text>)
  $(error-if,<condition>,<text)

The 'info' function prints a message to stdout as in Make.

The 'warning-if' and 'error-if' are similar to 'warning' and 'error'
in Make, but take the condition parameter.  They are effective only
when the <condition> part is y.

Kconfig does not implement the lazy expansion as used in the 'if'
'and, 'or' functions in Make.  In other words, Kconfig does not
support conditional expansion.  The unconditional 'error' function
would always terminate the parsing, hence would be useless in Kconfig.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/preprocess.c

index 56aa1f0bad0422eab2d1f1f2eb1f8d79f99b769c..5ee58eeb9a7d954d8d5b849211835147a88da8dc 100644 (file)
@@ -106,6 +106,21 @@ struct function {
        char *(*func)(int argc, char *argv[]);
 };
 
+static char *do_error_if(int argc, char *argv[])
+{
+       if (!strcmp(argv[0], "y"))
+               pperror("%s", argv[1]);
+
+       return NULL;
+}
+
+static char *do_info(int argc, char *argv[])
+{
+       printf("%s\n", argv[0]);
+
+       return xstrdup("");
+}
+
 static char *do_shell(int argc, char *argv[])
 {
        FILE *p;
@@ -146,9 +161,21 @@ static char *do_shell(int argc, char *argv[])
        return xstrdup(buf);
 }
 
+static char *do_warning_if(int argc, char *argv[])
+{
+       if (!strcmp(argv[0], "y"))
+               fprintf(stderr, "%s:%d: %s\n",
+                       current_file->name, yylineno, argv[1]);
+
+       return xstrdup("");
+}
+
 static const struct function function_table[] = {
        /* Name         MIN     MAX     Function */
+       { "error-if",   2,      2,      do_error_if },
+       { "info",       1,      1,      do_info },
        { "shell",      1,      1,      do_shell },
+       { "warning-if", 2,      2,      do_warning_if },
 };
 
 #define FUNCTION_MAX_ARGS              16