diff options
Diffstat (limited to 'scripts/config/conf.c')
-rw-r--r-- | scripts/config/conf.c | 248 |
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"); +} |