diff options
author | Chris Packham <judge.packham@gmail.com> | 2020-12-09 22:13:29 +1300 |
---|---|---|
committer | Chris Packham <judge.packham@gmail.com> | 2021-02-02 20:06:32 +1300 |
commit | 21095fab6712d3a082936b14b93cb6ff29c02872 (patch) | |
tree | 287fba5c166e21ee2e2d8183a1a189f708b86858 /kconfig/confdata.c | |
parent | b16baed494d3c3fb66eeaaf9d8c1dbc7c6c0479f (diff) | |
download | crosstool-ng-21095fab6712d3a082936b14b93cb6ff29c02872.tar.gz crosstool-ng-21095fab6712d3a082936b14b93cb6ff29c02872.tar.bz2 crosstool-ng-21095fab6712d3a082936b14b93cb6ff29c02872.zip |
kconfig: Sync with upstream v5.0
This commit introduces the following upstream changes:
2648ca1859bb kconfig: clean generated *conf-cfg files
d86271af6460 kconfig: rename generated .*conf-cfg to *conf-cfg
ba97df45581f kbuild: use assignment instead of define ... endef for filechk_* rules
a5003571e627 kconfig: remove unused "file" field of yylval union
f222b7f43661 kconfig: surround dbg_sym_flags with #ifdef DEBUG to fix gconf warning
3b541978562a kconfig: split images.c out of qconf.cc/gconf.c to fix gconf warnings
9abe42371b44 kconfig: add static qualifiers to fix gconf warnings
cbafbf7f551c kconfig: split the lexer out of zconf.y
558e78e3ce84 kconfig: split some C files out of zconf.y
0c874100108f kconfig: convert to SPDX License Identifier
979f2b2f7936 kconfig: remove keyword lookup table entirely
4b31a32caf0a kconfig: update current_pos in the second lexer
824fa3b3b5e3 kconfig: switch to ASSIGN_VAL state in the second lexer
b3d1d9d3c362 kconfig: stop associating kconf_id with yylval
caaebb3c6de3 kconfig: refactor end token rules
f5451582c4e2 kconfig: stop supporting '.' and '/' in unquoted words
171a515d0803 kconfig: use T_WORD instead of T_VARIABLE for variables
c3d228713b10 kconfig: use specific tokens instead of T_ASSIGN for assignments
ce2164ab5831 kconfig: refactor scanning and parsing "option" properties
3c8f317d4cf1 kconfig: use distinct tokens for type and default properties
a01e5d242d93 kconfig: remove redundant token defines
4b5ec81bfeda kconfig: rename depends_list to comment_option_list
1f31be9ec0a9 kconfig: loosen the order of "visible" and "depends on" in menu entry
94d4e1b6021b kconfig: remove redundant menu_block rule
4891796c6f83 kconfig: remove redundant if_block rule
2f60e46e605a kconfig: remove grammatically ambiguous option_error
6900ae9eeee3 kconfig: remove grammatically ambiguous "unexpected option" diagnostic
723679339d08 kconfig: warn no new line at end of file
0bcc547ec4b0 kconfig: clean up EOF handling in the lexer
cc66bca775ee kconfig: fix ambiguous grammar in terms of new lines
21c5ecf60472 kconfig: refactor pattern matching in STRING state
be3c8075978a kconfig: remove unneeded pattern matching to whitespaces
413cd19d81fd kconfig: require T_EOL to reduce visible statement
fbac5977d81c kconfig: fix memory leak when EOF is encountered in quotation
77c1c0fa8b14 kconfig: fix file name and line number of warn_ignored_character()
0cbe3ac439bf kconfig: remove k_invalid from expr_parse_string() return type
2aabbed6774f kconfig: remove S_OTHER symbol type and correct dependency tracking
1508fec82e39 kconfig: split out code touching a file to conf_touch_dep()
0849d212e395 kconfig: rename conf_split_config() to conf_touch_deps()
75889e9be78f kconfig: remove unneeded setsym label in conf_read_simple()
a9b722847872 scripts/kconfig/merge_config: don't redefine 'y' to 'm'
Signed-off-by: Chris Packham <judge.packham@gmail.com>
Diffstat (limited to 'kconfig/confdata.c')
-rw-r--r-- | kconfig/confdata.c | 136 |
1 files changed, 69 insertions, 67 deletions
diff --git a/kconfig/confdata.c b/kconfig/confdata.c index 91d0a5c0..08ba146a 100644 --- a/kconfig/confdata.c +++ b/kconfig/confdata.c @@ -1,12 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> - * Released under the terms of the GNU GPL v2.0. */ #include <sys/stat.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> +#include <limits.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> @@ -74,6 +75,47 @@ static int make_parent_dir(const char *path) return 0; } +static char depfile_path[PATH_MAX]; +static size_t depfile_prefix_len; + +/* touch depfile for symbol 'name' */ +static int conf_touch_dep(const char *name) +{ + int fd, ret; + const char *s; + char *d, c; + + /* check overflow: prefix + name + ".h" + '\0' must fit in buffer. */ + if (depfile_prefix_len + strlen(name) + 3 > sizeof(depfile_path)) + return -1; + + d = depfile_path + depfile_prefix_len; + s = name; + + while ((c = *s++)) + *d++ = (c == '_') ? '/' : tolower(c); + strcpy(d, ".h"); + + /* 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 *); @@ -186,14 +228,6 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) conf_warning("symbol value '%s' invalid for %s", p, sym->name); return 1; - case S_OTHER: - if (*p != '"') { - for (p2 = p; *p2 && !isspace(*p2); p2++) - ; - sym->type = S_STRING; - goto done; - } - /* fall through */ case S_STRING: if (*p++ != '"') break; @@ -212,7 +246,6 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) /* fall through */ case S_INT: case S_HEX: - done: if (sym_string_valid(sym, p)) { sym->def[def].val = xstrdup(p); sym->flags |= def_flags; @@ -363,7 +396,7 @@ load: sym = sym_find(line + 2 + strlen(CONFIG_)); if (!sym) { sym_add_change_count(1); - goto setsym; + continue; } } else { sym = sym_lookup(line + 2 + strlen(CONFIG_), 0); @@ -393,17 +426,22 @@ load: if (*p2 == '\r') *p2 = 0; } - if (def == S_DEF_USER) { - sym = sym_find(line + strlen(CONFIG_)); - if (!sym) { + + sym = sym_find(line + strlen(CONFIG_)); + if (!sym) { + if (def == S_DEF_AUTO) + /* + * Reading from include/config/auto.conf + * If CONFIG_FOO previously existed in + * auto.conf but it is missing now, + * include/config/foo.h must be touched. + */ + conf_touch_dep(line + strlen(CONFIG_)); + else sym_add_change_count(1); - goto setsym; - } - } else { - sym = sym_lookup(line + strlen(CONFIG_), 0); - if (sym->type == S_UNKNOWN) - sym->type = S_OTHER; + continue; } + if (sym->flags & def_flags) { conf_warning("override: reassigning to symbol %s", sym->name); } @@ -416,7 +454,7 @@ load: continue; } -setsym: + if (sym && sym_is_choice_value(sym)) { struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); switch (sym->def[def].tri) { @@ -669,7 +707,6 @@ static void conf_write_symbol(FILE *fp, struct symbol *sym, const char *str; switch (sym->type) { - case S_OTHER: case S_UNKNOWN: break; case S_STRING: @@ -906,24 +943,19 @@ static int conf_write_dep(const char *name) return 0; } -static int conf_split_config(void) +static int conf_touch_deps(void) { const char *name; - char path[PATH_MAX+1]; - char *s, *d, c; struct symbol *sym; - int res, i, fd; + int res, i; + + strcpy(depfile_path, "include/config/"); + depfile_prefix_len = strlen(depfile_path); name = conf_get_autoconfig_name(); conf_read_simple(name, S_DEF_AUTO); sym_calc_value(modules_sym); - if (make_parent_dir("include/config/foo.h")) - return 1; - if (chdir("include/config")) - return 1; - - res = 0; for_all_symbols(i, sym) { sym_calc_value(sym); if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name) @@ -975,42 +1007,12 @@ static int conf_split_config(void) * different from 'no'). */ - /* Replace all '_' and append ".h" */ - s = sym->name; - d = path; - while ((c = *s++)) { - c = tolower(c); - *d++ = (c == '_') ? '/' : c; - } - strcpy(d, ".h"); - - /* Assume directory path already exists. */ - fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd == -1) { - if (errno != ENOENT) { - res = 1; - break; - } - - if (make_parent_dir(path)) { - res = 1; - goto out; - } - - /* Try it again. */ - fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd == -1) { - res = 1; - break; - } - } - close(fd); + res = conf_touch_dep(sym->name); + if (res) + return res; } -out: - if (chdir("../..")) - return 1; - return res; + return 0; } int conf_write_autoconf(int overwrite) @@ -1028,7 +1030,7 @@ int conf_write_autoconf(int overwrite) conf_write_dep("include/config/auto.conf.cmd"); - if (conf_split_config()) + if (conf_touch_deps()) return 1; out = fopen(".tmpconfig", "w"); |