linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Masahiro Yamada <yamada.masahiro@socionext.com>
To: Sam Ravnborg <sam@ravnborg.org>
Cc: Linux Kbuild mailing list <linux-kbuild@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Ulf Magnusson <ulfalizer@gmail.com>,
	"Luis R . Rodriguez" <mcgrof@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Nicholas Piggin <npiggin@gmail.com>,
	Kees Cook <keescook@chromium.org>,
	Emese Revfy <re.emese@gmail.com>, X86 ML <x86@kernel.org>
Subject: Re: [PATCH v4 07/31] kconfig: add built-in function support
Date: Mon, 21 May 2018 14:18:06 +0900	[thread overview]
Message-ID: <CAK7LNATM6s++TJ-VrbSwoMmP5FgVOmkUNGCwzZW=Re0WEr5EYQ@mail.gmail.com> (raw)
In-Reply-To: <20180520145031.GB9826@ravnborg.org>

Sam,

2018-05-20 23:50 GMT+09:00 Sam Ravnborg <sam@ravnborg.org>:
> On Thu, May 17, 2018 at 03:16:46PM +0900, Masahiro Yamada wrote:
>> This commit adds a new concept 'function' to do more text processing
>> in Kconfig.
>>
>> A function call looks like this:
>>
>>   $(function,arg1,arg2,arg3,...)
>>
>> This commit adds the basic infrastructure to expand functions.
>> Change the text expansion helpers to take arguments.
>>
>> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
>> ---
>>
>> Changes in v4:
>>   - Error out if arguments more than FUNCTION_MAX_ARGS are passed
>>   - Use a comma as a delimiter between the function name and the
>>     first argument
>>   - Check the number of arguments accepted by each function
>>   - Support delayed expansion of arguments.
>>     This will be needed to implement 'if' function
>>
>> Changes in v3:
>>   - Split base infrastructure and 'shell' function
>>     into separate patches.
>>
>> Changes in v2:
>>   - Use 'shell' for getting stdout from the comment.
>>     It was 'shell-stdout' in the previous version.
>>   - Simplify the implementation since the expansion has been moved to
>>     lexer.
>>
>>  scripts/kconfig/preprocess.c | 168 ++++++++++++++++++++++++++++++++++++++++---
>>  1 file changed, 159 insertions(+), 9 deletions(-)
>>
>> diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c
>> index 1bf506c..5be28ec 100644
>> --- a/scripts/kconfig/preprocess.c
>> +++ b/scripts/kconfig/preprocess.c
>> @@ -3,12 +3,17 @@
>>  // Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com>
>>
>>  #include <stdarg.h>
>> +#include <stdbool.h>
>>  #include <stdio.h>
>>  #include <stdlib.h>
>>  #include <string.h>
>>
>>  #include "list.h"
>>
>> +#define ARRAY_SIZE(arr)              (sizeof(arr) / sizeof((arr)[0]))
>> +
>> +static char *expand_string_with_args(const char *in, int argc, char *argv[]);
>> +
>>  static void __attribute__((noreturn)) pperror(const char *format, ...)
>>  {
>>       va_list ap;
>> @@ -88,9 +93,85 @@ void env_write_dep(FILE *f, const char *autoconfig_name)
>>       }
>>  }
>>
>> -static char *eval_clause(const char *in)
>> +/*
>> + * Built-in functions
>> + */
>> +struct function {
>> +     const char *name;
>> +     unsigned int min_args;
>> +     unsigned int max_args;
>> +     bool expand_args;
>> +     char *(*func)(int argc, char *argv[], int old_argc, char *old_argv[]);
>> +};
> If a typedef was provided for the function then ...


Yes, I can do this,
but I may rather consider to simplify the code.


