Skip to content

Commit

Permalink
kconfig: add 'shell' built-in function
Browse files Browse the repository at this point in the history
This accepts a single command to execute.  It returns the standard
output from it.

[Example code]

  config HELLO
          string
          default "$(shell,echo hello world)"

  config Y
          def_bool $(shell,echo y)

[Result]

  $ make -s alldefconfig && tail -n 2 .config
  CONFIG_HELLO="hello world"
  CONFIG_Y=y

Caveat:
Like environments, functions are expanded in the lexer.  You cannot
pass symbols to function arguments.  This is a limitation to simplify
the implementation.  I want to avoid the dynamic function evaluation,
which would introduce much more complexity.

Signed-off-by: Masahiro Yamada <[email protected]>
  • Loading branch information
masahir0y committed May 28, 2018
1 parent e298f3b commit 2fd5b09
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions scripts/kconfig/preprocess.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,49 @@ struct function {
char *(*func)(int argc, char *argv[]);
};

static char *do_shell(int argc, char *argv[])
{
FILE *p;
char buf[256];
char *cmd;
size_t nread;
int i;

cmd = argv[0];

p = popen(cmd, "r");
if (!p) {
perror(cmd);
exit(1);
}

nread = fread(buf, 1, sizeof(buf), p);
if (nread == sizeof(buf))
nread--;

/* remove trailing new lines */
while (buf[nread - 1] == '\n')
nread--;

buf[nread] = 0;

/* replace a new line with a space */
for (i = 0; i < nread; i++) {
if (buf[i] == '\n')
buf[i] = ' ';
}

if (pclose(p) == -1) {
perror(cmd);
exit(1);
}

return xstrdup(buf);
}

static const struct function function_table[] = {
/* Name MIN MAX Function */
{ "shell", 1, 1, do_shell },
};

#define FUNCTION_MAX_ARGS 16
Expand Down

0 comments on commit 2fd5b09

Please sign in to comment.