aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/config/conf.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2020-04-12 00:09:52 +0200
committerJo-Philipp Wich <jo@mein.io>2020-04-12 00:10:47 +0200
commit7b1d809a8d8620032553845cf4a8819a19508687 (patch)
treee9c221f4cee621bbbfa2d02ac2870b0d3caaa4a4 /scripts/config/conf.c
parent6c16d64b2a0bb063a89225dcaabd50c00bce7aa2 (diff)
downloadupstream-7b1d809a8d8620032553845cf4a8819a19508687.tar.gz
upstream-7b1d809a8d8620032553845cf4a8819a19508687.tar.bz2
upstream-7b1d809a8d8620032553845cf4a8819a19508687.zip
Revert "build: scripts/config - update to kconfig-v5.6"
This reverts commit dcf3e63a35d05e7e5103819c0f17195bfafe9baa. The kconfig update requires further testing and refinement until it can remain in tree. Main problems are: - Recursive deps are now fatal instead of a warning - Previously legal syntax now leads to hard failures - It fails all package builds since multiple days The updated kconfig implementation needs to cope with the current status quo in the various package feeds before we can reconsider it for master. It is not desirable that single broken packages can hard-fail the entire build pipeline. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'scripts/config/conf.c')
-rw-r--r--scripts/config/conf.c248
1 files changed, 122 insertions, 126 deletions
diff --git a/scripts/config/conf.c b/scripts/config/conf.c
index eacd8ed25e..cf20e0a216 100644
--- a/scripts/config/conf.c
+++ b/scripts/config/conf.c
@@ -1,8 +1,9 @@
-// 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 <locale.h>
#include <ctype.h>
#include <limits.h>
#include <stdio.h>
@@ -19,10 +20,11 @@
static void conf(struct menu *menu);
static void check_conf(struct menu *menu);
+static void xfgets(char *str, int size, FILE *in);
enum input_mode {
oldaskconfig,
- syncconfig,
+ silentoldconfig,
oldconfig,
allnoconfig,
allyesconfig,
@@ -32,15 +34,12 @@ enum input_mode {
defconfig,
savedefconfig,
listnewconfig,
- helpnewconfig,
olddefconfig,
- yes2modconfig,
- mod2yesconfig,
-};
-static enum input_mode input_mode = oldaskconfig;
+} input_mode = oldaskconfig;
static int indent = 1;
static int tty_stdio;
+static int valid_stdin = 1;
static int sync_kconfig;
static int conf_cnt;
static char line[PATH_MAX];
@@ -73,14 +72,14 @@ static void strip(char *str)
*p-- = 0;
}
-/* Helper function to facilitate fgets() by Jean Sacren. */
-static void xfgets(char *str, int size, FILE *in)
+static void check_stdin(void)
{
- if (!fgets(str, size, in))
- fprintf(stderr, "\nError in reading or end of file.\n");
-
- if (!tty_stdio)
- printf("%s", str);
+ if (!valid_stdin) {
+ printf("%s",_("aborted!\n\n"));
+ printf("%s",_("Console input/output is redirected. "));
+ printf("%s",_("Run 'make oldconfig' to update configuration.\n\n"));
+ exit(1);
+ }
}
static int conf_askvalue(struct symbol *sym, const char *def)
@@ -88,12 +87,12 @@ static int conf_askvalue(struct symbol *sym, const char *def)
enum symbol_type type = sym_get_type(sym);
if (!sym_has_value(sym))
- printf("(NEW) ");
+ printf("%s",_("(NEW) "));
line[0] = '\n';
line[1] = 0;
- if (!sym_is_changeable(sym)) {
+ if (!sym_is_changable(sym)) {
printf("%s\n", def);
line[0] = '\n';
line[1] = 0;
@@ -102,15 +101,18 @@ static int conf_askvalue(struct symbol *sym, const char *def)
switch (input_mode) {
case oldconfig:
- case syncconfig:
+ case silentoldconfig:
if (sym_has_value(sym)) {
printf("%s\n", def);
return 0;
}
+ check_stdin();
/* fall through */
case oldaskconfig:
fflush(stdout);
xfgets(line, sizeof(line), stdin);
+ if (!tty_stdio)
+ printf("\n");
return 1;
default:
break;
@@ -135,7 +137,7 @@ static int conf_string(struct menu *menu)
const char *def;
while (1) {
- printf("%*s%s ", indent - 1, "", menu->prompt->text);
+ printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
printf("(%s) ", sym->name);
def = sym_get_string_value(sym);
if (sym_get_string_value(sym))
@@ -168,7 +170,7 @@ static int conf_sym(struct menu *menu)
tristate oldval, newval;
while (1) {
- printf("%*s%s ", indent - 1, "", menu->prompt->text);
+ printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
if (sym->name)
printf("(%s) ", sym->name);
putchar('[');
@@ -190,7 +192,9 @@ static int conf_sym(struct menu *menu)
printf("/m");
if (oldval != yes && sym_tristate_within_range(sym, yes))
printf("/y");
- printf("/?] ");
+ if (menu_has_help(menu))
+ printf("/?");
+ printf("] ");
if (!conf_askvalue(sym, sym_get_string_value(sym)))
return 0;
strip(line);
@@ -237,7 +241,7 @@ static int conf_choice(struct menu *menu)
sym = menu->sym;
is_new = !sym_has_value(sym);
- if (sym_is_changeable(sym)) {
+ if (sym_is_changable(sym)) {
conf_sym(menu);
sym_calc_value(sym);
switch (sym_get_tristate_value(sym)) {
@@ -253,7 +257,7 @@ static int conf_choice(struct menu *menu)
case no:
return 1;
case mod:
- printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+ printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
return 0;
case yes:
break;
@@ -263,7 +267,7 @@ static int conf_choice(struct menu *menu)
while (1) {
int cnt, def;
- printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+ printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
def_sym = sym_get_choice_value(sym);
cnt = def = 0;
line[0] = 0;
@@ -271,7 +275,7 @@ static int conf_choice(struct menu *menu)
if (!menu_is_visible(child))
continue;
if (!child->sym) {
- printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+ printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
continue;
}
cnt++;
@@ -280,27 +284,31 @@ static int conf_choice(struct menu *menu)
printf("%*c", indent, '>');
} else
printf("%*c", indent, ' ');
- printf(" %d. %s", cnt, menu_get_prompt(child));
+ printf(" %d. %s", cnt, _(menu_get_prompt(child)));
if (child->sym->name)
printf(" (%s)", child->sym->name);
if (!sym_has_value(child->sym))
- printf(" (NEW)");
+ printf("%s",_(" (NEW)"));
printf("\n");
}
- printf("%*schoice", indent - 1, "");
+ printf(_("%*schoice"), indent - 1, "");
if (cnt == 1) {
printf("[1]: 1\n");
goto conf_childs;
}
- printf("[1-%d?]: ", cnt);
+ printf("[1-%d", cnt);
+ if (menu_has_help(menu))
+ printf("?");
+ printf("]: ");
switch (input_mode) {
case oldconfig:
- case syncconfig:
+ case silentoldconfig:
if (!is_new) {
cnt = def;
printf("%d\n", cnt);
break;
}
+ check_stdin();
/* fall through */
case oldaskconfig:
fflush(stdout);
@@ -360,11 +368,10 @@ static void conf(struct menu *menu)
switch (prop->type) {
case P_MENU:
- /*
- * Except in oldaskconfig mode, we show only menus that
- * contain new symbols.
- */
- if (input_mode != oldaskconfig && rootEntry != menu) {
+ if ((input_mode == silentoldconfig ||
+ input_mode == listnewconfig ||
+ input_mode == olddefconfig) &&
+ rootEntry != menu) {
check_conf(menu);
return;
}
@@ -374,7 +381,7 @@ static void conf(struct menu *menu)
if (prompt)
printf("%*c\n%*c %s\n%*c\n",
indent, '*',
- indent, '*', prompt,
+ indent, '*', _(prompt),
indent, '*');
default:
;
@@ -421,30 +428,15 @@ static void check_conf(struct menu *menu)
sym = menu->sym;
if (sym && !sym_has_value(sym)) {
- if (sym_is_changeable(sym) ||
+ if (sym_is_changable(sym) ||
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
if (input_mode == 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 && !sym_is_choice_value(sym)) {
+ printf("%s%s\n", CONFIG_, sym->name);
}
- } else if (input_mode == helpnewconfig) {
- printf("-----\n");
- print_help(menu);
- printf("-----\n");
-
- } else {
+ } else if (input_mode != olddefconfig) {
if (!conf_cnt++)
- printf("*\n* Restart config...\n*\n");
+ printf("%s",_("*\n* Restart config...\n*\n"));
rootEntry = menu_get_parent_menu(menu);
conf(rootEntry);
}
@@ -458,8 +450,8 @@ static void check_conf(struct menu *menu)
static struct option long_opts[] = {
{"oldaskconfig", no_argument, NULL, oldaskconfig},
{"oldconfig", no_argument, NULL, oldconfig},
- {"syncconfig", no_argument, NULL, syncconfig},
- {"defconfig", required_argument, NULL, defconfig},
+ {"silentoldconfig", no_argument, NULL, silentoldconfig},
+ {"defconfig", optional_argument, NULL, defconfig},
{"savedefconfig", required_argument, NULL, savedefconfig},
{"allnoconfig", no_argument, NULL, allnoconfig},
{"allyesconfig", no_argument, NULL, allyesconfig},
@@ -467,10 +459,13 @@ static struct option long_opts[] = {
{"alldefconfig", no_argument, NULL, alldefconfig},
{"randconfig", no_argument, NULL, randconfig},
{"listnewconfig", no_argument, NULL, listnewconfig},
- {"helpnewconfig", no_argument, NULL, helpnewconfig},
{"olddefconfig", no_argument, NULL, olddefconfig},
- {"yes2modconfig", no_argument, NULL, yes2modconfig},
- {"mod2yesconfig", no_argument, NULL, mod2yesconfig},
+ /*
+ * oldnoconfig is an alias of olddefconfig, because people already
+ * are dependent on its behavior(sets new symbols to their default
+ * value but not 'n') with the counter-intuitive name.
+ */
+ {"oldnoconfig", no_argument, NULL, olddefconfig},
{NULL, 0, NULL, 0}
};
@@ -480,12 +475,11 @@ static void conf_usage(const char *progname)
printf("Usage: %s [-s] [option] <kconfig-file>\n", progname);
printf("[option] is _one_ of the following:\n");
printf(" --listnewconfig List new options\n");
- printf(" --helpnewconfig List new options and help text\n");
printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
printf(" --oldconfig Update a configuration using a provided .config as base\n");
- printf(" --syncconfig Similar to oldconfig but generates configuration in\n"
- " include/{generated/,config/}\n");
- printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n");
+ printf(" --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n");
+ printf(" --olddefconfig Same as silentoldconfig but sets new symbols to their default value\n");
+ printf(" --oldnoconfig An alias of olddefconfig\n");
printf(" --defconfig <file> New config with default defined in <file>\n");
printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n");
printf(" --allnoconfig New config where all options are answered with no\n");
@@ -493,8 +487,6 @@ static void conf_usage(const char *progname)
printf(" --allmodconfig New config where all options are answered with mod\n");
printf(" --alldefconfig New config with all symbols set to default\n");
printf(" --randconfig New config with random answer to all options\n");
- printf(" --yes2modconfig Change answers from yes to mod if possible\n");
- printf(" --mod2yesconfig Change answers from mod to yes if possible\n");
}
int main(int ac, char **av)
@@ -502,10 +494,14 @@ int main(int ac, char **av)
const char *progname = av[0];
int opt;
const char *name, *defconfig_file = NULL /* gcc uninit */;
+ struct stat tmpstat;
const char *input_file = NULL, *output_file = NULL;
- int no_conf_write = 0;
- tty_stdio = isatty(0) && isatty(1);
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+
+ tty_stdio = isatty(0) && isatty(1) && isatty(2);
while ((opt = getopt_long(ac, av, "r:w:s", long_opts, NULL)) != -1) {
if (opt == 's') {
@@ -513,12 +509,7 @@ int main(int ac, char **av)
continue;
}
switch (opt) {
- case syncconfig:
- /*
- * syncconfig is invoked during the build stage.
- * Suppress distracting "configuration written to ..."
- */
- conf_set_message_callback(NULL);
+ case silentoldconfig:
sync_kconfig = 1;
break;
case defconfig:
@@ -557,10 +548,7 @@ int main(int ac, char **av)
case allmodconfig:
case alldefconfig:
case listnewconfig:
- case helpnewconfig:
case olddefconfig:
- case yes2modconfig:
- case mod2yesconfig:
break;
case 'r':
input_file = optarg;
@@ -576,34 +564,43 @@ int main(int ac, char **av)
input_mode = (enum input_mode)opt;
}
if (ac == optind) {
- fprintf(stderr, "%s: Kconfig file missing\n", av[0]);
+ printf(_("%s: Kconfig file missing\n"), av[0]);
conf_usage(progname);
exit(1);
}
name = av[optind];
conf_parse(name);
//zconfdump(stdout);
+ if (sync_kconfig) {
+ name = conf_get_configname();
+ if (stat(name, &tmpstat)) {
+ fprintf(stderr, _("***\n"
+ "*** Configuration file \"%s\" not found!\n"
+ "***\n"
+ "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+ "*** \"make menuconfig\" or \"make xconfig\").\n"
+ "***\n"), name);
+ exit(1);
+ }
+ }
switch (input_mode) {
case defconfig:
+ if (!defconfig_file)
+ defconfig_file = conf_get_default_confname();
if (conf_read(defconfig_file)) {
- fprintf(stderr,
- "***\n"
- "*** Can't find default configuration \"%s\"!\n"
- "***\n",
- defconfig_file);
+ printf(_("***\n"
+ "*** Can't find default configuration \"%s\"!\n"
+ "***\n"), defconfig_file);
exit(1);
}
break;
case savedefconfig:
- case syncconfig:
+ case silentoldconfig:
case oldaskconfig:
case oldconfig:
case listnewconfig:
- case helpnewconfig:
case olddefconfig:
- case yes2modconfig:
- case mod2yesconfig:
case allnoconfig:
case allyesconfig:
case allmodconfig:
@@ -616,15 +613,15 @@ int main(int ac, char **av)
}
if (sync_kconfig) {
- name = getenv("KCONFIG_NOSILENTUPDATE");
- if (name && *name) {
- if (conf_get_changed()) {
+ if (conf_get_changed()) {
+ name = getenv("KCONFIG_NOSILENTUPDATE");
+ if (name && *name) {
fprintf(stderr,
- "\n*** The configuration requires explicit update.\n\n");
+ _("\n*** The configuration requires explicit update.\n\n"));
return 1;
}
- no_conf_write = 1;
}
+ valid_stdin = tty_stdio;
}
switch (input_mode) {
@@ -649,59 +646,58 @@ int main(int ac, char **av)
break;
case savedefconfig:
break;
- case yes2modconfig:
- conf_rewrite_mod_or_yes(def_y2m);
- break;
- case mod2yesconfig:
- conf_rewrite_mod_or_yes(def_m2y);
- break;
case oldaskconfig:
rootEntry = &rootmenu;
conf(&rootmenu);
- input_mode = oldconfig;
+ input_mode = silentoldconfig;
/* fall through */
case oldconfig:
case listnewconfig:
- case helpnewconfig:
- case syncconfig:
+ case olddefconfig:
+ case silentoldconfig:
/* Update until a loop caused no more changes */
do {
conf_cnt = 0;
check_conf(&rootmenu);
- } while (conf_cnt);
- break;
- case olddefconfig:
- default:
+ } while (conf_cnt &&
+ (input_mode != listnewconfig &&
+ input_mode != olddefconfig));
break;
}
- if (input_mode == savedefconfig) {
+ if (sync_kconfig) {
+ /* silentoldconfig is used during the build so we shall update autoconf.
+ * All other commands are only used to generate a config.
+ */
+ if ((output_file || conf_get_changed()) &&
+ conf_write(output_file)) {
+ fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
+ exit(1);
+ }
+ if (conf_write_autoconf()) {
+ fprintf(stderr, _("\n*** Error during update of the configuration.\n\n"));
+ return 1;
+ }
+ } else if (input_mode == savedefconfig) {
if (conf_write_defconfig(defconfig_file)) {
- fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n",
+ fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
defconfig_file);
return 1;
}
- } else if (input_mode != listnewconfig && input_mode != helpnewconfig) {
- if ((output_file || !no_conf_write) &&
- conf_write(output_file)) {
- fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
+ } else if (input_mode != listnewconfig) {
+ if (conf_write(output_file)) {
+ fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
exit(1);
}
-
- /*
- * Create auto.conf if it does not exist.
- * This prevents GNU Make 4.1 or older from emitting
- * "include/config/auto.conf: No such file or directory"
- * in the top-level Makefile
- *
- * syncconfig always creates or updates auto.conf because it is
- * used during the build.
- */
- if (conf_write_autoconf(sync_kconfig) && sync_kconfig) {
- fprintf(stderr,
- "\n*** Error during sync of the configuration.\n\n");
- return 1;
- }
}
return 0;
}
+
+/*
+ * Helper function to facilitate fgets() by Jean Sacren.
+ */
+void xfgets(char *str, int size, FILE *in)
+{
+ if (fgets(str, size, in) == NULL)
+ fprintf(stderr, "\nError in reading or end of file.\n");
+}