Blame view

scripts/kconfig/conf.c 14.7 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
   * Released under the terms of the GNU GPL v2.0.
   */
534a450c3   EGRY Gabor   kconfig: gettext ...
5
  #include <locale.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
  #include <ctype.h>
9dfb563b0   Randy Dunlap   [PATCH] config: u...
7
  #include <stdio.h>
75ff4309c   Ladislav Michl   kconfig: fix whit...
8
  #include <stdlib.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
  #include <string.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
  #include <time.h>
75ff4309c   Ladislav Michl   kconfig: fix whit...
11
  #include <unistd.h>
4062f1a4c   Sam Ravnborg   kconfig: use long...
12
  #include <getopt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <sys/stat.h>
b0fe55100   Ingo Molnar   kconfig: improve ...
14
  #include <sys/time.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
  #include "lkc.h"
  
  static void conf(struct menu *menu);
  static void check_conf(struct menu *menu);
ab63f58f2   Arnaud Lacombe   kconfig/conf: mar...
20
  static void xfgets(char *str, int size, FILE *in);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21

4062f1a4c   Sam Ravnborg   kconfig: use long...
22
23
24
25
26
27
28
  enum input_mode {
  	oldaskconfig,
  	silentoldconfig,
  	oldconfig,
  	allnoconfig,
  	allyesconfig,
  	allmodconfig,
0748cb3e1   Sam Ravnborg   kconfig: add alld...
29
  	alldefconfig,
4062f1a4c   Sam Ravnborg   kconfig: use long...
30
31
  	randconfig,
  	defconfig,
7cf3d73b4   Sam Ravnborg   kconfig: add save...
32
  	savedefconfig,
861b4ea4c   Sam Ravnborg   kconfig: change n...
33
  	listnewconfig,
ef61ca88c   Sam Ravnborg   kconfig: rename l...
34
  	oldnoconfig,
4062f1a4c   Sam Ravnborg   kconfig: use long...
35
  } input_mode = oldaskconfig;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
  static int indent = 1;
  static int valid_stdin = 1;
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
38
  static int sync_kconfig;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  static int conf_cnt;
48b9d03c5   J.A. Magallon   [PATCH] Kill sign...
40
  static char line[128];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
  static struct menu *rootEntry;
66c4bd808   Cheng Renquan   kconfig: make use...
42
  static void print_help(struct menu *menu)
