diff options
Diffstat (limited to 'scripts/kconfig/conf.c')
| -rw-r--r-- | scripts/kconfig/conf.c | 123 | 
1 files changed, 57 insertions, 66 deletions
| diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 36b5eedcdc75..3e1057f885c6 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c | |||
| @@ -32,6 +32,7 @@ char *defconfig_file; | |||
| 32 | 32 | ||
| 33 | static int indent = 1; | 33 | static int indent = 1; | 
| 34 | static int valid_stdin = 1; | 34 | static int valid_stdin = 1; | 
| 35 | static int sync_kconfig; | ||
| 35 | static int conf_cnt; | 36 | static int conf_cnt; | 
| 36 | static char line[128]; | 37 | static char line[128]; | 
| 37 | static struct menu *rootEntry; | 38 | static struct menu *rootEntry; | 
| @@ -65,7 +66,7 @@ static void strip(char *str) | |||
| 65 | 66 | ||
| 66 | static void check_stdin(void) | 67 | static void check_stdin(void) | 
| 67 | { | 68 | { | 
| 68 | if (!valid_stdin && input_mode == ask_silent) { | 69 | if (!valid_stdin) { | 
| 69 | printf(_("aborted!\n\n")); | 70 | printf(_("aborted!\n\n")); | 
| 70 | printf(_("Console input/output is redirected. ")); | 71 | printf(_("Console input/output is redirected. ")); | 
| 71 | printf(_("Run 'make oldconfig' to update configuration.\n\n")); | 72 | printf(_("Run 'make oldconfig' to update configuration.\n\n")); | 
| @@ -427,43 +428,6 @@ static void check_conf(struct menu *menu) | |||
| 427 | check_conf(child); | 428 | check_conf(child); | 
| 428 | } | 429 | } | 
| 429 | 430 | ||
| 430 | static void conf_do_update(void) | ||
| 431 | { | ||
| 432 | /* Update until a loop caused no more changes */ | ||
| 433 | do { | ||
| 434 | conf_cnt = 0; | ||
| 435 | check_conf(&rootmenu); | ||
| 436 | } while (conf_cnt); | ||
| 437 | } | ||
| 438 | |||
| 439 | static int conf_silent_update(void) | ||
| 440 | { | ||
| 441 | const char *name; | ||
| 442 | |||
| 443 | if (conf_get_changed()) { | ||
| 444 | name = getenv("KCONFIG_NOSILENTUPDATE"); | ||
| 445 | if (name && *name) { | ||
| 446 | fprintf(stderr, | ||
| 447 | _("\n*** Kernel configuration requires explicit update.\n\n")); | ||
| 448 | return 1; | ||
| 449 | } | ||
| 450 | conf_do_update(); | ||
| 451 | } | ||
| 452 | return 0; | ||
| 453 | } | ||
| 454 | |||
| 455 | static int conf_update(void) | ||
| 456 | { | ||
| 457 | rootEntry = &rootmenu; | ||
| 458 | conf(&rootmenu); | ||
| 459 | if (input_mode == ask_all) { | ||
| 460 | input_mode = ask_silent; | ||
| 461 | valid_stdin = 1; | ||
| 462 | } | ||
| 463 | conf_do_update(); | ||
| 464 | return 0; | ||
| 465 | } | ||
| 466 | |||
| 467 | int main(int ac, char **av) | 431 | int main(int ac, char **av) | 
| 468 | { | 432 | { | 
| 469 | int opt; | 433 | int opt; | 
| @@ -477,11 +441,11 @@ int main(int ac, char **av) | |||
| 477 | while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) { | 441 | while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) { | 
| 478 | switch (opt) { | 442 | switch (opt) { | 
| 479 | case 'o': | 443 | case 'o': | 
| 480 | input_mode = ask_new; | 444 | input_mode = ask_silent; | 
| 481 | break; | 445 | break; | 
| 482 | case 's': | 446 | case 's': | 
| 483 | input_mode = ask_silent; | 447 | input_mode = ask_silent; | 
| 484 | valid_stdin = isatty(0) && isatty(1) && isatty(2); | 448 | sync_kconfig = 1; | 
| 485 | break; | 449 | break; | 
| 486 | case 'd': | 450 | case 'd': | 
| 487 | input_mode = set_default; | 451 | input_mode = set_default; | 
| @@ -519,6 +483,19 @@ int main(int ac, char **av) | |||
| 519 | name = av[optind]; | 483 | name = av[optind]; | 
| 520 | conf_parse(name); | 484 | conf_parse(name); | 
| 521 | //zconfdump(stdout); | 485 | //zconfdump(stdout); | 
| 486 | if (sync_kconfig) { | ||
| 487 | if (stat(".config", &tmpstat)) { | ||
| 488 | fprintf(stderr, _("***\n" | ||
| 489 | "*** You have not yet configured your kernel!\n" | ||
| 490 | "*** (missing kernel .config file)\n" | ||
| 491 | "***\n" | ||
| 492 | "*** Please run some configurator (e.g. \"make oldconfig\" or\n" | ||
| 493 | "*** \"make menuconfig\" or \"make xconfig\").\n" | ||
| 494 | "***\n")); | ||
| 495 | exit(1); | ||
| 496 | } | ||
| 497 | } | ||
| 498 | |||
| 522 | switch (input_mode) { | 499 | switch (input_mode) { | 
| 523 | case set_default: | 500 | case set_default: | 
| 524 | if (!defconfig_file) | 501 | if (!defconfig_file) | 
| @@ -531,16 +508,6 @@ int main(int ac, char **av) | |||
| 531 | } | 508 | } | 
| 532 | break; | 509 | break; | 
| 533 | case ask_silent: | 510 | case ask_silent: | 
| 534 | if (stat(".config", &tmpstat)) { | ||
| 535 | printf(_("***\n" | ||
| 536 | "*** You have not yet configured your kernel!\n" | ||
| 537 | "*** (missing kernel .config file)\n" | ||
| 538 | "***\n" | ||
| 539 | "*** Please run some configurator (e.g. \"make oldconfig\" or\n" | ||
| 540 | "*** \"make menuconfig\" or \"make xconfig\").\n" | ||
| 541 | "***\n")); | ||
| 542 | exit(1); | ||
| 543 | } | ||
| 544 | case ask_all: | 511 | case ask_all: | 
| 545 | case ask_new: | 512 | case ask_new: | 
| 546 | conf_read(NULL); | 513 | conf_read(NULL); | 
| @@ -569,6 +536,19 @@ int main(int ac, char **av) | |||
| 569 | default: | 536 | default: | 
| 570 | break; | 537 | break; | 
| 571 | } | 538 | } | 
| 539 | |||
| 540 | if (sync_kconfig) { | ||
| 541 | if (conf_get_changed()) { | ||
| 542 | name = getenv("KCONFIG_NOSILENTUPDATE"); | ||
| 543 | if (name && *name) { | ||
| 544 | fprintf(stderr, | ||
| 545 | _("\n*** Kernel configuration requires explicit update.\n\n")); | ||
| 546 | return 1; | ||
| 547 | } | ||
| 548 | } | ||
| 549 | valid_stdin = isatty(0) && isatty(1) && isatty(2); | ||
| 550 | } | ||
| 551 | |||
| 572 | switch (input_mode) { | 552 | switch (input_mode) { | 
| 573 | case set_no: | 553 | case set_no: | 
| 574 | conf_set_all_new_symbols(def_no); | 554 | conf_set_all_new_symbols(def_no); | 
| @@ -585,27 +565,38 @@ int main(int ac, char **av) | |||
| 585 | case set_default: | 565 | case set_default: | 
| 586 | conf_set_all_new_symbols(def_default); | 566 | conf_set_all_new_symbols(def_default); | 
| 587 | break; | 567 | break; | 
| 588 | case ask_silent: | ||
| 589 | case ask_new: | 568 | case ask_new: | 
| 590 | if (conf_silent_update()) | ||
| 591 | exit(1); | ||
| 592 | break; | ||
| 593 | case ask_all: | 569 | case ask_all: | 
| 594 | if (conf_update()) | 570 | rootEntry = &rootmenu; | 
| 595 | exit(1); | 571 | conf(&rootmenu); | 
| 572 | input_mode = ask_silent; | ||
| 573 | /* fall through */ | ||
| 574 | case ask_silent: | ||
| 575 | /* Update until a loop caused no more changes */ | ||
| 576 | do { | ||
| 577 | conf_cnt = 0; | ||
| 578 | check_conf(&rootmenu); | ||
| 579 | } while (conf_cnt); | ||
| 596 | break; | 580 | break; | 
| 597 | } | 581 | } | 
| 598 | 582 | ||
| 599 | if (conf_write(NULL)) { | 583 | if (sync_kconfig) { | 
| 600 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 584 | /* silentoldconfig is used during the build so we shall update autoconf. | 
| 601 | exit(1); | 585 | * All other commands are only used to generate a config. | 
| 602 | } | 586 | */ | 
| 603 | /* ask_silent is used during the build so we shall update autoconf. | 587 | if (conf_get_changed() && conf_write(NULL)) { | 
| 604 | * All other commands are only used to generate a config. | 588 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 
| 605 | */ | 589 | exit(1); | 
| 606 | if (input_mode == ask_silent && conf_write_autoconf()) { | 590 | } | 
| 607 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | 591 | if (conf_write_autoconf()) { | 
| 608 | return 1; | 592 | fprintf(stderr, _("\n*** Error during update of the kernel configuration.\n\n")); | 
| 593 | return 1; | ||
| 594 | } | ||
| 595 | } else { | ||
| 596 | if (conf_write(NULL)) { | ||
| 597 | fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n")); | ||
| 598 | exit(1); | ||
| 599 | } | ||
| 609 | } | 600 | } | 
| 610 | return 0; | 601 | return 0; | 
| 611 | } | 602 | } | 