>> +
>> +static const struct function function_table[] = {
>> +     /* Name         MIN     MAX     EXP?    Function */
>> +};
>> +
>> +#define FUNCTION_MAX_ARGS            16
>> +
>> +static char *function_expand_arg_and_call(char *(*func)(int argc, char *argv[],
>> +                                                     int old_argc,
>> +                                                     char *old_argv[]),
>> +                                       int argc, char *argv[],
>> +                                       int old_argc, char *old_argv[])
> this could be much easier to read.
>
>> +{
>> +     char *expanded_argv[FUNCTION_MAX_ARGS], *res;
>> +     int i;
>> +
>> +     for (i = 0; i < argc; i++)
>> +             expanded_argv[i] = expand_string_with_args(argv[i],
>> +                                                        old_argc, old_argv);
>
> No check for too many arguments here - maybe it is done in some other place.

Right.
This has already been checked by eval_clause().


>> +
>> +     res = func(argc, expanded_argv, 0, NULL);
>> +
>> +     for (i = 0; i < argc; i++)
>> +             free(expanded_argv[i]);
>> +
>> +     return res;
>> +}
>> +
>> +static char *function_call(const char *name, int argc, char *argv[],
>> +                        int old_argc, char *old_argv[])
>> +{
>> +     const struct function *f;
>> +     int i;
>> +
>> +     for (i = 0; i < ARRAY_SIZE(function_table); i++) {
>> +             f = &function_table[i];
>> +             if (strcmp(f->name, name))
>> +                     continue;
>> +
>> +             if (argc < f->min_args)
>> +                     pperror("too few function arguments passed to '%s'",
>> +                             name);
>> +
>> +             if (argc > f->max_args)
>> +                     pperror("too many function arguments passed to '%s'",
>> +                             name);
> Number of arguments checked here, but max_args is not assiged in this patch.

This is added to function_table[] by later patches.


>
>> +
>> +             if (f->expand_args)
>> +                     return function_expand_arg_and_call(f->func, argc, argv,
>> +                                                         old_argc, old_argv);
>> +             return f->func(argc, argv, old_argc, old_argv);
>> +     }
>> +
>> +     return NULL;
>> +}
>> +
>> +/*
>> + * Evaluate a clause with arguments.  argc/argv are arguments from the upper
>> + * function call.
>> + *
>> + * Returned string must be freed when done
>> + */
>> +static char *eval_clause(const char *in, int argc, char *argv[])
>>  {
>> -     char *res, *name;
>> +     char *tmp, *prev, *p, *res, *name;
>> +     int new_argc = 0;
>> +     char *new_argv[FUNCTION_MAX_ARGS];
>> +     int nest = 0;
>> +     int i;
>>
>>       /*
>>        * Returns an empty string because '$()' should be evaluated
>> @@ -99,10 +180,69 @@ static char *eval_clause(const char *in)
>>       if (!*in)
>>               return xstrdup("");
>>
>> -     name = expand_string(in);
>> +     tmp = xstrdup(in);
>> +
>> +     prev = p = tmp;
>> +
>> +     /*
>> +      * Split into tokens
>> +      * The function name and arguments are separated by a comma.
>> +      * For example, if the function call is like this:
>> +      *   $(foo,abc,$(x),$(y))
>> +      *
>> +      * The input string for this helper should be:
>> +      *   foo,abc,$(x),$(y)
>> +      *
>> +      * and split into:
>> +      *   new_argv[0] = 'foo'
>> +      *   new_argv[1] = 'abc'
>> +      *   new_argv[2] = '$(x)'
>> +      *   new_argv[3] = '$(y)'
>> +      */
>> +     while (*p) {
>> +             if (nest == 0 && *p == ',') {
>> +                     *p = 0;
>> +                     if (new_argc >= FUNCTION_MAX_ARGS)
>> +                             pperror("too many function arguments");
>> +                     new_argv[new_argc++] = prev;
>> +                     prev = p + 1;
>> +             } else if (*p == '(') {
>> +                     nest++;
>> +             } else if (*p == ')') {
>> +                     nest--;
>> +             }
>> +
>> +             p++;
>> +     }
>> +     new_argv[new_argc++] = prev;
>
> Will the following be equal:
>
>         $(foo,abc,$(x),$(y))
>         $(foo, abc, $(x), $(y))
>
> make is rather annoying as space is significant, but there seems no good reason
> for kconfig to inheritate this.
> So unless there are good arguments consider alloing the spaces.
> If the current implmentation already supports optional spaces then I just missed
> it whie reviewing.


I have been thinking of trimming the leading whitespaces.
(https://patchwork.kernel.org/patch/10405549/)

This is trade-off vs "how to pass spaces as arguments?"

GNU Make trims any leading whitespaces from the first argument.
At least, it was tedious to print messages with indentation.


$(info Tool information:)
$(info   CC: $(CC))
$(info   LD: $(LD))

will print

Tool information:
CC: gcc
LD: ld


To keep the indentation, I need to do like follows:

$(info Tool information:)
$(info $(space)$(space)CC: $(CC))
$(info $(space)$(space)LD: $(LD))


If this is acceptable limitation,
yes, I can do this.




-- 
Best Regards
Masahiro Yamada

  reply	other threads:[~2018-05-21  5:19 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-17  6:16 [PATCH v4 00/31] kconfig: move compiler capability tests to Kconfig Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 01/31] kbuild: remove kbuild cache Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 02/31] kbuild: remove CONFIG_CROSS_COMPILE support Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 03/31] kconfig: reference environment variables directly and remove 'option env=' Masahiro Yamada