03d291227   Sam Ravnborg   kconfig: attach h...
43
  {
66c4bd808   Cheng Renquan   kconfig: make use...
44
45
46
47
48
49
50
51
  	struct gstr help = str_new();
  
  	menu_get_ext_help(menu, &help);
  
  	printf("
  %s
  ", str_get(&help));
  	str_free(&help);
03d291227   Sam Ravnborg   kconfig: attach h...
52
  }
48b9d03c5   J.A. Magallon   [PATCH] Kill sign...
53
  static void strip(char *str)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  {
48b9d03c5   J.A. Magallon   [PATCH] Kill sign...
55
  	char *p = str;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  	int l;
  
  	while ((isspace(*p)))
  		p++;
  	l = strlen(p);
  	if (p != str)
  		memmove(str, p, l + 1);
  	if (!l)
  		return;
  	p = str + l - 1;
  	while ((isspace(*p)))
  		*p-- = 0;
  }
  
  static void check_stdin(void)
  {
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
72
  	if (!valid_stdin) {
3b9fa0931   Arnaldo Carvalho de Melo   [PATCH] Kconfig i...
73
74
75
76
77
78
79
  		printf(_("aborted!
  
  "));
  		printf(_("Console input/output is redirected. "));
  		printf(_("Run 'make oldconfig' to update configuration.
  
  "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
  		exit(1);
  	}
  }
f82f3f942   Roman Zippel   kconfig: oldconfi...
83
  static int conf_askvalue(struct symbol *sym, const char *def)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
  {
  	enum symbol_type type = sym_get_type(sym);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
  
  	if (!sym_has_value(sym))
534a450c3   EGRY Gabor   kconfig: gettext ...
88
  		printf(_("(NEW) "));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
91
92
93
94
95
96
97
98
99
  
  	line[0] = '
  ';
  	line[1] = 0;
  
  	if (!sym_is_changable(sym)) {
  		printf("%s
  ", def);
  		line[0] = '
  ';
  		line[1] = 0;
f82f3f942   Roman Zippel   kconfig: oldconfi...
100
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  	}
  
  	switch (input_mode) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
104
105
  	case oldconfig:
  	case silentoldconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
107
108
  		if (sym_has_value(sym)) {
  			printf("%s
  ", def);
f82f3f942   Roman Zippel   kconfig: oldconfi...
109
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
  		}
  		check_stdin();
d8fc32007   Arnaud Lacombe   kconfig: annotate...
112
  		/* fall through */
4062f1a4c   Sam Ravnborg   kconfig: use long...
113
  	case oldaskconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
  		fflush(stdout);
4418a2b90   Jean Sacren   kconfig: Fix warn...
115
  		xfgets(line, 128, stdin);
f82f3f942   Roman Zippel   kconfig: oldconfi...
116
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
124
125
126
  	default:
  		break;
  	}
  
  	switch (type) {
  	case S_INT:
  	case S_HEX:
  	case S_STRING:
  		printf("%s
  ", def);
f82f3f942   Roman Zippel   kconfig: oldconfi...
127
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
130
  	default:
  		;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
131
  	printf("%s", line);
f82f3f942   Roman Zippel   kconfig: oldconfi...
132
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  }
4356f4890   Trevor Keith   kbuild: add stati...
134
  static int conf_string(struct menu *menu)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
  {
  	struct symbol *sym = menu->sym;
03d291227   Sam Ravnborg   kconfig: attach h...
137
  	const char *def;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
  
  	while (1) {
534a450c3   EGRY Gabor   kconfig: gettext ...
140
  		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
144
  		printf("(%s) ", sym->name);
  		def = sym_get_string_value(sym);
  		if (sym_get_string_value(sym))
  			printf("[%s] ", def);
f82f3f942   Roman Zippel   kconfig: oldconfi...
145
146
  		if (!conf_askvalue(sym, def))
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
148
149
150
151
152
153
154
  		switch (line[0]) {
  		case '
  ':
  			break;
  		case '?':
  			/* print help */
  			if (line[1] == '
  ') {
66c4bd808   Cheng Renquan   kconfig: make use...
155
  				print_help(menu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
158
  				def = NULL;
  				break;
  			}
d8fc32007   Arnaud Lacombe   kconfig: annotate...
159
  			/* fall through */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
163
164
165
166
167
168
169
170
171
  		default:
  			line[strlen(line)-1] = 0;
  			def = line;
  		}
  		if (def && sym_set_string_value(sym, def))
  			return 0;
  	}
  }
  
  static int conf_sym(struct menu *menu)
  {
  	struct symbol *sym = menu->sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172
  	tristate oldval, newval;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
  
  	while (1) {
534a450c3   EGRY Gabor   kconfig: gettext ...
175
  		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176
177
  		if (sym->name)
  			printf("(%s) ", sym->name);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  		putchar('[');
  		oldval = sym_get_tristate_value(sym);
  		switch (oldval) {
  		case no:
  			putchar('N');
  			break;
  		case mod:
  			putchar('M');
  			break;
  		case yes:
  			putchar('Y');
  			break;
  		}
  		if (oldval != no && sym_tristate_within_range(sym, no))
  			printf("/n");
  		if (oldval != mod && sym_tristate_within_range(sym, mod))
  			printf("/m");
  		if (oldval != yes && sym_tristate_within_range(sym, yes))
  			printf("/y");
03d291227   Sam Ravnborg   kconfig: attach h...
197
  		if (menu_has_help(menu))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
  			printf("/?");
  		printf("] ");
f82f3f942   Roman Zippel   kconfig: oldconfi...
200
201
  		if (!conf_askvalue(sym, sym_get_string_value(sym)))
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  		strip(line);
  
  		switch (line[0]) {
  		case 'n':
  		case 'N':
  			newval = no;
  			if (!line[1] || !strcmp(&line[1], "o"))
  				break;
  			continue;
  		case 'm':
  		case 'M':
  			newval = mod;
  			if (!line[1])
  				break;
  			continue;
  		case 'y':
  		case 'Y':
  			newval = yes;
  			if (!line[1] || !strcmp(&line[1], "es"))
  				break;
  			continue;
  		case 0:
  			newval = oldval;
  			break;
  		case '?':
  			goto help;
  		default:
  			continue;
  		}
  		if (sym_set_tristate_value(sym, newval))
  			return 0;
  help:
66c4bd808   Cheng Renquan   kconfig: make use...
234
  		print_help(menu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
238
239
240
241
  	}
  }
  
  static int conf_choice(struct menu *menu)
  {
  	struct symbol *sym, *def_sym;
  	struct menu *child;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
244
  	bool is_new;
  
  	sym = menu->sym;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
  	is_new = !sym_has_value(sym);
  	if (sym_is_changable(sym)) {
  		conf_sym(menu);
  		sym_calc_value(sym);
  		switch (sym_get_tristate_value(sym)) {
  		case no:
  			return 1;
  		case mod:
  			return 0;
  		case yes:
  			break;
  		}
  	} else {
  		switch (sym_get_tristate_value(sym)) {
  		case no:
  			return 1;
  		case mod:
534a450c3   EGRY Gabor   kconfig: gettext ...
262
263
  			printf("%*s%s
  ", indent - 1, "", _(menu_get_prompt(menu)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
264
265
266
267
268
269
270
271
  			return 0;
  		case yes:
  			break;
  		}
  	}
  
  	while (1) {
  		int cnt, def;
534a450c3   EGRY Gabor   kconfig: gettext ...
272
273
  		printf("%*s%s
  ", indent - 1, "", _(menu_get_prompt(menu)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
275
  		def_sym = sym_get_choice_value(sym);
  		cnt = def = 0;
40aee729b   Roman Zippel   kconfig: fix defa...
276
  		line[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
279
280
  		for (child = menu->list; child; child = child->next) {
  			if (!menu_is_visible(child))
  				continue;
  			if (!child->sym) {
534a450c3   EGRY Gabor   kconfig: gettext ...
281
282
  				printf("%*c %s
  ", indent, '*', _(menu_get_prompt(child)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
286
287
288
289
290
  				continue;
  			}
  			cnt++;
  			if (child->sym == def_sym) {
  				def = cnt;
  				printf("%*c", indent, '>');
  			} else
  				printf("%*c", indent, ' ');
534a450c3   EGRY Gabor   kconfig: gettext ...
291
  			printf(" %d. %s", cnt, _(menu_get_prompt(child)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
293
294
  			if (child->sym->name)
  				printf(" (%s)", child->sym->name);
  			if (!sym_has_value(child->sym))
534a450c3   EGRY Gabor   kconfig: gettext ...
295
  				printf(_(" (NEW)"));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
298
  			printf("
  ");
  		}
534a450c3   EGRY Gabor   kconfig: gettext ...
299
  		printf(_("%*schoice"), indent - 1, "");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
301
302
303
304
305
  		if (cnt == 1) {
  			printf("[1]: 1
  ");
  			goto conf_childs;
  		}
  		printf("[1-%d", cnt);
03d291227   Sam Ravnborg   kconfig: attach h...
306
  		if (menu_has_help(menu))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
307
308
309
  			printf("?");
  		printf("]: ");
  		switch (input_mode) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
310
311
  		case oldconfig:
  		case silentoldconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
312
313
314
315
316
317
318
  			if (!is_new) {
  				cnt = def;
  				printf("%d
  ", cnt);
  				break;
  			}
  			check_stdin();
d8fc32007   Arnaud Lacombe   kconfig: annotate...
319
  			/* fall through */
4062f1a4c   Sam Ravnborg   kconfig: use long...
320
  		case oldaskconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
  			fflush(stdout);
4418a2b90   Jean Sacren   kconfig: Fix warn...
322
  			xfgets(line, 128, stdin);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
323
324
  			strip(line);
  			if (line[0] == '?') {
66c4bd808   Cheng Renquan   kconfig: make use...
325
  				print_help(menu);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
328
329
330
331
332
333
334
  				continue;
  			}
  			if (!line[0])
  				cnt = def;
  			else if (isdigit(line[0]))
  				cnt = atoi(line);
  			else
  				continue;
  			break;
f443d2ecc   Sam Ravnborg   kconfig: speed up...
335
336
  		default:
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337
338
339
340
341
342
343
344
345
346
347
  		}
  
  	conf_childs:
  		for (child = menu->list; child; child = child->next) {
  			if (!child->sym || !menu_is_visible(child))
  				continue;
  			if (!--cnt)
  				break;
  		}
  		if (!child)
  			continue;
3ba416211   Ben Hutchings   kconfig: Avoid bu...
348
  		if (line[0] && line[strlen(line) - 1] == '?') {
66c4bd808   Cheng Renquan   kconfig: make use...
349
  			print_help(child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350
351
352
  			continue;
  		}
  		sym_set_choice_value(sym, child->sym);
f5eaa323e   Jan Beulich   kconfig: tristate...
353
  		for (child = child->list; child; child = child->next) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
  			indent += 2;
f5eaa323e   Jan Beulich   kconfig: tristate...
355
  			conf(child);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
  			indent -= 2;
  		}
  		return 1;
  	}
  }
  
  static void conf(struct menu *menu)
  {
  	struct symbol *sym;
  	struct property *prop;
  	struct menu *child;
  
  	if (!menu_is_visible(menu))
  		return;
  
  	sym = menu->sym;
  	prop = menu->prompt;
  	if (prop) {
  		const char *prompt;
  
  		switch (prop->type) {
  		case P_MENU:
4062f1a4c   Sam Ravnborg   kconfig: use long...
378
  			if ((input_mode == silentoldconfig ||
861b4ea4c   Sam Ravnborg   kconfig: change n...
379
  			     input_mode == listnewconfig ||
ef61ca88c   Sam Ravnborg   kconfig: rename l...
380
  			     input_mode == oldnoconfig) &&
f0778c8c4   Aristeu Rozanski   kconfig: introduc...
381
  			    rootEntry != menu) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
383
384
  				check_conf(menu);
  				return;
  			}
d8fc32007   Arnaud Lacombe   kconfig: annotate...
385
  			/* fall through */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
387
388
389
390
391
392
393
  		case P_COMMENT:
  			prompt = menu_get_prompt(menu);
  			if (prompt)
  				printf("%*c
  %*c %s
  %*c
  ",
  					indent, '*',
534a450c3   EGRY Gabor   kconfig: gettext ...
394
  					indent, '*', _(prompt),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
  					indent, '*');
  		default:
  			;
  		}
  	}
  
  	if (!sym)
  		goto conf_childs;
  
  	if (sym_is_choice(sym)) {
  		conf_choice(menu);
  		if (sym->curr.tri != mod)
  			return;
  		goto conf_childs;
  	}
  
  	switch (sym->type) {
  	case S_INT:
  	case S_HEX:
  	case S_STRING:
  		conf_string(menu);
  		break;
  	default:
  		conf_sym(menu);
  		break;
  	}
  
  conf_childs:
  	if (sym)
  		indent += 2;
  	for (child = menu->list; child; child = child->next)
  		conf(child);
  	if (sym)
  		indent -= 2;
  }
  
  static void check_conf(struct menu *menu)
  {
  	struct symbol *sym;
  	struct menu *child;
  
  	if (!menu_is_visible(menu))
  		return;
  
  	sym = menu->sym;
3f23ca2b3   Roman Zippel   [PATCH] kconfig: ...
440
441
442
  	if (sym && !sym_has_value(sym)) {
  		if (sym_is_changable(sym) ||
  		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
861b4ea4c   Sam Ravnborg   kconfig: change n...
443
444
  			if (input_mode == listnewconfig) {
  				if (sym->name && !sym_is_choice_value(sym)) {
ffb5957bc   Arnaud Lacombe   kconfig: allow bu...
445
446
  					printf("%s%s
  ", CONFIG_, sym->name);
f0778c8c4   Aristeu Rozanski   kconfig: introduc...
447
  				}
71d806626   Kyle McMartin   kbuild: fix oldno...
448
  			} else if (input_mode != oldnoconfig) {
f0778c8c4   Aristeu Rozanski   kconfig: introduc...
449
450
451
452
453
454
455
456
  				if (!conf_cnt++)
  					printf(_("*
  * Restart config...
  *
  "));
  				rootEntry = menu_get_parent_menu(menu);
  				conf(rootEntry);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
459
460
461
462
  	}
  
  	for (child = menu->list; child; child = child->next)
  		check_conf(child);
  }
4062f1a4c   Sam Ravnborg   kconfig: use long...
463
464
465
466
467
  static struct option long_opts[] = {
  	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
  	{"oldconfig",       no_argument,       NULL, oldconfig},
  	{"silentoldconfig", no_argument,       NULL, silentoldconfig},
  	{"defconfig",       optional_argument, NULL, defconfig},
7cf3d73b4   Sam Ravnborg   kconfig: add save...
468
  	{"savedefconfig",   required_argument, NULL, savedefconfig},
4062f1a4c   Sam Ravnborg   kconfig: use long...
469
470
471
  	{"allnoconfig",     no_argument,       NULL, allnoconfig},
  	{"allyesconfig",    no_argument,       NULL, allyesconfig},
  	{"allmodconfig",    no_argument,       NULL, allmodconfig},
0748cb3e1   Sam Ravnborg   kconfig: add alld...
472
  	{"alldefconfig",    no_argument,       NULL, alldefconfig},
4062f1a4c   Sam Ravnborg   kconfig: use long...
473
  	{"randconfig",      no_argument,       NULL, randconfig},
861b4ea4c   Sam Ravnborg   kconfig: change n...
474
  	{"listnewconfig",   no_argument,       NULL, listnewconfig},
ef61ca88c   Sam Ravnborg   kconfig: rename l...
475
  	{"oldnoconfig",     no_argument,       NULL, oldnoconfig},
4062f1a4c   Sam Ravnborg   kconfig: use long...
476
477
  	{NULL, 0, NULL, 0}
  };
32543999f   Arnaud Lacombe   kconfig/conf: add...
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
  static void conf_usage(const char *progname)
  {
  
  	printf("Usage: %s [option] <kconfig-file>
  ", progname);
  	printf("[option] is _one_ of the following:
  ");
  	printf("  --listnewconfig         List new options
  ");
  	printf("  --oldaskconfig          Start a new configuration using a line-oriented program
  ");
  	printf("  --oldconfig             Update a configuration using a provided .config as base
  ");
  	printf("  --silentoldconfig       Same as oldconfig, but quietly, additionally update deps
  ");
  	printf("  --oldnoconfig           Same as silentoldconfig but set new symbols to no
  ");
  	printf("  --defconfig <file>      New config with default defined in <file>
  ");
  	printf("  --savedefconfig <file>  Save the minimal current configuration to <file>
  ");
  	printf("  --allnoconfig           New config where all options are answered with no
  ");
  	printf("  --allyesconfig          New config where all options are answered with yes
  ");
  	printf("  --allmodconfig          New config where all options are answered with mod
  ");
  	printf("  --alldefconfig          New config with all symbols set to default
  ");
  	printf("  --randconfig            New config with random answer to all options
  ");
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
510
511
  int main(int ac, char **av)
  {
32543999f   Arnaud Lacombe   kconfig/conf: add...
512
  	const char *progname = av[0];
2f4b489b7   Andres Salomon   kconfig: use geto...
513
  	int opt;
275744cc8   Arnaud Lacombe   kconfig/conf: red...
514
  	const char *name, *defconfig_file = NULL /* gcc uninit */;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
515
  	struct stat tmpstat;
534a450c3   EGRY Gabor   kconfig: gettext ...
516
517
518
  	setlocale(LC_ALL, "");
  	bindtextdomain(PACKAGE, LOCALEDIR);
  	textdomain(PACKAGE);
c94d3fb01   Arnaud Lacombe   kbuild: use getop...
519
  	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
520
  		input_mode = (enum input_mode)opt;
2f4b489b7   Andres Salomon   kconfig: use geto...
521
  		switch (opt) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
522
  		case silentoldconfig:
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
523
  			sync_kconfig = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524
  			break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
525
  		case defconfig:
7cf3d73b4   Sam Ravnborg   kconfig: add save...
526
  		case savedefconfig:
2f4b489b7   Andres Salomon   kconfig: use geto...
527
  			defconfig_file = optarg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
  			break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
529
  		case randconfig:
b0fe55100   Ingo Molnar   kconfig: improve ...
530
531
532
533
534
535
536
537
538
539
540
541
  		{
  			struct timeval now;
  			unsigned int seed;
  
  			/*
  			 * Use microseconds derived seed,
  			 * compensate for systems where it may be zero
  			 */
  			gettimeofday(&now, NULL);
  
  			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
  			srand(seed);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
  			break;
b0fe55100   Ingo Molnar   kconfig: improve ...
543
  		}
32543999f   Arnaud Lacombe   kconfig/conf: add...
544
545
546
547
548
549
550
551
552
  		case oldaskconfig:
  		case oldconfig:
  		case allnoconfig:
  		case allyesconfig:
  		case allmodconfig:
  		case alldefconfig:
  		case listnewconfig:
  		case oldnoconfig:
  			break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
553
  		case '?':
32543999f   Arnaud Lacombe   kconfig/conf: add...
554
  			conf_usage(progname);
2f4b489b7   Andres Salomon   kconfig: use geto...
555
  			exit(1);
4062f1a4c   Sam Ravnborg   kconfig: use long...
556
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557
558
  		}
  	}
2f4b489b7   Andres Salomon   kconfig: use geto...
559
  	if (ac == optind) {
3b9fa0931   Arnaldo Carvalho de Melo   [PATCH] Kconfig i...
560
561
  		printf(_("%s: Kconfig file missing
  "), av[0]);
32543999f   Arnaud Lacombe   kconfig/conf: add...
562
  		conf_usage(progname);
250725aa1   Randy Dunlap   kconfig: exit if ...
563
  		exit(1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
564
  	}
2f4b489b7   Andres Salomon   kconfig: use geto...
565
  	name = av[optind];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
566
567
  	conf_parse(name);
  	//zconfdump(stdout);
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
568
  	if (sync_kconfig) {
284026cdf   Markus Heidelberg   kconfig: do not h...
569
570
  		name = conf_get_configname();
  		if (stat(name, &tmpstat)) {
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
571
572
  			fprintf(stderr, _("***
  "
652cf9821   Arnaud Lacombe   kconfig: rephrase...
573
574
  				"*** Configuration file \"%s\" not found!
  "
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
575
576
577
578
579
580
  				"***
  "
  				"*** Please run some configurator (e.g. \"make oldconfig\" or
  "
  				"*** \"make menuconfig\" or \"make xconfig\").
  "
284026cdf   Markus Heidelberg   kconfig: do not h...
581
582
  				"***
  "), name);
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
583
584
585
  			exit(1);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
586
  	switch (input_mode) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
587
  	case defconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
588
589
590
  		if (!defconfig_file)
  			defconfig_file = conf_get_default_confname();
  		if (conf_read(defconfig_file)) {
534a450c3   EGRY Gabor   kconfig: gettext ...
591
592
  			printf(_("***
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
594
  				"*** Can't find default configuration \"%s\"!
  "
534a450c3   EGRY Gabor   kconfig: gettext ...
595
596
  				"***
  "), defconfig_file);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
597
598
599
  			exit(1);
  		}
  		break;
7cf3d73b4   Sam Ravnborg   kconfig: add save...
600
  	case savedefconfig:
4062f1a4c   Sam Ravnborg   kconfig: use long...
601
602
603
  	case silentoldconfig:
  	case oldaskconfig:
  	case oldconfig:
861b4ea4c   Sam Ravnborg   kconfig: change n...
604
  	case listnewconfig:
ef61ca88c   Sam Ravnborg   kconfig: rename l...
605
  	case oldnoconfig:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
606
607
  		conf_read(NULL);
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
608
609
610
  	case allnoconfig:
  	case allyesconfig:
  	case allmodconfig:
0748cb3e1   Sam Ravnborg   kconfig: add alld...
611
  	case alldefconfig:
4062f1a4c   Sam Ravnborg   kconfig: use long...
612
  	case randconfig:
90389160e   Roman Zippel   [PATCH] kconfig: ...
613
614
  		name = getenv("KCONFIG_ALLCONFIG");
  		if (name && !stat(name, &tmpstat)) {
669bfad90   Roman Zippel   kconfig: allow lo...
615
  			conf_read_simple(name, S_DEF_USER);
90389160e   Roman Zippel   [PATCH] kconfig: ...
616
617
618
  			break;
  		}
  		switch (input_mode) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
619
620
621
  		case allnoconfig:	name = "allno.config"; break;
  		case allyesconfig:	name = "allyes.config"; break;
  		case allmodconfig:	name = "allmod.config"; break;
0748cb3e1   Sam Ravnborg   kconfig: add alld...
622
  		case alldefconfig:	name = "alldef.config"; break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
623
  		case randconfig:	name = "allrandom.config"; break;
90389160e   Roman Zippel   [PATCH] kconfig: ...
624
625
626
  		default: break;
  		}
  		if (!stat(name, &tmpstat))
669bfad90   Roman Zippel   kconfig: allow lo...
627
  			conf_read_simple(name, S_DEF_USER);
90389160e   Roman Zippel   [PATCH] kconfig: ...
628
  		else if (!stat("all.config", &tmpstat))
669bfad90   Roman Zippel   kconfig: allow lo...
629
  			conf_read_simple("all.config", S_DEF_USER);
90389160e   Roman Zippel   [PATCH] kconfig: ...
630
  		break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
631
632
633
  	default:
  		break;
  	}
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
634
635
636
637
638
639
  
  	if (sync_kconfig) {
  		if (conf_get_changed()) {
  			name = getenv("KCONFIG_NOSILENTUPDATE");
  			if (name && *name) {
  				fprintf(stderr,
652cf9821   Arnaud Lacombe   kconfig: rephrase...
640
641
642
643
  					_("
  *** The configuration requires explicit update.
  
  "));
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
644
645
646
647
648
  				return 1;
  			}
  		}
  		valid_stdin = isatty(0) && isatty(1) && isatty(2);
  	}
f443d2ecc   Sam Ravnborg   kconfig: speed up...
649
  	switch (input_mode) {
4062f1a4c   Sam Ravnborg   kconfig: use long...
650
  	case allnoconfig:
f443d2ecc   Sam Ravnborg   kconfig: speed up...
651
652
  		conf_set_all_new_symbols(def_no);
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
653
  	case allyesconfig:
f443d2ecc   Sam Ravnborg   kconfig: speed up...
654
655
  		conf_set_all_new_symbols(def_yes);
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
656
  	case allmodconfig:
f443d2ecc   Sam Ravnborg   kconfig: speed up...
657
658
  		conf_set_all_new_symbols(def_mod);
  		break;
0748cb3e1   Sam Ravnborg   kconfig: add alld...
659
660
661
  	case alldefconfig:
  		conf_set_all_new_symbols(def_default);
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
662
  	case randconfig:
f443d2ecc   Sam Ravnborg   kconfig: speed up...
663
664
  		conf_set_all_new_symbols(def_random);
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
665
  	case defconfig:
09748e178   Sam Ravnborg   kconfig: make def...
666
667
  		conf_set_all_new_symbols(def_default);
  		break;
7cf3d73b4   Sam Ravnborg   kconfig: add save...
668
669
  	case savedefconfig:
  		break;
4062f1a4c   Sam Ravnborg   kconfig: use long...
670
  	case oldaskconfig:
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
671
672
  		rootEntry = &rootmenu;
  		conf(&rootmenu);
4062f1a4c   Sam Ravnborg   kconfig: use long...
673
  		input_mode = silentoldconfig;
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
674
  		/* fall through */
148283497   Sam Ravnborg   kconfig: fix make...
675
  	case oldconfig:
861b4ea4c   Sam Ravnborg   kconfig: change n...
676
  	case listnewconfig:
ef61ca88c   Sam Ravnborg   kconfig: rename l...
677
  	case oldnoconfig:
4062f1a4c   Sam Ravnborg   kconfig: use long...
678
  	case silentoldconfig:
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
679
680
681
682
  		/* Update until a loop caused no more changes */
  		do {
  			conf_cnt = 0;
  			check_conf(&rootmenu);
f0778c8c4   Aristeu Rozanski   kconfig: introduc...
683
  		} while (conf_cnt &&
861b4ea4c   Sam Ravnborg   kconfig: change n...
684
  			 (input_mode != listnewconfig &&
ef61ca88c   Sam Ravnborg   kconfig: rename l...
685
  			  input_mode != oldnoconfig));
f443d2ecc   Sam Ravnborg   kconfig: speed up...
686
687
  		break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688

204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
689
690
691
692
693
  	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 (conf_get_changed() && conf_write(NULL)) {
652cf9821   Arnaud Lacombe   kconfig: rephrase...
694
695
696
697
  			fprintf(stderr, _("
  *** Error during writing of the configuration.
  
  "));
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
698
699
700
  			exit(1);
  		}
  		if (conf_write_autoconf()) {
652cf9821   Arnaud Lacombe   kconfig: rephrase...
701
702
703
704
  			fprintf(stderr, _("
  *** Error during update of the configuration.
  
  "));
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
705
706
  			return 1;
  		}
7cf3d73b4   Sam Ravnborg   kconfig: add save...
707
708
709
710
711
712
713
714
  	} else if (input_mode == savedefconfig) {
  		if (conf_write_defconfig(defconfig_file)) {
  			fprintf(stderr, _("n*** Error while saving defconfig to: %s
  
  "),
  			        defconfig_file);
  			return 1;
  		}
861b4ea4c   Sam Ravnborg   kconfig: change n...
715
  	} else if (input_mode != listnewconfig) {
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
716
  		if (conf_write(NULL)) {
652cf9821   Arnaud Lacombe   kconfig: rephrase...
717
718
719
720
  			fprintf(stderr, _("
  *** Error during writing of the configuration.
  
  "));
204c96f60   zippel@linux-m68k.org   kconfig: fix sile...
721
722
  			exit(1);
  		}
c955ccafc   Roman Zippel   kconfig: fix .con...
723
  	}
861b4ea4c   Sam Ravnborg   kconfig: change n...
724
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
725
  }
ab63f58f2   Arnaud Lacombe   kconfig/conf: mar...
726

4418a2b90   Jean Sacren   kconfig: Fix warn...
727
728
729
  /*
   * Helper function to facilitate fgets() by Jean Sacren.
   */
ab63f58f2   Arnaud Lacombe   kconfig/conf: mar...
730
  void xfgets(char *str, int size, FILE *in)
4418a2b90   Jean Sacren   kconfig: Fix warn...
731
732
733
734
735
736
  {
  	if (fgets(str, size, in) == NULL)
  		fprintf(stderr, "
  Error in reading or end of file.
  ");
  }