10c874100SMasahiro Yamada // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
41da177e4SLinus Torvalds */
51da177e4SLinus Torvalds
61da177e4SLinus Torvalds #include <ctype.h>
774dba809SMarkus Mayer #include <limits.h>
89dfb563bSRandy Dunlap #include <stdio.h>
975ff4309SLadislav Michl #include <stdlib.h>
101da177e4SLinus Torvalds #include <string.h>
111da177e4SLinus Torvalds #include <time.h>
1275ff4309SLadislav Michl #include <unistd.h>
134062f1a4SSam Ravnborg #include <getopt.h>
14b0fe5510SIngo Molnar #include <sys/time.h>
150d8024c6SYann E. MORIN #include <errno.h>
161da177e4SLinus Torvalds
171da177e4SLinus Torvalds #include "lkc.h"
181da177e4SLinus Torvalds
191da177e4SLinus Torvalds static void conf(struct menu *menu);
201da177e4SLinus Torvalds static void check_conf(struct menu *menu);
211da177e4SLinus Torvalds
224062f1a4SSam Ravnborg enum input_mode {
234062f1a4SSam Ravnborg oldaskconfig,
24911a91c3SMasahiro Yamada syncconfig,
254062f1a4SSam Ravnborg oldconfig,
264062f1a4SSam Ravnborg allnoconfig,
274062f1a4SSam Ravnborg allyesconfig,
284062f1a4SSam Ravnborg allmodconfig,
290748cb3eSSam Ravnborg alldefconfig,
304062f1a4SSam Ravnborg randconfig,
314062f1a4SSam Ravnborg defconfig,
327cf3d73bSSam Ravnborg savedefconfig,
33861b4ea4SSam Ravnborg listnewconfig,
345d8b42aaSLaura Abbott helpnewconfig,
35fb16d891SAdam Lee olddefconfig,
3689b90609STetsuo Handa yes2modconfig,
3789b90609STetsuo Handa mod2yesconfig,
38c39afe62SJosh Triplett mod2noconfig,
3952e58a3cSMasahiro Yamada };
4052e58a3cSMasahiro Yamada static enum input_mode input_mode = oldaskconfig;
41ed562c53SMasahiro Yamada static int input_mode_opt;
421da177e4SLinus Torvalds static int indent = 1;
4362dc9899SBen Hutchings static int tty_stdio;
44204c96f6Szippel@linux-m68k.org static int sync_kconfig;
451da177e4SLinus Torvalds static int conf_cnt;
4674dba809SMarkus Mayer static char line[PATH_MAX];
471da177e4SLinus Torvalds static struct menu *rootEntry;
481da177e4SLinus Torvalds
print_help(struct menu * menu)4966c4bd80SCheng Renquan static void print_help(struct menu *menu)
5003d29122SSam Ravnborg {
5166c4bd80SCheng Renquan struct gstr help = str_new();
5266c4bd80SCheng Renquan
5366c4bd80SCheng Renquan menu_get_ext_help(menu, &help);
5466c4bd80SCheng Renquan
5566c4bd80SCheng Renquan printf("\n%s\n", str_get(&help));
5666c4bd80SCheng Renquan str_free(&help);
5703d29122SSam Ravnborg }
5803d29122SSam Ravnborg
strip(char * str)5948b9d03cSJ.A. Magallon static void strip(char *str)
601da177e4SLinus Torvalds {
6148b9d03cSJ.A. Magallon char *p = str;
621da177e4SLinus Torvalds int l;
631da177e4SLinus Torvalds
641da177e4SLinus Torvalds while ((isspace(*p)))
651da177e4SLinus Torvalds p++;
661da177e4SLinus Torvalds l = strlen(p);
671da177e4SLinus Torvalds if (p != str)
681da177e4SLinus Torvalds memmove(str, p, l + 1);
691da177e4SLinus Torvalds if (!l)
701da177e4SLinus Torvalds return;
711da177e4SLinus Torvalds p = str + l - 1;
721da177e4SLinus Torvalds while ((isspace(*p)))
731da177e4SLinus Torvalds *p-- = 0;
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds
765a3dc717SMasahiro Yamada /* Helper function to facilitate fgets() by Jean Sacren. */
xfgets(char * str,int size,FILE * in)775a3dc717SMasahiro Yamada static void xfgets(char *str, int size, FILE *in)
785a3dc717SMasahiro Yamada {
795a3dc717SMasahiro Yamada if (!fgets(str, size, in))
805a3dc717SMasahiro Yamada fprintf(stderr, "\nError in reading or end of file.\n");
81f3ff6fb5SMasahiro Yamada
82f3ff6fb5SMasahiro Yamada if (!tty_stdio)
83f3ff6fb5SMasahiro Yamada printf("%s", str);
845a3dc717SMasahiro Yamada }
855a3dc717SMasahiro Yamada
set_randconfig_seed(void)8689145649SMasahiro Yamada static void set_randconfig_seed(void)
8789145649SMasahiro Yamada {
8889145649SMasahiro Yamada unsigned int seed;
8989145649SMasahiro Yamada char *env;
9089145649SMasahiro Yamada bool seed_set = false;
9189145649SMasahiro Yamada
9289145649SMasahiro Yamada env = getenv("KCONFIG_SEED");
9389145649SMasahiro Yamada if (env && *env) {
9489145649SMasahiro Yamada char *endp;
9589145649SMasahiro Yamada
9689145649SMasahiro Yamada seed = strtol(env, &endp, 0);
9789145649SMasahiro Yamada if (*endp == '\0')
9889145649SMasahiro Yamada seed_set = true;
9989145649SMasahiro Yamada }
10089145649SMasahiro Yamada
10189145649SMasahiro Yamada if (!seed_set) {
10289145649SMasahiro Yamada struct timeval now;
10389145649SMasahiro Yamada
10489145649SMasahiro Yamada /*
10589145649SMasahiro Yamada * Use microseconds derived seed, compensate for systems where it may
10689145649SMasahiro Yamada * be zero.
10789145649SMasahiro Yamada */
10889145649SMasahiro Yamada gettimeofday(&now, NULL);
10989145649SMasahiro Yamada seed = (now.tv_sec + 1) * (now.tv_usec + 1);
11089145649SMasahiro Yamada }
11189145649SMasahiro Yamada
11289145649SMasahiro Yamada printf("KCONFIG_SEED=0x%X\n", seed);
11389145649SMasahiro Yamada srand(seed);
11489145649SMasahiro Yamada }
11589145649SMasahiro Yamada
randomize_choice_values(struct symbol * csym)11698f8475cSMasahiro Yamada static bool randomize_choice_values(struct symbol *csym)
11798f8475cSMasahiro Yamada {
11898f8475cSMasahiro Yamada struct property *prop;
11998f8475cSMasahiro Yamada struct symbol *sym;
12098f8475cSMasahiro Yamada struct expr *e;
12198f8475cSMasahiro Yamada int cnt, def;
12298f8475cSMasahiro Yamada
12398f8475cSMasahiro Yamada /*
12498f8475cSMasahiro Yamada * If choice is mod then we may have more items selected
12598f8475cSMasahiro Yamada * and if no then no-one.
12698f8475cSMasahiro Yamada * In both cases stop.
12798f8475cSMasahiro Yamada */
12898f8475cSMasahiro Yamada if (csym->curr.tri != yes)
12998f8475cSMasahiro Yamada return false;
13098f8475cSMasahiro Yamada
13198f8475cSMasahiro Yamada prop = sym_get_choice_prop(csym);
13298f8475cSMasahiro Yamada
13398f8475cSMasahiro Yamada /* count entries in choice block */
13498f8475cSMasahiro Yamada cnt = 0;
13598f8475cSMasahiro Yamada expr_list_for_each_sym(prop->expr, e, sym)
13698f8475cSMasahiro Yamada cnt++;
13798f8475cSMasahiro Yamada
13898f8475cSMasahiro Yamada /*
13998f8475cSMasahiro Yamada * find a random value and set it to yes,
14098f8475cSMasahiro Yamada * set the rest to no so we have only one set
14198f8475cSMasahiro Yamada */
14298f8475cSMasahiro Yamada def = rand() % cnt;
14398f8475cSMasahiro Yamada
14498f8475cSMasahiro Yamada cnt = 0;
14598f8475cSMasahiro Yamada expr_list_for_each_sym(prop->expr, e, sym) {
14698f8475cSMasahiro Yamada if (def == cnt++) {
14798f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = yes;
14898f8475cSMasahiro Yamada csym->def[S_DEF_USER].val = sym;
14998f8475cSMasahiro Yamada } else {
15098f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = no;
15198f8475cSMasahiro Yamada }
15298f8475cSMasahiro Yamada sym->flags |= SYMBOL_DEF_USER;
15398f8475cSMasahiro Yamada /* clear VALID to get value calculated */
15498f8475cSMasahiro Yamada sym->flags &= ~SYMBOL_VALID;
15598f8475cSMasahiro Yamada }
15698f8475cSMasahiro Yamada csym->flags |= SYMBOL_DEF_USER;
15798f8475cSMasahiro Yamada /* clear VALID to get value calculated */
15898f8475cSMasahiro Yamada csym->flags &= ~SYMBOL_VALID;
15998f8475cSMasahiro Yamada
16098f8475cSMasahiro Yamada return true;
16198f8475cSMasahiro Yamada }
16298f8475cSMasahiro Yamada
16398f8475cSMasahiro Yamada enum conf_def_mode {
16498f8475cSMasahiro Yamada def_default,
16598f8475cSMasahiro Yamada def_yes,
16698f8475cSMasahiro Yamada def_mod,
16798f8475cSMasahiro Yamada def_no,
16898f8475cSMasahiro Yamada def_random
16998f8475cSMasahiro Yamada };
17098f8475cSMasahiro Yamada
conf_set_all_new_symbols(enum conf_def_mode mode)17198f8475cSMasahiro Yamada static bool conf_set_all_new_symbols(enum conf_def_mode mode)
17298f8475cSMasahiro Yamada {
17398f8475cSMasahiro Yamada struct symbol *sym, *csym;
17498f8475cSMasahiro Yamada int i, cnt;
17598f8475cSMasahiro Yamada /*
17698f8475cSMasahiro Yamada * can't go as the default in switch-case below, otherwise gcc whines
17798f8475cSMasahiro Yamada * about -Wmaybe-uninitialized
17898f8475cSMasahiro Yamada */
17998f8475cSMasahiro Yamada int pby = 50; /* probability of bool = y */
18098f8475cSMasahiro Yamada int pty = 33; /* probability of tristate = y */
18198f8475cSMasahiro Yamada int ptm = 33; /* probability of tristate = m */
18298f8475cSMasahiro Yamada bool has_changed = false;
18398f8475cSMasahiro Yamada
18498f8475cSMasahiro Yamada if (mode == def_random) {
18598f8475cSMasahiro Yamada int n, p[3];
18698f8475cSMasahiro Yamada char *env = getenv("KCONFIG_PROBABILITY");
18798f8475cSMasahiro Yamada
18898f8475cSMasahiro Yamada n = 0;
18998f8475cSMasahiro Yamada while (env && *env) {
19098f8475cSMasahiro Yamada char *endp;
19198f8475cSMasahiro Yamada int tmp = strtol(env, &endp, 10);
19298f8475cSMasahiro Yamada
19398f8475cSMasahiro Yamada if (tmp >= 0 && tmp <= 100) {
19498f8475cSMasahiro Yamada p[n++] = tmp;
19598f8475cSMasahiro Yamada } else {
19698f8475cSMasahiro Yamada errno = ERANGE;
19798f8475cSMasahiro Yamada perror("KCONFIG_PROBABILITY");
19898f8475cSMasahiro Yamada exit(1);
19998f8475cSMasahiro Yamada }
20098f8475cSMasahiro Yamada env = (*endp == ':') ? endp + 1 : endp;
20198f8475cSMasahiro Yamada if (n >= 3)
20298f8475cSMasahiro Yamada break;
20398f8475cSMasahiro Yamada }
20498f8475cSMasahiro Yamada switch (n) {
20598f8475cSMasahiro Yamada case 1:
20698f8475cSMasahiro Yamada pby = p[0];
20798f8475cSMasahiro Yamada ptm = pby / 2;
20898f8475cSMasahiro Yamada pty = pby - ptm;
20998f8475cSMasahiro Yamada break;
21098f8475cSMasahiro Yamada case 2:
21198f8475cSMasahiro Yamada pty = p[0];
21298f8475cSMasahiro Yamada ptm = p[1];
21398f8475cSMasahiro Yamada pby = pty + ptm;
21498f8475cSMasahiro Yamada break;
21598f8475cSMasahiro Yamada case 3:
21698f8475cSMasahiro Yamada pby = p[0];
21798f8475cSMasahiro Yamada pty = p[1];
21898f8475cSMasahiro Yamada ptm = p[2];
21998f8475cSMasahiro Yamada break;
22098f8475cSMasahiro Yamada }
22198f8475cSMasahiro Yamada
22298f8475cSMasahiro Yamada if (pty + ptm > 100) {
22398f8475cSMasahiro Yamada errno = ERANGE;
22498f8475cSMasahiro Yamada perror("KCONFIG_PROBABILITY");
22598f8475cSMasahiro Yamada exit(1);
22698f8475cSMasahiro Yamada }
22798f8475cSMasahiro Yamada }
22898f8475cSMasahiro Yamada
22998f8475cSMasahiro Yamada for_all_symbols(i, sym) {
23098f8475cSMasahiro Yamada if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
23198f8475cSMasahiro Yamada continue;
23298f8475cSMasahiro Yamada switch (sym_get_type(sym)) {
23398f8475cSMasahiro Yamada case S_BOOLEAN:
23498f8475cSMasahiro Yamada case S_TRISTATE:
23598f8475cSMasahiro Yamada has_changed = true;
23698f8475cSMasahiro Yamada switch (mode) {
23798f8475cSMasahiro Yamada case def_yes:
23898f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = yes;
23998f8475cSMasahiro Yamada break;
24098f8475cSMasahiro Yamada case def_mod:
24198f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = mod;
24298f8475cSMasahiro Yamada break;
24398f8475cSMasahiro Yamada case def_no:
24498f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = no;
24598f8475cSMasahiro Yamada break;
24698f8475cSMasahiro Yamada case def_random:
24798f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = no;
24898f8475cSMasahiro Yamada cnt = rand() % 100;
24998f8475cSMasahiro Yamada if (sym->type == S_TRISTATE) {
25098f8475cSMasahiro Yamada if (cnt < pty)
25198f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = yes;
25298f8475cSMasahiro Yamada else if (cnt < pty + ptm)
25398f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = mod;
25498f8475cSMasahiro Yamada } else if (cnt < pby)
25598f8475cSMasahiro Yamada sym->def[S_DEF_USER].tri = yes;
25698f8475cSMasahiro Yamada break;
25798f8475cSMasahiro Yamada default:
25898f8475cSMasahiro Yamada continue;
25998f8475cSMasahiro Yamada }
26098f8475cSMasahiro Yamada if (!(sym_is_choice(sym) && mode == def_random))
26198f8475cSMasahiro Yamada sym->flags |= SYMBOL_DEF_USER;
26298f8475cSMasahiro Yamada break;
26398f8475cSMasahiro Yamada default:
26498f8475cSMasahiro Yamada break;
26598f8475cSMasahiro Yamada }
26698f8475cSMasahiro Yamada
26798f8475cSMasahiro Yamada }
26898f8475cSMasahiro Yamada
26998f8475cSMasahiro Yamada sym_clear_all_valid();
27098f8475cSMasahiro Yamada
27198f8475cSMasahiro Yamada /*
27298f8475cSMasahiro Yamada * We have different type of choice blocks.
27398f8475cSMasahiro Yamada * If curr.tri equals to mod then we can select several
27498f8475cSMasahiro Yamada * choice symbols in one block.
27598f8475cSMasahiro Yamada * In this case we do nothing.
27698f8475cSMasahiro Yamada * If curr.tri equals yes then only one symbol can be
27798f8475cSMasahiro Yamada * selected in a choice block and we set it to yes,
27898f8475cSMasahiro Yamada * and the rest to no.
27998f8475cSMasahiro Yamada */
28098f8475cSMasahiro Yamada if (mode != def_random) {
28198f8475cSMasahiro Yamada for_all_symbols(i, csym) {
28298f8475cSMasahiro Yamada if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
28398f8475cSMasahiro Yamada sym_is_choice_value(csym))
28498f8475cSMasahiro Yamada csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
28598f8475cSMasahiro Yamada }
28698f8475cSMasahiro Yamada }
28798f8475cSMasahiro Yamada
28898f8475cSMasahiro Yamada for_all_symbols(i, csym) {
28998f8475cSMasahiro Yamada if (sym_has_value(csym) || !sym_is_choice(csym))
29098f8475cSMasahiro Yamada continue;
29198f8475cSMasahiro Yamada
29298f8475cSMasahiro Yamada sym_calc_value(csym);
29398f8475cSMasahiro Yamada if (mode == def_random)
29498f8475cSMasahiro Yamada has_changed |= randomize_choice_values(csym);
29598f8475cSMasahiro Yamada else {
29698f8475cSMasahiro Yamada set_all_choice_values(csym);
29798f8475cSMasahiro Yamada has_changed = true;
29898f8475cSMasahiro Yamada }
29998f8475cSMasahiro Yamada }
30098f8475cSMasahiro Yamada
30198f8475cSMasahiro Yamada return has_changed;
30298f8475cSMasahiro Yamada }
30398f8475cSMasahiro Yamada
conf_rewrite_tristates(tristate old_val,tristate new_val)304c39afe62SJosh Triplett static void conf_rewrite_tristates(tristate old_val, tristate new_val)
30515e68d09SMasahiro Yamada {
30615e68d09SMasahiro Yamada struct symbol *sym;
30715e68d09SMasahiro Yamada int i;
30815e68d09SMasahiro Yamada
30915e68d09SMasahiro Yamada for_all_symbols(i, sym) {
31015e68d09SMasahiro Yamada if (sym_get_type(sym) == S_TRISTATE &&
31115e68d09SMasahiro Yamada sym->def[S_DEF_USER].tri == old_val)
31215e68d09SMasahiro Yamada sym->def[S_DEF_USER].tri = new_val;
31315e68d09SMasahiro Yamada }
31415e68d09SMasahiro Yamada sym_clear_all_valid();
31515e68d09SMasahiro Yamada }
31615e68d09SMasahiro Yamada
conf_askvalue(struct symbol * sym,const char * def)317f82f3f94SRoman Zippel static int conf_askvalue(struct symbol *sym, const char *def)
3181da177e4SLinus Torvalds {
3191da177e4SLinus Torvalds if (!sym_has_value(sym))
320694c49a7SSam Ravnborg printf("(NEW) ");
3211da177e4SLinus Torvalds
3221da177e4SLinus Torvalds line[0] = '\n';
3231da177e4SLinus Torvalds line[1] = 0;
3241da177e4SLinus Torvalds
325baa23ec8SMarco Ammon if (!sym_is_changeable(sym)) {
3261da177e4SLinus Torvalds printf("%s\n", def);
3271da177e4SLinus Torvalds line[0] = '\n';
3281da177e4SLinus Torvalds line[1] = 0;
329f82f3f94SRoman Zippel return 0;
3301da177e4SLinus Torvalds }
3311da177e4SLinus Torvalds
3321da177e4SLinus Torvalds switch (input_mode) {
3334062f1a4SSam Ravnborg case oldconfig:
334911a91c3SMasahiro Yamada case syncconfig:
3351da177e4SLinus Torvalds if (sym_has_value(sym)) {
3361da177e4SLinus Torvalds printf("%s\n", def);
337f82f3f94SRoman Zippel return 0;
3381da177e4SLinus Torvalds }
339d8fc3200SArnaud Lacombe /* fall through */
340102a1a72SMasahiro Yamada default:
3411da177e4SLinus Torvalds fflush(stdout);
34274dba809SMarkus Mayer xfgets(line, sizeof(line), stdin);
3431da177e4SLinus Torvalds break;
3441da177e4SLinus Torvalds }
3451da177e4SLinus Torvalds
346f82f3f94SRoman Zippel return 1;
3471da177e4SLinus Torvalds }
3481da177e4SLinus Torvalds
conf_string(struct menu * menu)3494356f489STrevor Keith static int conf_string(struct menu *menu)
3501da177e4SLinus Torvalds {
3511da177e4SLinus Torvalds struct symbol *sym = menu->sym;
35203d29122SSam Ravnborg const char *def;
3531da177e4SLinus Torvalds
3541da177e4SLinus Torvalds while (1) {
355694c49a7SSam Ravnborg printf("%*s%s ", indent - 1, "", menu->prompt->text);
3561da177e4SLinus Torvalds printf("(%s) ", sym->name);
3571da177e4SLinus Torvalds def = sym_get_string_value(sym);
358f82bd80dSMickaël Salaün if (def)
3591da177e4SLinus Torvalds printf("[%s] ", def);
360f82f3f94SRoman Zippel if (!conf_askvalue(sym, def))
361f82f3f94SRoman Zippel return 0;
3621da177e4SLinus Torvalds switch (line[0]) {
3631da177e4SLinus Torvalds case '\n':
3641da177e4SLinus Torvalds break;
3651da177e4SLinus Torvalds case '?':
3661da177e4SLinus Torvalds /* print help */
3671da177e4SLinus Torvalds if (line[1] == '\n') {
36866c4bd80SCheng Renquan print_help(menu);
3691da177e4SLinus Torvalds def = NULL;
3701da177e4SLinus Torvalds break;
3711da177e4SLinus Torvalds }
372d8fc3200SArnaud Lacombe /* fall through */
3731da177e4SLinus Torvalds default:
3741da177e4SLinus Torvalds line[strlen(line)-1] = 0;
3751da177e4SLinus Torvalds def = line;
3761da177e4SLinus Torvalds }
3771da177e4SLinus Torvalds if (def && sym_set_string_value(sym, def))
3781da177e4SLinus Torvalds return 0;
3791da177e4SLinus Torvalds }
3801da177e4SLinus Torvalds }
3811da177e4SLinus Torvalds
conf_sym(struct menu * menu)3821da177e4SLinus Torvalds static int conf_sym(struct menu *menu)
3831da177e4SLinus Torvalds {
3841da177e4SLinus Torvalds struct symbol *sym = menu->sym;
3851da177e4SLinus Torvalds tristate oldval, newval;
3861da177e4SLinus Torvalds
3871da177e4SLinus Torvalds while (1) {
388694c49a7SSam Ravnborg printf("%*s%s ", indent - 1, "", menu->prompt->text);
3891da177e4SLinus Torvalds if (sym->name)
3901da177e4SLinus Torvalds printf("(%s) ", sym->name);
3911da177e4SLinus Torvalds putchar('[');
3921da177e4SLinus Torvalds oldval = sym_get_tristate_value(sym);
3931da177e4SLinus Torvalds switch (oldval) {
3941da177e4SLinus Torvalds case no:
3951da177e4SLinus Torvalds putchar('N');
3961da177e4SLinus Torvalds break;
3971da177e4SLinus Torvalds case mod:
3981da177e4SLinus Torvalds putchar('M');
3991da177e4SLinus Torvalds break;
4001da177e4SLinus Torvalds case yes:
4011da177e4SLinus Torvalds putchar('Y');
4021da177e4SLinus Torvalds break;
4031da177e4SLinus Torvalds }
4041da177e4SLinus Torvalds if (oldval != no && sym_tristate_within_range(sym, no))
4051da177e4SLinus Torvalds printf("/n");
4061da177e4SLinus Torvalds if (oldval != mod && sym_tristate_within_range(sym, mod))
4071da177e4SLinus Torvalds printf("/m");
4081da177e4SLinus Torvalds if (oldval != yes && sym_tristate_within_range(sym, yes))
4091da177e4SLinus Torvalds printf("/y");
4104f208f39SMasahiro Yamada printf("/?] ");
411f82f3f94SRoman Zippel if (!conf_askvalue(sym, sym_get_string_value(sym)))
412f82f3f94SRoman Zippel return 0;
4131da177e4SLinus Torvalds strip(line);
4141da177e4SLinus Torvalds
4151da177e4SLinus Torvalds switch (line[0]) {
4161da177e4SLinus Torvalds case 'n':
4171da177e4SLinus Torvalds case 'N':
4181da177e4SLinus Torvalds newval = no;
4191da177e4SLinus Torvalds if (!line[1] || !strcmp(&line[1], "o"))
4201da177e4SLinus Torvalds break;
4211da177e4SLinus Torvalds continue;
4221da177e4SLinus Torvalds case 'm':
4231da177e4SLinus Torvalds case 'M':
4241da177e4SLinus Torvalds newval = mod;
4251da177e4SLinus Torvalds if (!line[1])
4261da177e4SLinus Torvalds break;
4271da177e4SLinus Torvalds continue;
4281da177e4SLinus Torvalds case 'y':
4291da177e4SLinus Torvalds case 'Y':
4301da177e4SLinus Torvalds newval = yes;
4311da177e4SLinus Torvalds if (!line[1] || !strcmp(&line[1], "es"))
4321da177e4SLinus Torvalds break;
4331da177e4SLinus Torvalds continue;
4341da177e4SLinus Torvalds case 0:
4351da177e4SLinus Torvalds newval = oldval;
4361da177e4SLinus Torvalds break;
4371da177e4SLinus Torvalds case '?':
4381da177e4SLinus Torvalds goto help;
4391da177e4SLinus Torvalds default:
4401da177e4SLinus Torvalds continue;
4411da177e4SLinus Torvalds }
4421da177e4SLinus Torvalds if (sym_set_tristate_value(sym, newval))
4431da177e4SLinus Torvalds return 0;
4441da177e4SLinus Torvalds help:
44566c4bd80SCheng Renquan print_help(menu);
4461da177e4SLinus Torvalds }
4471da177e4SLinus Torvalds }
4481da177e4SLinus Torvalds
conf_choice(struct menu * menu)4491da177e4SLinus Torvalds static int conf_choice(struct menu *menu)
4501da177e4SLinus Torvalds {
4511da177e4SLinus Torvalds struct symbol *sym, *def_sym;
4521da177e4SLinus Torvalds struct menu *child;
4531da177e4SLinus Torvalds bool is_new;
4541da177e4SLinus Torvalds
4551da177e4SLinus Torvalds sym = menu->sym;
4561da177e4SLinus Torvalds is_new = !sym_has_value(sym);
457baa23ec8SMarco Ammon if (sym_is_changeable(sym)) {
4581da177e4SLinus Torvalds conf_sym(menu);
4591da177e4SLinus Torvalds sym_calc_value(sym);
4601da177e4SLinus Torvalds switch (sym_get_tristate_value(sym)) {
4611da177e4SLinus Torvalds case no:
4621da177e4SLinus Torvalds return 1;
4631da177e4SLinus Torvalds case mod:
4641da177e4SLinus Torvalds return 0;
4651da177e4SLinus Torvalds case yes:
4661da177e4SLinus Torvalds break;
4671da177e4SLinus Torvalds }
4681da177e4SLinus Torvalds } else {
4691da177e4SLinus Torvalds switch (sym_get_tristate_value(sym)) {
4701da177e4SLinus Torvalds case no:
4711da177e4SLinus Torvalds return 1;
4721da177e4SLinus Torvalds case mod:
473694c49a7SSam Ravnborg printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
4741da177e4SLinus Torvalds return 0;
4751da177e4SLinus Torvalds case yes:
4761da177e4SLinus Torvalds break;
4771da177e4SLinus Torvalds }
4781da177e4SLinus Torvalds }
4791da177e4SLinus Torvalds
4801da177e4SLinus Torvalds while (1) {
4811da177e4SLinus Torvalds int cnt, def;
4821da177e4SLinus Torvalds
483694c49a7SSam Ravnborg printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
4841da177e4SLinus Torvalds def_sym = sym_get_choice_value(sym);
4851da177e4SLinus Torvalds cnt = def = 0;
48640aee729SRoman Zippel line[0] = 0;
4871da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) {
4881da177e4SLinus Torvalds if (!menu_is_visible(child))
4891da177e4SLinus Torvalds continue;
4901da177e4SLinus Torvalds if (!child->sym) {
491694c49a7SSam Ravnborg printf("%*c %s\n", indent, '*', menu_get_prompt(child));
4921da177e4SLinus Torvalds continue;
4931da177e4SLinus Torvalds }
4941da177e4SLinus Torvalds cnt++;
4951da177e4SLinus Torvalds if (child->sym == def_sym) {
4961da177e4SLinus Torvalds def = cnt;
4971da177e4SLinus Torvalds printf("%*c", indent, '>');
4981da177e4SLinus Torvalds } else
4991da177e4SLinus Torvalds printf("%*c", indent, ' ');
500694c49a7SSam Ravnborg printf(" %d. %s", cnt, menu_get_prompt(child));
5011da177e4SLinus Torvalds if (child->sym->name)
5021da177e4SLinus Torvalds printf(" (%s)", child->sym->name);
5031da177e4SLinus Torvalds if (!sym_has_value(child->sym))
504694c49a7SSam Ravnborg printf(" (NEW)");
5051da177e4SLinus Torvalds printf("\n");
5061da177e4SLinus Torvalds }
507694c49a7SSam Ravnborg printf("%*schoice", indent - 1, "");
5081da177e4SLinus Torvalds if (cnt == 1) {
5091da177e4SLinus Torvalds printf("[1]: 1\n");
5101da177e4SLinus Torvalds goto conf_childs;
5111da177e4SLinus Torvalds }
5124f208f39SMasahiro Yamada printf("[1-%d?]: ", cnt);
5131da177e4SLinus Torvalds switch (input_mode) {
5144062f1a4SSam Ravnborg case oldconfig:
515911a91c3SMasahiro Yamada case syncconfig:
5161da177e4SLinus Torvalds if (!is_new) {
5171da177e4SLinus Torvalds cnt = def;
5181da177e4SLinus Torvalds printf("%d\n", cnt);
5191da177e4SLinus Torvalds break;
5201da177e4SLinus Torvalds }
521d8fc3200SArnaud Lacombe /* fall through */
5224062f1a4SSam Ravnborg case oldaskconfig:
5231da177e4SLinus Torvalds fflush(stdout);
52474dba809SMarkus Mayer xfgets(line, sizeof(line), stdin);
5251da177e4SLinus Torvalds strip(line);
5261da177e4SLinus Torvalds if (line[0] == '?') {
52766c4bd80SCheng Renquan print_help(menu);
5281da177e4SLinus Torvalds continue;
5291da177e4SLinus Torvalds }
5301da177e4SLinus Torvalds if (!line[0])
5311da177e4SLinus Torvalds cnt = def;
5321da177e4SLinus Torvalds else if (isdigit(line[0]))
5331da177e4SLinus Torvalds cnt = atoi(line);
5341da177e4SLinus Torvalds else
5351da177e4SLinus Torvalds continue;
5361da177e4SLinus Torvalds break;
537f443d2ecSSam Ravnborg default:
538f443d2ecSSam Ravnborg break;
5391da177e4SLinus Torvalds }
5401da177e4SLinus Torvalds
5411da177e4SLinus Torvalds conf_childs:
5421da177e4SLinus Torvalds for (child = menu->list; child; child = child->next) {
5431da177e4SLinus Torvalds if (!child->sym || !menu_is_visible(child))
5441da177e4SLinus Torvalds continue;
5451da177e4SLinus Torvalds if (!--cnt)
5461da177e4SLinus Torvalds break;
5471da177e4SLinus Torvalds }
5481da177e4SLinus Torvalds if (!child)
5491da177e4SLinus Torvalds continue;
5503ba41621SBen Hutchings if (line[0] && line[strlen(line) - 1] == '?') {
55166c4bd80SCheng Renquan print_help(child);
5521da177e4SLinus Torvalds continue;
5531da177e4SLinus Torvalds }
554efc8338eSZeng Heng sym_set_tristate_value(child->sym, yes);
555f5eaa323SJan Beulich for (child = child->list; child; child = child->next) {
5561da177e4SLinus Torvalds indent += 2;
557f5eaa323SJan Beulich conf(child);
5581da177e4SLinus Torvalds indent -= 2;
5591da177e4SLinus Torvalds }
5601da177e4SLinus Torvalds return 1;
5611da177e4SLinus Torvalds }
5621da177e4SLinus Torvalds }
5631da177e4SLinus Torvalds
conf(struct menu * menu)5641da177e4SLinus Torvalds static void conf(struct menu *menu)
5651da177e4SLinus Torvalds {
5661da177e4SLinus Torvalds struct symbol *sym;
5671da177e4SLinus Torvalds struct property *prop;
5681da177e4SLinus Torvalds struct menu *child;
5691da177e4SLinus Torvalds
5701da177e4SLinus Torvalds if (!menu_is_visible(menu))
5711da177e4SLinus Torvalds return;
5721da177e4SLinus Torvalds
5731da177e4SLinus Torvalds sym = menu->sym;
5741da177e4SLinus Torvalds prop = menu->prompt;
5751da177e4SLinus Torvalds if (prop) {
5761da177e4SLinus Torvalds const char *prompt;
5771da177e4SLinus Torvalds
5781da177e4SLinus Torvalds switch (prop->type) {
5791da177e4SLinus Torvalds case P_MENU:
5802aad9b89SMasahiro Yamada /*
5812aad9b89SMasahiro Yamada * Except in oldaskconfig mode, we show only menus that
5822aad9b89SMasahiro Yamada * contain new symbols.
5832aad9b89SMasahiro Yamada */
5842aad9b89SMasahiro Yamada if (input_mode != oldaskconfig && rootEntry != menu) {
5851da177e4SLinus Torvalds check_conf(menu);
5861da177e4SLinus Torvalds return;
5871da177e4SLinus Torvalds }
588d8fc3200SArnaud Lacombe /* fall through */
5891da177e4SLinus Torvalds case P_COMMENT:
5901da177e4SLinus Torvalds prompt = menu_get_prompt(menu);
5911da177e4SLinus Torvalds if (prompt)
5921da177e4SLinus Torvalds printf("%*c\n%*c %s\n%*c\n",
5931da177e4SLinus Torvalds indent, '*',
594694c49a7SSam Ravnborg indent, '*', prompt,
5951da177e4SLinus Torvalds indent, '*');
5961da177e4SLinus Torvalds default:
5971da177e4SLinus Torvalds ;
5981da177e4SLinus Torvalds }
5991da177e4SLinus Torvalds }
6001da177e4SLinus Torvalds
6011da177e4SLinus Torvalds if (!sym)
6021da177e4SLinus Torvalds goto conf_childs;
6031da177e4SLinus Torvalds
6041da177e4SLinus Torvalds if (sym_is_choice(sym)) {
6051da177e4SLinus Torvalds conf_choice(menu);
6061da177e4SLinus Torvalds if (sym->curr.tri != mod)
6071da177e4SLinus Torvalds return;
6081da177e4SLinus Torvalds goto conf_childs;
6091da177e4SLinus Torvalds }
6101da177e4SLinus Torvalds
6111da177e4SLinus Torvalds switch (sym->type) {
6121da177e4SLinus Torvalds case S_INT:
6131da177e4SLinus Torvalds case S_HEX:
6141da177e4SLinus Torvalds case S_STRING:
6151da177e4SLinus Torvalds conf_string(menu);
6161da177e4SLinus Torvalds break;
6171da177e4SLinus Torvalds default:
6181da177e4SLinus Torvalds conf_sym(menu);
6191da177e4SLinus Torvalds break;
6201da177e4SLinus Torvalds }
6211da177e4SLinus Torvalds
6221da177e4SLinus Torvalds conf_childs:
6231da177e4SLinus Torvalds if (sym)
6241da177e4SLinus Torvalds indent += 2;
6251da177e4SLinus Torvalds for (child = menu->list; child; child = child->next)
6261da177e4SLinus Torvalds conf(child);
6271da177e4SLinus Torvalds if (sym)
6281da177e4SLinus Torvalds indent -= 2;
6291da177e4SLinus Torvalds }
6301da177e4SLinus Torvalds
check_conf(struct menu * menu)6311da177e4SLinus Torvalds static void check_conf(struct menu *menu)
6321da177e4SLinus Torvalds {
6331da177e4SLinus Torvalds struct symbol *sym;
6341da177e4SLinus Torvalds struct menu *child;
6351da177e4SLinus Torvalds
6361da177e4SLinus Torvalds if (!menu_is_visible(menu))
6371da177e4SLinus Torvalds return;
6381da177e4SLinus Torvalds
6391da177e4SLinus Torvalds sym = menu->sym;
640a4cff327SMasahiro Yamada if (sym && !sym_has_value(sym) &&
641a4cff327SMasahiro Yamada (sym_is_changeable(sym) ||
642a4cff327SMasahiro Yamada (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes))) {
643a4cff327SMasahiro Yamada
644a4cff327SMasahiro Yamada switch (input_mode) {
645a4cff327SMasahiro Yamada case listnewconfig:
64651d792cbSMasahiro Yamada if (sym->name)
64751d792cbSMasahiro Yamada print_symbol_for_listconfig(sym);
648a4cff327SMasahiro Yamada break;
649a4cff327SMasahiro Yamada case helpnewconfig:
6505d8b42aaSLaura Abbott printf("-----\n");
6515d8b42aaSLaura Abbott print_help(menu);
6525d8b42aaSLaura Abbott printf("-----\n");
653a4cff327SMasahiro Yamada break;
654a4cff327SMasahiro Yamada default:
6551da177e4SLinus Torvalds if (!conf_cnt++)
656694c49a7SSam Ravnborg printf("*\n* Restart config...\n*\n");
6571da177e4SLinus Torvalds rootEntry = menu_get_parent_menu(menu);
6581da177e4SLinus Torvalds conf(rootEntry);
659a4cff327SMasahiro Yamada break;
6601da177e4SLinus Torvalds }
661f0778c8cSAristeu Rozanski }
6621da177e4SLinus Torvalds
6631da177e4SLinus Torvalds for (child = menu->list; child; child = child->next)
6641da177e4SLinus Torvalds check_conf(child);
6651da177e4SLinus Torvalds }
6661da177e4SLinus Torvalds
66743ac7110SMasahiro Yamada static const struct option long_opts[] = {
668bafc4791SMasahiro Yamada {"help", no_argument, NULL, 'h'},
669bafc4791SMasahiro Yamada {"silent", no_argument, NULL, 's'},
670ed562c53SMasahiro Yamada {"oldaskconfig", no_argument, &input_mode_opt, oldaskconfig},
671ed562c53SMasahiro Yamada {"oldconfig", no_argument, &input_mode_opt, oldconfig},
672ed562c53SMasahiro Yamada {"syncconfig", no_argument, &input_mode_opt, syncconfig},
673ed562c53SMasahiro Yamada {"defconfig", required_argument, &input_mode_opt, defconfig},
674ed562c53SMasahiro Yamada {"savedefconfig", required_argument, &input_mode_opt, savedefconfig},
675ed562c53SMasahiro Yamada {"allnoconfig", no_argument, &input_mode_opt, allnoconfig},
676ed562c53SMasahiro Yamada {"allyesconfig", no_argument, &input_mode_opt, allyesconfig},
677ed562c53SMasahiro Yamada {"allmodconfig", no_argument, &input_mode_opt, allmodconfig},
678ed562c53SMasahiro Yamada {"alldefconfig", no_argument, &input_mode_opt, alldefconfig},
679ed562c53SMasahiro Yamada {"randconfig", no_argument, &input_mode_opt, randconfig},
680ed562c53SMasahiro Yamada {"listnewconfig", no_argument, &input_mode_opt, listnewconfig},
681ed562c53SMasahiro Yamada {"helpnewconfig", no_argument, &input_mode_opt, helpnewconfig},
682ed562c53SMasahiro Yamada {"olddefconfig", no_argument, &input_mode_opt, olddefconfig},
683ed562c53SMasahiro Yamada {"yes2modconfig", no_argument, &input_mode_opt, yes2modconfig},
684ed562c53SMasahiro Yamada {"mod2yesconfig", no_argument, &input_mode_opt, mod2yesconfig},
685c39afe62SJosh Triplett {"mod2noconfig", no_argument, &input_mode_opt, mod2noconfig},
6864062f1a4SSam Ravnborg {NULL, 0, NULL, 0}
6874062f1a4SSam Ravnborg };
6884062f1a4SSam Ravnborg
conf_usage(const char * progname)68932543999SArnaud Lacombe static void conf_usage(const char *progname)
69032543999SArnaud Lacombe {
691ee4c6f00SMasahiro Yamada printf("Usage: %s [options] <kconfig-file>\n", progname);
692ee4c6f00SMasahiro Yamada printf("\n");
693ee4c6f00SMasahiro Yamada printf("Generic options:\n");
694ee4c6f00SMasahiro Yamada printf(" -h, --help Print this message and exit.\n");
695ee4c6f00SMasahiro Yamada printf(" -s, --silent Do not print log.\n");
696ee4c6f00SMasahiro Yamada printf("\n");
697ee4c6f00SMasahiro Yamada printf("Mode options:\n");
69832543999SArnaud Lacombe printf(" --listnewconfig List new options\n");
6995d8b42aaSLaura Abbott printf(" --helpnewconfig List new options and help text\n");
70032543999SArnaud Lacombe printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
70132543999SArnaud Lacombe printf(" --oldconfig Update a configuration using a provided .config as base\n");
702911a91c3SMasahiro Yamada printf(" --syncconfig Similar to oldconfig but generates configuration in\n"
703911a91c3SMasahiro Yamada " include/{generated/,config/}\n");
704cedd55d4SMarc Herbert printf(" --olddefconfig Same as oldconfig but sets new symbols to their default value\n");
70532543999SArnaud Lacombe printf(" --defconfig <file> New config with default defined in <file>\n");
70632543999SArnaud Lacombe printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n");
70732543999SArnaud Lacombe printf(" --allnoconfig New config where all options are answered with no\n");
70832543999SArnaud Lacombe printf(" --allyesconfig New config where all options are answered with yes\n");
70932543999SArnaud Lacombe printf(" --allmodconfig New config where all options are answered with mod\n");
71032543999SArnaud Lacombe printf(" --alldefconfig New config with all symbols set to default\n");
71132543999SArnaud Lacombe printf(" --randconfig New config with random answer to all options\n");
71289b90609STetsuo Handa printf(" --yes2modconfig Change answers from yes to mod if possible\n");
71389b90609STetsuo Handa printf(" --mod2yesconfig Change answers from mod to yes if possible\n");
714c39afe62SJosh Triplett printf(" --mod2noconfig Change answers from mod to no if possible\n");
715ae8da72bSMasahiro Yamada printf(" (If none of the above is given, --oldaskconfig is the default)\n");
71632543999SArnaud Lacombe }
71732543999SArnaud Lacombe
main(int ac,char ** av)7181da177e4SLinus Torvalds int main(int ac, char **av)
7191da177e4SLinus Torvalds {
72032543999SArnaud Lacombe const char *progname = av[0];
7212f4b489bSAndres Salomon int opt;
722275744ccSArnaud Lacombe const char *name, *defconfig_file = NULL /* gcc uninit */;
72316952b77SMasahiro Yamada int no_conf_write = 0;
7241da177e4SLinus Torvalds
725f3ff6fb5SMasahiro Yamada tty_stdio = isatty(0) && isatty(1);
72662dc9899SBen Hutchings
727a2af62c3SMasahiro Yamada while ((opt = getopt_long(ac, av, "hs", long_opts, NULL)) != -1) {
7282f4b489bSAndres Salomon switch (opt) {
729ed562c53SMasahiro Yamada case 'h':
730ed562c53SMasahiro Yamada conf_usage(progname);
731ed562c53SMasahiro Yamada exit(1);
732ed562c53SMasahiro Yamada break;
733ed562c53SMasahiro Yamada case 's':
734ed562c53SMasahiro Yamada conf_set_message_callback(NULL);
735ed562c53SMasahiro Yamada break;
736ed562c53SMasahiro Yamada case 0:
737ed562c53SMasahiro Yamada input_mode = input_mode_opt;
738ed562c53SMasahiro Yamada switch (input_mode) {
739911a91c3SMasahiro Yamada case syncconfig:
7409a9ddcf4SMasahiro Yamada /*
7419a9ddcf4SMasahiro Yamada * syncconfig is invoked during the build stage.
742ed562c53SMasahiro Yamada * Suppress distracting
743ed562c53SMasahiro Yamada * "configuration written to ..."
7449a9ddcf4SMasahiro Yamada */
7459a9ddcf4SMasahiro Yamada conf_set_message_callback(NULL);
746204c96f6Szippel@linux-m68k.org sync_kconfig = 1;
7471da177e4SLinus Torvalds break;
7484062f1a4SSam Ravnborg case defconfig:
7497cf3d73bSSam Ravnborg case savedefconfig:
7502f4b489bSAndres Salomon defconfig_file = optarg;
7511da177e4SLinus Torvalds break;
7524062f1a4SSam Ravnborg case randconfig:
75389145649SMasahiro Yamada set_randconfig_seed();
7541da177e4SLinus Torvalds break;
755ed562c53SMasahiro Yamada default:
75632543999SArnaud Lacombe break;
757ed562c53SMasahiro Yamada }
758ed562c53SMasahiro Yamada default:
7594062f1a4SSam Ravnborg break;
7601da177e4SLinus Torvalds }
7611da177e4SLinus Torvalds }
7622f4b489bSAndres Salomon if (ac == optind) {
763694c49a7SSam Ravnborg fprintf(stderr, "%s: Kconfig file missing\n", av[0]);
76432543999SArnaud Lacombe conf_usage(progname);
765250725aaSRandy Dunlap exit(1);
7661da177e4SLinus Torvalds }
7679a3c3bc8SMasahiro Yamada conf_parse(av[optind]);
7681da177e4SLinus Torvalds //zconfdump(stdout);
769204c96f6Szippel@linux-m68k.org
7701da177e4SLinus Torvalds switch (input_mode) {
7714062f1a4SSam Ravnborg case defconfig:
7721da177e4SLinus Torvalds if (conf_read(defconfig_file)) {
7739e3e10c7SMasahiro Yamada fprintf(stderr,
774694c49a7SSam Ravnborg "***\n"
7751da177e4SLinus Torvalds "*** Can't find default configuration \"%s\"!\n"
776694c49a7SSam Ravnborg "***\n",
7779e3e10c7SMasahiro Yamada defconfig_file);
7781da177e4SLinus Torvalds exit(1);
7791da177e4SLinus Torvalds }
7801da177e4SLinus Torvalds break;
7817cf3d73bSSam Ravnborg case savedefconfig:
782911a91c3SMasahiro Yamada case syncconfig:
7834062f1a4SSam Ravnborg case oldaskconfig:
7844062f1a4SSam Ravnborg case oldconfig:
785861b4ea4SSam Ravnborg case listnewconfig:
7865d8b42aaSLaura Abbott case helpnewconfig:
787fb16d891SAdam Lee case olddefconfig:
78889b90609STetsuo Handa case yes2modconfig:
78989b90609STetsuo Handa case mod2yesconfig:
790c39afe62SJosh Triplett case mod2noconfig:
7911da177e4SLinus Torvalds conf_read(NULL);
7921da177e4SLinus Torvalds break;
7934062f1a4SSam Ravnborg case allnoconfig:
7944062f1a4SSam Ravnborg case allyesconfig:
7954062f1a4SSam Ravnborg case allmodconfig:
7960748cb3eSSam Ravnborg case alldefconfig:
7974062f1a4SSam Ravnborg case randconfig:
79890389160SRoman Zippel name = getenv("KCONFIG_ALLCONFIG");
7999f420bf0SEric W. Biederman if (!name)
8009f420bf0SEric W. Biederman break;
8019f420bf0SEric W. Biederman if ((strcmp(name, "") != 0) && (strcmp(name, "1") != 0)) {
8025efe241eSEric W. Biederman if (conf_read_simple(name, S_DEF_USER)) {
8035efe241eSEric W. Biederman fprintf(stderr,
804694c49a7SSam Ravnborg "*** Can't read seed configuration \"%s\"!\n",
8055efe241eSEric W. Biederman name);
8065efe241eSEric W. Biederman exit(1);
8075efe241eSEric W. Biederman }
80890389160SRoman Zippel break;
80990389160SRoman Zippel }
81090389160SRoman Zippel switch (input_mode) {
8114062f1a4SSam Ravnborg case allnoconfig: name = "allno.config"; break;
8124062f1a4SSam Ravnborg case allyesconfig: name = "allyes.config"; break;
8134062f1a4SSam Ravnborg case allmodconfig: name = "allmod.config"; break;
8140748cb3eSSam Ravnborg case alldefconfig: name = "alldef.config"; break;
8154062f1a4SSam Ravnborg case randconfig: name = "allrandom.config"; break;
81690389160SRoman Zippel default: break;
81790389160SRoman Zippel }
8185efe241eSEric W. Biederman if (conf_read_simple(name, S_DEF_USER) &&
8195efe241eSEric W. Biederman conf_read_simple("all.config", S_DEF_USER)) {
8205efe241eSEric W. Biederman fprintf(stderr,
821694c49a7SSam Ravnborg "*** KCONFIG_ALLCONFIG set, but no \"%s\" or \"all.config\" file found\n",
8225efe241eSEric W. Biederman name);
8235efe241eSEric W. Biederman exit(1);
8245efe241eSEric W. Biederman }
82590389160SRoman Zippel break;
8261da177e4SLinus Torvalds default:
8271da177e4SLinus Torvalds break;
8281da177e4SLinus Torvalds }
829204c96f6Szippel@linux-m68k.org
830*582e70f1SSergey Senozhatsky if (conf_errors())
831*582e70f1SSergey Senozhatsky exit(1);
832*582e70f1SSergey Senozhatsky
833204c96f6Szippel@linux-m68k.org if (sync_kconfig) {
834204c96f6Szippel@linux-m68k.org name = getenv("KCONFIG_NOSILENTUPDATE");
835204c96f6Szippel@linux-m68k.org if (name && *name) {
83616952b77SMasahiro Yamada if (conf_get_changed()) {
837204c96f6Szippel@linux-m68k.org fprintf(stderr,
838694c49a7SSam Ravnborg "\n*** The configuration requires explicit update.\n\n");
839204c96f6Szippel@linux-m68k.org return 1;
840204c96f6Szippel@linux-m68k.org }
84116952b77SMasahiro Yamada no_conf_write = 1;
842204c96f6Szippel@linux-m68k.org }
843204c96f6Szippel@linux-m68k.org }
844204c96f6Szippel@linux-m68k.org
845f443d2ecSSam Ravnborg switch (input_mode) {
8464062f1a4SSam Ravnborg case allnoconfig:
847f443d2ecSSam Ravnborg conf_set_all_new_symbols(def_no);
848f443d2ecSSam Ravnborg break;
8494062f1a4SSam Ravnborg case allyesconfig:
850f443d2ecSSam Ravnborg conf_set_all_new_symbols(def_yes);
851f443d2ecSSam Ravnborg break;
8524062f1a4SSam Ravnborg case allmodconfig:
853f443d2ecSSam Ravnborg conf_set_all_new_symbols(def_mod);
854f443d2ecSSam Ravnborg break;
8550748cb3eSSam Ravnborg case alldefconfig:
8560748cb3eSSam Ravnborg conf_set_all_new_symbols(def_default);
8570748cb3eSSam Ravnborg break;
8584062f1a4SSam Ravnborg case randconfig:
8593b9a19e0SYann E. MORIN /* Really nothing to do in this loop */
8603b9a19e0SYann E. MORIN while (conf_set_all_new_symbols(def_random)) ;
861f443d2ecSSam Ravnborg break;
8624062f1a4SSam Ravnborg case defconfig:
86309748e17SSam Ravnborg conf_set_all_new_symbols(def_default);
86409748e17SSam Ravnborg break;
8657cf3d73bSSam Ravnborg case savedefconfig:
8667cf3d73bSSam Ravnborg break;
86789b90609STetsuo Handa case yes2modconfig:
868c39afe62SJosh Triplett conf_rewrite_tristates(yes, mod);
86989b90609STetsuo Handa break;
87089b90609STetsuo Handa case mod2yesconfig:
871c39afe62SJosh Triplett conf_rewrite_tristates(mod, yes);
872c39afe62SJosh Triplett break;
873c39afe62SJosh Triplett case mod2noconfig:
874c39afe62SJosh Triplett conf_rewrite_tristates(mod, no);
87589b90609STetsuo Handa break;
8764062f1a4SSam Ravnborg case oldaskconfig:
877204c96f6Szippel@linux-m68k.org rootEntry = &rootmenu;
878204c96f6Szippel@linux-m68k.org conf(&rootmenu);
8792aad9b89SMasahiro Yamada input_mode = oldconfig;
880204c96f6Szippel@linux-m68k.org /* fall through */
88114828349SSam Ravnborg case oldconfig:
882861b4ea4SSam Ravnborg case listnewconfig:
8835d8b42aaSLaura Abbott case helpnewconfig:
884911a91c3SMasahiro Yamada case syncconfig:
885204c96f6Szippel@linux-m68k.org /* Update until a loop caused no more changes */
886204c96f6Szippel@linux-m68k.org do {
887204c96f6Szippel@linux-m68k.org conf_cnt = 0;
888204c96f6Szippel@linux-m68k.org check_conf(&rootmenu);
88999f0b657SMasahiro Yamada } while (conf_cnt);
89059a80b5eSMasahiro Yamada break;
89159a80b5eSMasahiro Yamada case olddefconfig:
89259a80b5eSMasahiro Yamada default:
893f443d2ecSSam Ravnborg break;
8941da177e4SLinus Torvalds }
895c955ccafSRoman Zippel
896*582e70f1SSergey Senozhatsky if (sym_dep_errors())
897*582e70f1SSergey Senozhatsky exit(1);
898*582e70f1SSergey Senozhatsky
89900c864f8SMasahiro Yamada if (input_mode == savedefconfig) {
9007cf3d73bSSam Ravnborg if (conf_write_defconfig(defconfig_file)) {
901694c49a7SSam Ravnborg fprintf(stderr, "n*** Error while saving defconfig to: %s\n\n",
9027cf3d73bSSam Ravnborg defconfig_file);
9037cf3d73bSSam Ravnborg return 1;
9047cf3d73bSSam Ravnborg }
9055d8b42aaSLaura Abbott } else if (input_mode != listnewconfig && input_mode != helpnewconfig) {
90600c864f8SMasahiro Yamada if (!no_conf_write && conf_write(NULL)) {
907694c49a7SSam Ravnborg fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
908f443d2ecSSam Ravnborg exit(1);
9091da177e4SLinus Torvalds }
91000c864f8SMasahiro Yamada
91100c864f8SMasahiro Yamada /*
91200c864f8SMasahiro Yamada * Create auto.conf if it does not exist.
91300c864f8SMasahiro Yamada * This prevents GNU Make 4.1 or older from emitting
91400c864f8SMasahiro Yamada * "include/config/auto.conf: No such file or directory"
91500c864f8SMasahiro Yamada * in the top-level Makefile
91600c864f8SMasahiro Yamada *
91700c864f8SMasahiro Yamada * syncconfig always creates or updates auto.conf because it is
91800c864f8SMasahiro Yamada * used during the build.
91900c864f8SMasahiro Yamada */
92000c864f8SMasahiro Yamada if (conf_write_autoconf(sync_kconfig) && sync_kconfig) {
92100c864f8SMasahiro Yamada fprintf(stderr,
92200c864f8SMasahiro Yamada "\n*** Error during sync of the configuration.\n\n");
92300c864f8SMasahiro Yamada return 1;
92400c864f8SMasahiro Yamada }
925c955ccafSRoman Zippel }
926861b4ea4SSam Ravnborg return 0;
9271da177e4SLinus Torvalds }
928