2018-05-20 15:46   ` Ulf Magnusson
2018-05-21  4:43     ` Masahiro Yamada
2018-05-21 11:06       ` Ulf Magnusson
2018-05-21 11:11         ` Ulf Magnusson
2018-05-24  4:45         ` Masahiro Yamada
2018-05-26 20:47           ` Ulf Magnusson
2018-05-17  6:16 ` [PATCH v4 04/31] kconfig: remove string expansion in file_lookup() Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 05/31] kconfig: remove string expansion for mainmenu after yyparse() Masahiro Yamada
2018-05-20 14:39   ` Sam Ravnborg
2018-05-21  5:38     ` Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 06/31] kconfig: remove sym_expand_string_value() Masahiro Yamada
2018-05-17  6:28   ` Kees Cook
2018-05-17  6:16 ` [PATCH v4 07/31] kconfig: add built-in function support Masahiro Yamada
2018-05-20 14:50   ` Sam Ravnborg
2018-05-21  5:18     ` Masahiro Yamada [this message]
2018-05-21  6:16       ` Sam Ravnborg
2018-05-21  6:41         ` Masahiro Yamada
2018-05-21  7:14           ` Sam Ravnborg
2018-05-21 14:23     ` Ulf Magnusson
2018-05-21 14:32       ` Ulf Magnusson
2018-05-21 15:10         ` Ulf Magnusson
2018-05-22  3:11           ` Masahiro Yamada
2018-05-22  4:50             ` Ulf Magnusson
2018-05-22  4:58               ` Ulf Magnusson
2018-05-17  6:16 ` [PATCH v4 08/31] kconfig: add 'shell' built-in function Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 09/31] kconfig: replace $(UNAME_RELEASE) with function call Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 10/31] kconfig: begin PARAM state only when seeing a command keyword Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 11/31] kconfig: support user-defined function and recursively expanded variable Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 12/31] kconfig: support simply " Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 13/31] kconfig: support append assignment operator Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 14/31] kconfig: expand lefthand side of assignment statement Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 15/31] kconfig: add 'info', 'warning', and 'error' built-in functions Masahiro Yamada
2018-05-17  6:38   ` Kees Cook
2018-05-17  6:16 ` [PATCH v4 16/31] kconfig: add 'if' built-in function Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 17/31] kconfig: add 'filename' and 'lineno' built-in variables Masahiro Yamada
2018-05-17  6:39   ` Kees Cook
2018-05-17  6:16 ` [PATCH v4 18/31] kconfig: error out if a recursive variable references itself Masahiro Yamada
2018-05-17  6:16 ` [PATCH v4 19/31] Documentation: kconfig: document a new Kconfig macro language Masahiro Yamada
2018-05-17  6:38   ` Kees Cook
2018-05-17  6:55     ` Masahiro Yamada
2018-05-26  2:14   ` Randy Dunlap
2018-05-17  6:16 ` [PATCH v4 20/31] kconfig: test: add Kconfig macro language tests Masahiro Yamada
2018-05-17  6:41   ` Kees Cook
2018-05-17  6:48     ` Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 21/31] kconfig: show compiler version text in the top comment Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 22/31] kconfig: add basic helper macros to scripts/Kconfig.include Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 23/31] stack-protector: test compiler capability in Kconfig and drop AUTO mode Masahiro Yamada
2018-05-17  6:26   ` Kees Cook
2018-05-17  6:17 ` [PATCH v4 24/31] kconfig: add CC_IS_GCC and GCC_VERSION Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 25/31] kconfig: add CC_IS_CLANG and CLANG_VERSION Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 26/31] gcov: remove CONFIG_GCOV_FORMAT_AUTODETECT Masahiro Yamada
2018-05-17  6:17 ` [PATCH v4 27/31] kcov: test compiler capability in Kconfig and correct dependency Masahiro Yamada
2018-05-17  6:33   ` Kees Cook
2018-05-17  6:17 ` [PATCH v4 28/31] gcc-plugins: move GCC version check for PowerPC to Kconfig Masahiro Yamada
2018-05-17  6:29   ` Kees Cook
2018-05-17  6:17 ` [PATCH v4 29/31] gcc-plugins: test plugin support in Kconfig and clean up Makefile Masahiro Yamada
2018-05-17  6:32   ` Kees Cook
2018-05-17  6:17 ` [PATCH v4 30/31] gcc-plugins: allow to enable GCC_PLUGINS for COMPILE_TEST Masahiro Yamada
2018-05-17  6:27   ` Kees Cook
2018-05-17  6:17 ` [PATCH v4 31/31] arm64: move GCC version check for ARCH_SUPPORTS_INT128 to Kconfig Masahiro Yamada
2018-05-17  7:51 ` [PATCH v4 00/31] kconfig: move compiler capability tests " Nicholas Piggin
2018-05-17 14:22   ` Masahiro Yamada
2018-05-22  5:37     ` Masahiro Yamada

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAK7LNATM6s++TJ-VrbSwoMmP5FgVOmkUNGCwzZW=Re0WEr5EYQ@mail.gmail.com' \
    --to=yamada.masahiro@socionext.com \
    --cc=keescook@chromium.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcgrof@kernel.org \
    --cc=npiggin@gmail.com \
    --cc=re.emese@gmail.com \
    --cc=sam@ravnborg.org \
    --cc=torvalds@linux-foundation.org \
    --cc=ulfalizer@gmail.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).