diff options
Diffstat (limited to 'scripts/kconfig/confdata.c')
| -rw-r--r-- | scripts/kconfig/confdata.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 583f6405f01d..f81f263b64f2 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
| @@ -457,6 +457,82 @@ static void conf_write_symbol(struct symbol *sym, enum symbol_type type, | |||
| 457 | } | 457 | } |
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | /* | ||
| 461 | * Write out a minimal config. | ||
| 462 | * All values that has default values are skipped as this is redundant. | ||
| 463 | */ | ||
| 464 | int conf_write_defconfig(const char *filename) | ||
| 465 | { | ||
| 466 | struct symbol *sym; | ||
| 467 | struct menu *menu; | ||
| 468 | FILE *out; | ||
| 469 | |||
| 470 | out = fopen(filename, "w"); | ||
| 471 | if (!out) | ||
| 472 | return 1; | ||
| 473 | |||
| 474 | sym_clear_all_valid(); | ||
| 475 | |||
| 476 | /* Traverse all menus to find all relevant symbols */ | ||
| 477 | menu = rootmenu.list; | ||
| 478 | |||
| 479 | while (menu != NULL) | ||
| 480 | { | ||
| 481 | sym = menu->sym; | ||
| 482 | if (sym == NULL) { | ||
| 483 | if (!menu_is_visible(menu)) | ||
| 484 | goto next_menu; | ||
| 485 | } else if (!sym_is_choice(sym)) { | ||
| 486 | sym_calc_value(sym); | ||
| 487 | if (!(sym->flags & SYMBOL_WRITE)) | ||
| 488 | goto next_menu; | ||
| 489 | sym->flags &= ~SYMBOL_WRITE; | ||
| 490 | /* If we cannot change the symbol - skip */ | ||
| 491 | if (!sym_is_changable(sym)) | ||
| 492 | goto next_menu; | ||
| 493 | /* If symbol equals to default value - skip */ | ||
| 494 | if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0) | ||
| 495 | goto next_menu; | ||
| 496 | |||
| 497 | /* | ||
| 498 | * If symbol is a choice value and equals to the | ||
| 499 | * default for a choice - skip. | ||
| 500 | * But only if value equal to "y". | ||
| 501 | */ | ||
| 502 | if (sym_is_choice_value(sym)) { | ||
| 503 | struct symbol *cs; | ||
| 504 | struct symbol *ds; | ||
| 505 | |||
| 506 | cs = prop_get_symbol(sym_get_choice_prop(sym)); | ||
| 507 | ds = sym_choice_default(cs); | ||
| 508 | if (sym == ds) { | ||
| 509 | if ((sym->type == S_BOOLEAN || | ||
| 510 | sym->type == S_TRISTATE) && | ||
| 511 | sym_get_tristate_value(sym) == yes) | ||
| 512 | goto next_menu; | ||
| 513 | } | ||
| 514 | } | ||
| 515 | conf_write_symbol(sym, sym->type, out, true); | ||
| 516 | } | ||
| 517 | next_menu: | ||
| 518 | if (menu->list != NULL) { | ||
| 519 | menu = menu->list; | ||
| 520 | } | ||
| 521 | else if (menu->next != NULL) { | ||
| 522 | menu = menu->next; | ||
| 523 | } else { | ||
| 524 | while ((menu = menu->parent)) { | ||
| 525 | if (menu->next != NULL) { | ||
| 526 | menu = menu->next; | ||
| 527 | break; | ||
| 528 | } | ||
| 529 | } | ||
| 530 | } | ||
| 531 | } | ||
| 532 | fclose(out); | ||
| 533 | return 0; | ||
| 534 | } | ||
| 535 | |||
| 460 | int conf_write(const char *name) | 536 | int conf_write(const char *name) |
| 461 | { | 537 | { |
| 462 | FILE *out; | 538 | FILE *out; |
