util/kconfig: Uprev to Linux 5.16's kconfig

Linux 5.16 saw a significant rewrite in the boolean handling which
reduces our change set. On the other hand, it's all new code.

Comparing the config.build and config.h files generated by
`util/abuild/abuild -C`, only a few lines of comment in the header
changed.

Change-Id: I52984e15a48236ddf228707aec85e90f71aa4382
Signed-off-by: Patrick Georgi <patrick@coreboot.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/66045
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Elyes Haouas <ehaouas@noos.fr>
This commit is contained in:
Patrick Georgi 2022-10-28 01:00:26 +02:00 committed by Patrick Georgi
parent 14cedd97a5
commit 4c9b9e9709
17 changed files with 364 additions and 567 deletions

View File

@ -648,19 +648,8 @@ static void check_conf(struct menu *menu)
switch (input_mode) {
case listnewconfig:
if (sym->name) {
const char *str;
if (sym->type == S_STRING) {
str = sym_get_string_value(sym);
str = sym_escape_string_value(str);
printf("%s%s=%s\n", CONFIG_, sym->name, str);
free((void *)str);
} else {
str = sym_get_string_value(sym);
printf("%s%s=%s\n", CONFIG_, sym->name, str);
}
}
if (sym->name)
print_symbol_for_listconfig(sym);
break;
case helpnewconfig:
printf("-----\n");

View File

@ -11,6 +11,7 @@
#include <fcntl.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -129,45 +130,22 @@ static size_t depfile_prefix_len;
/* touch depfile for symbol 'name' */
static int conf_touch_dep(const char *name)
{
int fd, ret;
char *d;
int fd;
/* check overflow: prefix + name + '\0' must fit in buffer. */
if (depfile_prefix_len + strlen(name) + 1 > sizeof(depfile_path))
return -1;
d = depfile_path + depfile_prefix_len;
strcpy(d, name);
strcpy(depfile_path + depfile_prefix_len, name);
/* Assume directory path already exists. */
fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
if (errno != ENOENT)
return -1;
ret = make_parent_dir(depfile_path);
if (ret)
return ret;
/* Try it again. */
fd = open(depfile_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1)
return -1;
}
close(fd);
return 0;
}
struct conf_printer {
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
void (*print_comment)(FILE *, const char *, void *);
};
#ifdef __MINGW32__
#define mkdir(_n,_p) mkdir((_n))
#endif
static void conf_warning(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
@ -177,6 +155,10 @@ static void conf_message(const char *fmt, ...)
static const char *conf_filename;
static int conf_lineno, conf_warnings;
#ifdef __MINGW32__
#define mkdir(_n,_p) mkdir((_n))
#endif
static void conf_warning(const char *fmt, ...)
{
va_list ap;
@ -241,6 +223,13 @@ static const char *conf_get_autoconfig_name(void)
return name ? name : "include/config/auto.conf";
}
static const char *conf_get_autoheader_name(void)
{
char *name = getenv("KCONFIG_AUTOHEADER");
return name ? name : "include/generated/autoconf.h";
}
static const char *conf_get_autobase_name(void)
{
char *name = getenv("KCONFIG_SPLITCONFIG");
@ -621,186 +610,186 @@ int conf_read(const char *name)
return 0;
}
struct comment_style {
const char *decoration;
const char *prefix;
const char *postfix;
};
static const struct comment_style comment_style_pound = {
.decoration = "#",
.prefix = "#",
.postfix = "#",
};
static const struct comment_style comment_style_c = {
.decoration = " *",
.prefix = "/*",
.postfix = " */",
};
static void conf_write_heading(FILE *fp, const struct comment_style *cs)
{
fprintf(fp, "%s\n", cs->prefix);
fprintf(fp, "%s Automatically generated file; DO NOT EDIT.\n",
cs->decoration);
fprintf(fp, "%s %s\n", cs->decoration, rootmenu.prompt->text);
fprintf(fp, "%s\n", cs->postfix);
}
/* The returned pointer must be freed on the caller side */
static char *escape_string_value(const char *in)
{
const char *p;
char *out;
size_t len;
len = strlen(in) + strlen("\"\"") + 1;
p = in;
while (1) {
p += strcspn(p, "\"\\");
if (p[0] == '\0')
break;
len++;
p++;
}
out = xmalloc(len);
out[0] = '\0';
strcat(out, "\"");
p = in;
while (1) {
len = strcspn(p, "\"\\");
strncat(out, p, len);
p += len;
if (p[0] == '\0')
break;
strcat(out, "\\");
strncat(out, p++, 1);
}
strcat(out, "\"");
return out;
}
/*
* Kconfig configuration printer
*
* This printer is used when generating the resulting configuration after
* kconfig invocation and `defconfig' files. Unset symbol might be omitted by
* passing a non-NULL argument to the printer.
*
*/
static void
kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
enum output_n { OUTPUT_N, OUTPUT_N_AS_UNSET, OUTPUT_N_NONE };
static void __print_symbol(FILE *fp, struct symbol *sym, enum output_n output_n,
bool escape_string)
{
const char *val;
char *escaped = NULL;
if (sym->type == S_UNKNOWN)
return;
val = sym_get_string_value(sym);
if ((sym->type == S_BOOLEAN || sym->type == S_TRISTATE) &&
output_n != OUTPUT_N && *val == 'n') {
if (output_n == OUTPUT_N_AS_UNSET)
fprintf(fp, "# %s%s is not set\n", CONFIG_, sym->name);
return;
}
if (sym->type == S_STRING && escape_string) {
escaped = escape_string_value(val);
val = escaped;
}
fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, val);
free(escaped);
}
static void print_symbol_for_dotconfig(FILE *fp, struct symbol *sym)
{
__print_symbol(fp, sym, OUTPUT_N_AS_UNSET, true);
}
static void print_symbol_for_autoconf(FILE *fp, struct symbol *sym)
{
int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
enum output_n out = OUTPUT_N_NONE;
if (print_negatives) {
out = OUTPUT_N;
}
__print_symbol(fp, sym, out, true);
}
void print_symbol_for_listconfig(struct symbol *sym)
{
__print_symbol(stdout, sym, OUTPUT_N, true);
}
static void print_symbol_for_c(FILE *fp, struct symbol *sym)
{
const char *val;
const char *sym_suffix = "";
const char *val_prefix = "";
char *escaped = NULL;
if (sym->type == S_UNKNOWN)
return;
val = sym_get_string_value(sym);
switch (sym->type) {
case S_BOOLEAN:
case S_TRISTATE:
if (*value == 'n') {
bool skip_unset = (arg != NULL);
if (!skip_unset)
fprintf(fp, "# %s%s is not set\n",
CONFIG_, sym->name);
return;
}
break;
default:
break;
}
fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
}
static void
kconfig_print_comment(FILE *fp, const char *value, void *arg)
{
const char *p = value;
size_t l;
for (;;) {
l = strcspn(p, "\n");
fprintf(fp, "#");
if (l) {
fprintf(fp, " ");
xfwrite(p, l, 1, fp);
p += l;
}
fprintf(fp, "\n");
if (*p++ == '\0')
break;
}
}
static struct conf_printer kconfig_printer_cb =
{
.print_symbol = kconfig_print_symbol,
.print_comment = kconfig_print_comment,
};
/*
* Header printer
*
* This printer is used when generating the `include/generated/autoconf.h' file.
*/
static void
header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
{
switch (sym->type) {
case S_BOOLEAN:
case S_TRISTATE: {
const char *suffix = "";
switch (*value) {
switch (*val) {
case 'n':
if (getenv("KCONFIG_NEGATIVES") != NULL)
fprintf(fp, "#define %s%s%s 0\n",
CONFIG_, sym->name, suffix);
if (getenv("KCONFIG_NEGATIVES") != NULL) {
val = "0";
break;
}
return;
case 'm':
suffix = "_MODULE";
sym_suffix = "_MODULE";
/* fall through */
default:
fprintf(fp, "#define %s%s%s 1\n",
CONFIG_, sym->name, suffix);
val = "1";
}
break;
}
case S_HEX: {
const char *prefix = "";
if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
prefix = "0x";
if (value[0] == '\0') {
/*
* prefix is reset to remain closer to the older
* coreboot patch. No need to keep this once kconfig
* is fully upreved
*/
prefix = "";
value = "0";
}
fprintf(fp, "#define %s%s %s%s\n",
CONFIG_, sym->name, prefix, value);
break;
}
case S_STRING:
if (value[0] == '\0')
break;
if (!(sym->flags & SYMBOL_WRITE))
break;
case S_HEX:
if (val[0] != '0' || (val[1] != 'x' && val[1] != 'X'))
val_prefix = "0x";
/* fall through */
case S_INT:
fprintf(fp, "#define %s%s %s\n",
CONFIG_, sym->name, value[0]?value:"0");
break;
default:
break;
if (val[0] == '\0') {
val = "0";
val_prefix = "";
}
}
static void
header_print_comment(FILE *fp, const char *value, void *arg)
{
const char *p = value;
size_t l;
fprintf(fp, "/*\n");
for (;;) {
l = strcspn(p, "\n");
fprintf(fp, " *");
if (l) {
fprintf(fp, " ");
xfwrite(p, l, 1, fp);
p += l;
}
fprintf(fp, "\n");
if (*p++ == '\0')
break;
}
fprintf(fp, " */\n");
}
static struct conf_printer header_printer_cb =
{
.print_symbol = header_print_symbol,
.print_comment = header_print_comment,
};
static void conf_write_symbol(FILE *fp, struct symbol *sym,
struct conf_printer *printer, void *printer_arg)
{
const char *str;
switch (sym->type) {
case S_UNKNOWN:
break;
case S_STRING:
str = sym_get_string_value(sym);
str = sym_escape_string_value(str);
printer->print_symbol(fp, sym, str, printer_arg);
free((void *)str);
break;
escaped = escape_string_value(val);
val = escaped;
default:
str = sym_get_string_value(sym);
printer->print_symbol(fp, sym, str, printer_arg);
}
break;
}
static void
conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
{
char buf[256];
fprintf(fp, "#define %s%s%s %s%s\n", CONFIG_, sym->name, sym_suffix,
val_prefix, val);
snprintf(buf, sizeof(buf),
"\n"
"Automatically generated file; DO NOT EDIT.\n"
"%s\n",
rootmenu.prompt->text);
printer->print_comment(fp, buf, printer_arg);
free(escaped);
}
/*
@ -859,7 +848,7 @@ int conf_write_defconfig(const char *filename)
goto next_menu;
}
}
conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
print_symbol_for_dotconfig(out, sym);
}
next_menu:
if (menu->list != NULL) {
@ -880,16 +869,6 @@ next_menu:
return 0;
}
static int conf_mktemp(const char *path, char *tmpfile)
{
if (snprintf(tmpfile, PATH_MAX, "%s.tmp.XXXXXX", path) >= PATH_MAX) {
errno = EOVERFLOW;
return -1;
}
return mkstemp(tmpfile);
}
int conf_write(const char *name)
{
FILE *out;
@ -929,7 +908,7 @@ int conf_write(const char *name)
if (!out)
return 1;
conf_write_heading(out, &kconfig_printer_cb, NULL);
conf_write_heading(out, &comment_style_pound);
if (!conf_get_changed())
sym_clear_all_valid();
@ -956,7 +935,7 @@ int conf_write(const char *name)
need_newline = false;
}
sym->flags |= SYMBOL_WRITTEN;
conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
print_symbol_for_dotconfig(out, sym);
}
next:
@ -1006,37 +985,50 @@ next:
}
/* write a dependency file as used by kbuild to track dependencies */
static int conf_write_dep(const char *name)
static int conf_write_autoconf_cmd(const char *autoconf_name)
{
char name[PATH_MAX], tmp[PATH_MAX];
struct file *file;
FILE *out;
int ret;
ret = snprintf(name, sizeof(name), "%s.cmd", autoconf_name);
if (ret >= sizeof(name)) /* check truncation */
return -1;
if (make_parent_dir(name))
return 1;
char filename[PATH_MAX];
int fd = conf_mktemp(name, filename);
if (fd == -1)
return 1;
return -1;
out = fdopen(fd, "w");
if (!out)
return 1;
fprintf(out, "deps_config := \\\n");
for (file = file_list; file; file = file->next) {
if (file->next)
fprintf(out, "\t%s \\\n", file->name);
else
fprintf(out, "\t%s\n", file->name);
ret = snprintf(tmp, sizeof(tmp), "%s.cmd.tmp", autoconf_name);
if (ret >= sizeof(tmp)) /* check truncation */
return -1;
out = fopen(tmp, "w");
if (!out) {
perror("fopen");
return -1;
}
fprintf(out, "\n%s: \\\n"
"\t$(deps_config)\n\n", conf_get_autoconfig_name());
env_write_dep(out, conf_get_autoconfig_name());
fprintf(out, "deps_config := \\\n");
for (file = file_list; file; file = file->next)
fprintf(out, "\t%s \\\n", file->name);
fprintf(out, "\n%s: $(deps_config)\n\n", autoconf_name);
env_write_dep(out, autoconf_name);
fprintf(out, "\n$(deps_config): ;\n");
if (ferror(out)) /* error check for all fprintf() calls */
return -1;
fclose(out);
rename(filename, name);
if (rename(tmp, name)) {
perror("rename");
return -1;
}
return 0;
}
@ -1112,77 +1104,84 @@ static int conf_touch_deps(void)
return 0;
}
static int __conf_write_autoconf(const char *filename,
void (*print_symbol)(FILE *, struct symbol *),
const struct comment_style *comment_style)
{
char tmp[PATH_MAX];
FILE *file;
struct symbol *sym;
int ret, i;
if (make_parent_dir(filename))
return -1;
ret = snprintf(tmp, sizeof(tmp), "%s.tmp", filename);
if (ret >= sizeof(tmp)) /* check truncation */
return -1;
file = fopen(tmp, "w");
if (!file) {
perror("fopen");
return -1;
}
conf_write_heading(file, comment_style);
int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
for_all_symbols(i, sym)
if (((sym->flags & SYMBOL_WRITE) || (print_negatives && sym->type != S_STRING)) && sym->name)
print_symbol(file, sym);
/* check possible errors in conf_write_heading() and print_symbol() */
if (ferror(file))
return -1;
fclose(file);
if (rename(tmp, filename)) {
perror("rename");
return -1;
}
return 0;
}
int conf_write_autoconf(int overwrite)
{
struct symbol *sym;
const char *name;
const char *autoconf_name = conf_get_autoconfig_name();
FILE *out, *out_h;
int i;
int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
int ret, i;
if (!overwrite && is_present(autoconf_name))
return 0;
char autoconfcmd_path[PATH_MAX];
snprintf(autoconfcmd_path, sizeof(autoconfcmd_path), "%s%s",
conf_get_autobase_name(), "auto.conf.cmd");
conf_write_dep(autoconfcmd_path);
ret = conf_write_autoconf_cmd(autoconf_name);
if (ret)
return -1;
if (conf_touch_deps())
return 1;
if (make_parent_dir(autoconf_name))
return 1;
char filename[PATH_MAX];
int fd = conf_mktemp(autoconf_name, filename);
if (fd == -1)
return 1;
out = fdopen(fd, "w");
if (!out)
return 1;
name = getenv("KCONFIG_AUTOHEADER");
if (!name)
name = "include/generated/autoconf.h";
if (make_parent_dir(name))
return 1;
char filename_h[PATH_MAX];
int fd_h = conf_mktemp(name, filename_h);
if (fd_h == -1)
return 1;
out_h = fdopen(fd_h, "w");
if (!out_h) {
fclose(out);
return 1;
}
conf_write_heading(out, &kconfig_printer_cb, NULL);
conf_write_heading(out_h, &header_printer_cb, NULL);
for_all_symbols(i, sym) {
for_all_symbols(i, sym)
sym_calc_value(sym);
if (!(sym->flags & SYMBOL_WRITE) && !print_negatives)
continue;
if (!sym->name)
continue;
/* write symbols to auto.conf and autoconf.h */
conf_write_symbol(out, sym, &kconfig_printer_cb, print_negatives?NULL:(void *)1);
conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
}
fclose(out);
fclose(out_h);
if (rename(filename_h, name))
return 1;
ret = __conf_write_autoconf(conf_get_autoheader_name(),
print_symbol_for_c,
&comment_style_c);
if (ret)
return ret;
/*
* This must be the last step, kbuild has a dependency on auto.conf
* and this marks the successful completion of the previous steps.
* Create include/config/auto.conf. This must be the last step because
* Kbuild has a dependency on auto.conf and this marks the successful
* completion of the previous steps.
*/
if (rename(filename, autoconf_name))
return 1;
ret = __conf_write_autoconf(conf_get_autoconfig_name(),
print_symbol_for_autoconf,
&comment_style_pound);
if (ret)
return ret;
return 0;
}

View File

@ -85,8 +85,7 @@ static void warn_ignored_character(char chr)
n [A-Za-z0-9_-]
%%
int str = 0;
int ts, i;
char open_quote = 0;
#.* /* ignore comment */
[ \t]* /* whitespaces */
@ -135,7 +134,7 @@ n [A-Za-z0-9_-]
":=" return T_COLON_EQUAL;
"+=" return T_PLUS_EQUAL;
\"|\' {
str = yytext[0];
open_quote = yytext[0];
new_string();
BEGIN(STRING);
}
@ -172,7 +171,7 @@ n [A-Za-z0-9_-]
append_string(yytext + 1, yyleng - 1);
}
\'|\" {
if (str == yytext[0]) {
if (open_quote == yytext[0]) {
BEGIN(INITIAL);
yylval.string = text;
return T_WORD_QUOTE;
@ -197,6 +196,8 @@ n [A-Za-z0-9_-]
<HELP>{
[ \t]+ {
int ts, i;
ts = 0;
for (i = 0; i < yyleng; i++) {
if (yytext[i] == '\t')

View File

@ -18,7 +18,7 @@ extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
struct symbol * sym_lookup(const char *name, int flags);
struct symbol * sym_find(const char *name);
const char * sym_escape_string_value(const char *in);
void print_symbol_for_listconfig(struct symbol *sym);
struct symbol ** sym_re_search(const char *pattern);
const char * sym_type_name(enum symbol_type type);
void sym_calc_value(struct symbol *sym);

View File

@ -728,7 +728,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
get_dep_str(r, prop->visible.expr, " Visible if: ");
menu = prop->menu->parent;
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) {
for (i = 0; menu && i < 8; menu = menu->parent) {
bool accessible = menu_is_visible(menu);
submenu[i++] = menu;
@ -758,14 +758,18 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
list_add_tail(&jump->entries, head);
}
if (i > 0) {
str_printf(r, " Location:\n");
for (j = 4; --i >= 0; j += 2) {
menu = submenu[i];
if (jump && menu == location)
jump->offset = strlen(r->s);
str_printf(r, "%*c-> %s", j, ' ',
menu_get_prompt(menu));
if (menu == &rootmenu)
/* The real rootmenu prompt is ugly */
str_printf(r, "%*cMain menu", j, ' ');
else
str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
if (menu->sym) {
str_printf(r, " (%s [=%s])", menu->sym->name ?
menu->sym->name : "<choice>",
@ -774,7 +778,6 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
str_append(r, "\n");
}
}
}
static void get_symbol_props_str(struct gstr *r, struct symbol *sym,
enum prop_type tok, const char *prefix)

View File

@ -19,7 +19,7 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -439,6 +439,7 @@ load:
@@ -428,6 +428,7 @@ load:
if (def == S_DEF_USER) {
sym = sym_find(line + 2 + strlen(CONFIG_));
if (!sym) {
@ -27,7 +27,7 @@ Index: kconfig/confdata.c
conf_set_changed(true);
continue;
}
@@ -521,6 +522,13 @@ load:
@@ -510,6 +511,13 @@ load:
}
free(line);
fclose(in);

View File

@ -23,7 +23,7 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -184,6 +184,16 @@ static void conf_warning(const char *fmt
@@ -166,6 +166,16 @@ static void conf_warning(const char *fmt
conf_warnings++;
}
@ -40,7 +40,7 @@ Index: kconfig/confdata.c
static void conf_default_message_callback(const char *s)
{
printf("#\n# ");
@@ -449,7 +459,7 @@ load:
@@ -438,7 +448,7 @@ load:
sym->type = S_BOOLEAN;
}
if (sym->flags & def_flags) {
@ -49,7 +49,7 @@ Index: kconfig/confdata.c
}
switch (sym->type) {
case S_BOOLEAN:
@@ -488,7 +498,7 @@ load:
@@ -477,7 +487,7 @@ load:
}
if (sym->flags & def_flags) {
@ -58,7 +58,7 @@ Index: kconfig/confdata.c
}
if (conf_set_sym_val(sym, def, def_flags, p))
continue;
@@ -513,7 +523,7 @@ load:
@@ -502,7 +512,7 @@ load:
break;
case yes:
if (cs->def[def].tri != no)

View File

@ -14,7 +14,7 @@ Index: kconfig/conf.c
===================================================================
--- kconfig.orig/conf.c
+++ kconfig/conf.c
@@ -900,7 +900,7 @@ int main(int ac, char **av)
@@ -889,7 +889,7 @@ int main(int ac, char **av)
if (input_mode == savedefconfig) {
if (conf_write_defconfig(defconfig_file)) {

View File

@ -24,7 +24,7 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -449,7 +449,9 @@ load:
@@ -438,7 +438,9 @@ load:
if (def == S_DEF_USER) {
sym = sym_find(line + 2 + strlen(CONFIG_));
if (!sym) {

View File

@ -15,14 +15,14 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -164,6 +164,10 @@ struct conf_printer {
void (*print_comment)(FILE *, const char *, void *);
};
@@ -155,6 +155,10 @@ static void conf_message(const char *fmt
static const char *conf_filename;
static int conf_lineno, conf_warnings;
+#ifdef __MINGW32__
+#define mkdir(_n,_p) mkdir((_n))
+#endif
+
static void conf_warning(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
{
va_list ap;

View File

@ -36,7 +36,7 @@ Index: kconfig/conf.c
static void conf(struct menu *menu);
static void check_conf(struct menu *menu);
@@ -732,6 +734,7 @@ int main(int ac, char **av)
@@ -721,6 +723,7 @@ int main(int ac, char **av)
const char *progname = av[0];
int opt;
const char *name, *defconfig_file = NULL /* gcc uninit */;
@ -44,7 +44,7 @@ Index: kconfig/conf.c
int no_conf_write = 0;
tty_stdio = isatty(0) && isatty(1);
@@ -838,6 +841,13 @@ int main(int ac, char **av)
@@ -827,6 +830,13 @@ int main(int ac, char **av)
break;
}
@ -62,7 +62,7 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -539,11 +539,7 @@ load:
@@ -528,11 +528,7 @@ load:
free(line);
fclose(in);

View File

@ -34,7 +34,7 @@ Index: kconfig/lexer.l
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -438,6 +439,32 @@ void zconf_nextfile(const char *name)
@@ -439,6 +440,32 @@ void zconf_nextfile(const char *name)
current_file = file;
}

View File

@ -10,74 +10,6 @@ Date: Fri Nov 22 22:08:15 2019 +0100
Change-Id: I9e62b05e45709f1539e455e2eed37308609be15e
Signed-off-by: Patrick Georgi <pgeorgi@google.com>
Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -687,6 +687,9 @@ header_print_symbol(FILE *fp, struct sym
switch (*value) {
case 'n':
+ if (getenv("KCONFIG_NEGATIVES") != NULL)
+ fprintf(fp, "#define %s%s%s 0\n",
+ CONFIG_, sym->name, suffix);
break;
case 'm':
suffix = "_MODULE";
@@ -702,14 +705,28 @@ header_print_symbol(FILE *fp, struct sym
if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
prefix = "0x";
+ if (value[0] == '\0') {
+ /*
+ * prefix is reset to remain closer to the older
+ * coreboot patch. No need to keep this once kconfig
+ * is fully upreved
+ */
+ prefix = "";
+ value = "0";
+ }
fprintf(fp, "#define %s%s %s%s\n",
CONFIG_, sym->name, prefix, value);
break;
}
case S_STRING:
+ if (value[0] == '\0')
+ break;
+ if (!(sym->flags & SYMBOL_WRITE))
+ break;
+ /* fall through */
case S_INT:
fprintf(fp, "#define %s%s %s\n",
- CONFIG_, sym->name, value);
+ CONFIG_, sym->name, value[0]?value:"0");
break;
default:
break;
@@ -1080,6 +1097,7 @@ int conf_write_autoconf(int overwrite)
const char *autoconf_name = conf_get_autoconfig_name();
FILE *out, *out_h;
int i;
+ int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
if (!overwrite && is_present(autoconf_name))
return 0;
@@ -1104,11 +1122,13 @@ int conf_write_autoconf(int overwrite)
for_all_symbols(i, sym) {
sym_calc_value(sym);
- if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
+ if (!(sym->flags & SYMBOL_WRITE) && !print_negatives)
+ continue;
+ if (!sym->name)
continue;
/* write symbols to auto.conf and autoconf.h */
- conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
+ conf_write_symbol(out, sym, &kconfig_printer_cb, print_negatives?NULL:(void *)1);
conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
}
fclose(out);
Index: kconfig/symbol.c
===================================================================
--- kconfig.orig/symbol.c
@ -91,3 +23,56 @@ Index: kconfig/symbol.c
case S_STRING:
return str;
case S_UNKNOWN:
Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -720,7 +720,12 @@ static void print_symbol_for_dotconfig(F
static void print_symbol_for_autoconf(FILE *fp, struct symbol *sym)
{
- __print_symbol(fp, sym, OUTPUT_N_NONE, true);
+ int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
+ enum output_n out = OUTPUT_N_NONE;
+ if (print_negatives) {
+ out = OUTPUT_N;
+ }
+ __print_symbol(fp, sym, out, true);
}
void print_symbol_for_listconfig(struct symbol *sym)
@@ -745,6 +750,10 @@ static void print_symbol_for_c(FILE *fp,
case S_TRISTATE:
switch (*val) {
case 'n':
+ if (getenv("KCONFIG_NEGATIVES") != NULL) {
+ val = "0";
+ break;
+ }
return;
case 'm':
sym_suffix = "_MODULE";
@@ -756,6 +765,12 @@ static void print_symbol_for_c(FILE *fp,
case S_HEX:
if (val[0] != '0' || (val[1] != 'x' && val[1] != 'X'))
val_prefix = "0x";
+ /* fall through */
+ case S_INT:
+ if (val[0] == '\0') {
+ val = "0";
+ val_prefix = "";
+ }
break;
case S_STRING:
escaped = escape_string_value(val);
@@ -1106,8 +1121,9 @@ static int __conf_write_autoconf(const c
conf_write_heading(file, comment_style);
+ int print_negatives = getenv("KCONFIG_NEGATIVES") != NULL;
for_all_symbols(i, sym)
- if ((sym->flags & SYMBOL_WRITE) && sym->name)
+ if (((sym->flags & SYMBOL_WRITE) || (print_negatives && sym->type != S_STRING)) && sym->name)
print_symbol(file, sym);
/* check possible errors in conf_write_heading() and print_symbol() */

View File

@ -2,8 +2,8 @@ Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -241,6 +241,13 @@ static const char *conf_get_autoconfig_n
return name ? name : "include/config/auto.conf";
@@ -230,6 +230,13 @@ static const char *conf_get_autoheader_n
return name ? name : "include/generated/autoconf.h";
}
+static const char *conf_get_autobase_name(void)
@ -16,7 +16,7 @@ Index: kconfig/confdata.c
static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
{
char *p2;
@@ -1024,7 +1031,7 @@ static int conf_touch_deps(void)
@@ -1031,7 +1038,7 @@ static int conf_touch_deps(void)
struct symbol *sym;
int res, i;
@ -25,15 +25,3 @@ Index: kconfig/confdata.c
depfile_prefix_len = strlen(depfile_path);
name = conf_get_autoconfig_name();
@@ -1102,7 +1109,10 @@ int conf_write_autoconf(int overwrite)
if (!overwrite && is_present(autoconf_name))
return 0;
- conf_write_dep("include/config/auto.conf.cmd");
+ char autoconfcmd_path[PATH_MAX];
+ snprintf(autoconfcmd_path, sizeof(autoconfcmd_path), "%s%s",
+ conf_get_autobase_name(), "auto.conf.cmd");
+ conf_write_dep(autoconfcmd_path);
if (conf_touch_deps())
return 1;

View File

@ -1,124 +0,0 @@
commit 7b2deddbb0ef350e189fe42c025b07c943aedc4c
Author: Raul E Rangel <rrangel@chromium.org>
Date: Thu Jul 25 15:49:52 2019 -0600
Kconfig: Write tmp files into same directory as target files
This removes the need for COREBOOT_BUILD_DIR in Kconfig. Since the
original files will be replaced with the tmp file, the parent directory
already needs to be writable.
Before this change, the tmp files would be created in the CWD (src) if
COREBOOT_BUILD_DIR was not specified.
BUG=b:112267918
TEST=emerge-grunt coreboot and verified no tmp files were created in the
src directory.
Change-Id: Icdaf2ff3dd1ec98813b75ef55b96e38e1ca19ec7
Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34244
Reviewed-by: Martin Roth <martinroth@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Index: kconfig/confdata.c
===================================================================
--- kconfig.orig/confdata.c
+++ kconfig/confdata.c
@@ -880,6 +880,16 @@ next_menu:
return 0;
}
+
+static int conf_mktemp(const char *path, char *tmpfile)
+{
+ if (snprintf(tmpfile, PATH_MAX, "%s.tmp.XXXXXX", path) >= PATH_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ return mkstemp(tmpfile);
+}
+
int conf_write(const char *name)
{
FILE *out;
@@ -1001,7 +1011,14 @@ static int conf_write_dep(const char *na
struct file *file;
FILE *out;
- out = fopen("..config.tmp", "w");
+ if (make_parent_dir(name))
+ return 1;
+ char filename[PATH_MAX];
+ int fd = conf_mktemp(name, filename);
+ if (fd == -1)
+ return 1;
+
+ out = fdopen(fd, "w");
if (!out)
return 1;
fprintf(out, "deps_config := \\\n");
@@ -1019,9 +1036,7 @@ static int conf_write_dep(const char *na
fprintf(out, "\n$(deps_config): ;\n");
fclose(out);
- if (make_parent_dir(name))
- return 1;
- rename("..config.tmp", name);
+ rename(filename, name);
return 0;
}
@@ -1117,11 +1132,26 @@ int conf_write_autoconf(int overwrite)
if (conf_touch_deps())
return 1;
- out = fopen(".tmpconfig", "w");
+ if (make_parent_dir(autoconf_name))
+ return 1;
+ char filename[PATH_MAX];
+ int fd = conf_mktemp(autoconf_name, filename);
+ if (fd == -1)
+ return 1;
+ out = fdopen(fd, "w");
if (!out)
return 1;
- out_h = fopen(".tmpconfig.h", "w");
+ name = getenv("KCONFIG_AUTOHEADER");
+ if (!name)
+ name = "include/generated/autoconf.h";
+ if (make_parent_dir(name))
+ return 1;
+ char filename_h[PATH_MAX];
+ int fd_h = conf_mktemp(name, filename_h);
+ if (fd_h == -1)
+ return 1;
+ out_h = fdopen(fd_h, "w");
if (!out_h) {
fclose(out);
return 1;
@@ -1144,21 +1174,14 @@ int conf_write_autoconf(int overwrite)
fclose(out);
fclose(out_h);
- name = getenv("KCONFIG_AUTOHEADER");
- if (!name)
- name = "include/generated/autoconf.h";
- if (make_parent_dir(name))
- return 1;
- if (rename(".tmpconfig.h", name))
+ if (rename(filename_h, name))
return 1;
- if (make_parent_dir(autoconf_name))
- return 1;
/*
* This must be the last step, kbuild has a dependency on auto.conf
* and this marks the successful completion of the previous steps.
*/
- if (rename(".tmpconfig", autoconf_name))
+ if (rename(filename, autoconf_name))
return 1;
return 0;

View File

@ -9,5 +9,4 @@
0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch
0010-reenable-source-in-choice.patch
0011-remove-include-config-hardcodes.patch
0012-safer-tmpfiles.patch
0013-util-kconfig-detect-ncurses-on-FreeBSD.patch

View File

@ -872,49 +872,6 @@ struct symbol *sym_find(const char *name)
return symbol;
}
const char *sym_escape_string_value(const char *in)
{
const char *p;
size_t reslen;
char *res;
size_t l;
reslen = strlen(in) + strlen("\"\"") + 1;
p = in;
for (;;) {
l = strcspn(p, "\"\\");
p += l;
if (p[0] == '\0')
break;
reslen++;
p++;
}
res = xmalloc(reslen);
res[0] = '\0';
strcat(res, "\"");
p = in;
for (;;) {
l = strcspn(p, "\"\\");
strncat(res, p, l);
p += l;
if (p[0] == '\0')
break;
strcat(res, "\\");
strncat(res, p++, 1);
}
strcat(res, "\"");
return res;
}
struct sym_match {
struct symbol *sym;
off_t so, eo;