linux/scripts/kconfig/confdata.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
   3 * Released under the terms of the GNU GPL v2.0.
   4 */
   5
   6#include <sys/stat.h>
   7#include <ctype.h>
   8#include <errno.h>
   9#include <fcntl.h>
  10#include <stdarg.h>
  11#include <stdio.h>
  12#include <stdlib.h>
  13#include <string.h>
  14#include <time.h>
  15#include <unistd.h>
  16
  17#include "lkc.h"
  18
  19static void conf_warning(const char *fmt, ...)
  20        __attribute__ ((format (printf, 1, 2)));
  21
  22static void conf_message(const char *fmt, ...)
  23        __attribute__ ((format (printf, 1, 2)));
  24
  25static const char *conf_filename;
  26static int conf_lineno, conf_warnings, conf_unsaved;
  27
  28const char conf_defname[] = "arch/$ARCH/defconfig";
  29
  30static void conf_warning(const char *fmt, ...)
  31{
  32        va_list ap;
  33        va_start(ap, fmt);
  34        fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno);
  35        vfprintf(stderr, fmt, ap);
  36        fprintf(stderr, "\n");
  37        va_end(ap);
  38        conf_warnings++;
  39}
  40
  41static void conf_default_message_callback(const char *fmt, va_list ap)
  42{
  43        printf("#\n# ");
  44        vprintf(fmt, ap);
  45        printf("\n#\n");
  46}
  47
  48static void (*conf_message_callback) (const char *fmt, va_list ap) =
  49        conf_default_message_callback;
  50void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
  51{
  52        conf_message_callback = fn;
  53}
  54
  55static void conf_message(const char *fmt, ...)
  56{
  57        va_list ap;
  58
  59        va_start(ap, fmt);
  60        if (conf_message_callback)
  61                conf_message_callback(fmt, ap);
  62}
  63
  64const char *conf_get_configname(void)
  65{
  66        char *name = getenv("KCONFIG_CONFIG");
  67
  68        return name ? name : ".config";
  69}
  70
  71const char *conf_get_autoconfig_name(void)
  72{
  73        char *name = getenv("KCONFIG_AUTOCONFIG");
  74
  75        return name ? name : "include/config/auto.conf";
  76}
  77
  78static char *conf_expand_value(const char *in)
  79{
  80        struct symbol *sym;
  81        const char *src;
  82        static char res_value[SYMBOL_MAXLENGTH];
  83        char *dst, name[SYMBOL_MAXLENGTH];
  84
  85        res_value[0] = 0;
  86        dst = name;
  87        while ((src = strchr(in, '$'))) {
  88                strncat(res_value, in, src - in);
  89                src++;
  90                dst = name;
  91                while (isalnum(*src) || *src == '_')
  92                        *dst++ = *src++;
  93                *dst = 0;
  94                sym = sym_lookup(name, 0);
  95                sym_calc_value(sym);
  96                strcat(res_value, sym_get_string_value(sym));
  97                in = src;
  98        }
  99        strcat(res_value, in);
 100
 101        return res_value;
 102}
 103
 104char *conf_get_default_confname(void)
 105{
 106        struct stat buf;
 107        static char fullname[PATH_MAX+1];
 108        char *env, *name;
 109
 110        name = conf_expand_value(conf_defname);
 111        env = getenv(SRCTREE);
 112        if (env) {
 113                sprintf(fullname, "%s/%s", env, name);
 114                if (!stat(fullname, &buf))
 115                        return fullname;
 116        }
 117        return name;
 118}
 119
 120static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
 121{
 122        char *p2;
 123
 124        switch (sym->type) {
 125        case S_TRISTATE:
 126                if (p[0] == 'm') {
 127                        sym->def[def].tri = mod;
 128                        sym->flags |= def_flags;
 129                        break;
 130                }
 131                /* fall through */
 132        case S_BOOLEAN:
 133                if (p[0] == 'y') {
 134                        sym->def[def].tri = yes;
 135                        sym->flags |= def_flags;
 136                        break;
 137                }
 138                if (p[0] == 'n') {
 139                        sym->def[def].tri = no;
 140                        sym->flags |= def_flags;
 141                        break;
 142                }
 143                conf_warning("symbol value '%s' invalid for %s", p, sym->name);
 144                return 1;
 145        case S_OTHER:
 146                if (*p != '"') {
 147                        for (p2 = p; *p2 && !isspace(*p2); p2++)
 148                                ;
 149                        sym->type = S_STRING;
 150                        goto done;
 151                }
 152                /* fall through */
 153        case S_STRING:
 154                if (*p++ != '"')
 155                        break;
 156                for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
 157                        if (*p2 == '"') {
 158                                *p2 = 0;
 159                                break;
 160                        }
 161                        memmove(p2, p2 + 1, strlen(p2));
 162                }
 163                if (!p2) {
 164                        conf_warning("invalid string found");
 165                        return 1;
 166                }
 167                /* fall through */
 168        case S_INT:
 169        case S_HEX:
 170        done:
 171                if (sym_string_valid(sym, p)) {
 172                        sym->def[def].val = strdup(p);
 173                        sym->flags |= def_flags;
 174                } else {
 175                        conf_warning("symbol value '%s' invalid for %s", p, sym->name);
 176                        return 1;
 177                }
 178                break;
 179        default:
 180                ;
 181        }
 182        return 0;
 183}
 184
 185int conf_read_simple(const char *name, int def)
 186{
 187        FILE *in = NULL;
 188        char line[1024];
 189        char *p, *p2;
 190        struct symbol *sym;
 191        int i, def_flags;
 192
 193        if (name) {
 194                in = zconf_fopen(name);
 195        } else {
 196                struct property *prop;
 197
 198                name = conf_get_configname();
 199                in = zconf_fopen(name);
 200                if (in)
 201                        goto load;
 202                sym_add_change_count(1);
 203                if (!sym_defconfig_list) {
 204                        if (modules_sym)
 205                                sym_calc_value(modules_sym);
 206                        return 1;
 207                }
 208
 209                for_all_defaults(sym_defconfig_list, prop) {
 210                        if (expr_calc_value(prop->visible.expr) == no ||
 211                            prop->expr->type != E_SYMBOL)
 212                                continue;
 213                        name = conf_expand_value(prop->expr->left.sym->name);
 214                        in = zconf_fopen(name);
 215                        if (in) {
 216                                conf_message(_("using defaults found in %s"),
 217                                         name);
 218                                goto load;
 219                        }
 220                }
 221        }
 222        if (!in)
 223                return 1;
 224
 225load:
 226        conf_filename = name;
 227        conf_lineno = 0;
 228        conf_warnings = 0;
 229        conf_unsaved = 0;
 230
 231        def_flags = SYMBOL_DEF << def;
 232        for_all_symbols(i, sym) {
 233                sym->flags |= SYMBOL_CHANGED;
 234                sym->flags &= ~(def_flags|SYMBOL_VALID);
 235                if (sym_is_choice(sym))
 236                        sym->flags |= def_flags;
 237                switch (sym->type) {
 238                case S_INT:
 239                case S_HEX:
 240                case S_STRING:
 241                        if (sym->def[def].val)
 242                                free(sym->def[def].val);
 243                        /* fall through */
 244                default:
 245                        sym->def[def].val = NULL;
 246                        sym->def[def].tri = no;
 247                }
 248        }
 249
 250        while (fgets(line, sizeof(line), in)) {
 251                conf_lineno++;
 252                sym = NULL;
 253                if (line[0] == '#') {
 254                        if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
 255                                continue;
 256                        p = strchr(line + 2 + strlen(CONFIG_), ' ');
 257                        if (!p)
 258                                continue;
 259                        *p++ = 0;
 260                        if (strncmp(p, "is not set", 10))
 261                                continue;
 262                        if (def == S_DEF_USER) {
 263                                sym = sym_find(line + 2 + strlen(CONFIG_));
 264                                if (!sym) {
 265                                        sym_add_change_count(1);
 266                                        goto setsym;
 267                                }
 268                        } else {
 269                                sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
 270                                if (sym->type == S_UNKNOWN)
 271                                        sym->type = S_BOOLEAN;
 272                        }
 273                        if (sym->flags & def_flags) {
 274                                conf_warning("override: reassigning to symbol %s", sym->name);
 275                        }
 276                        switch (sym->type) {
 277                        case S_BOOLEAN:
 278                        case S_TRISTATE:
 279                                sym->def[def].tri = no;
 280                                sym->flags |= def_flags;
 281                                break;
 282                        default:
 283                                ;
 284                        }
 285                } else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
 286                        p = strchr(line + strlen(CONFIG_), '=');
 287                        if (!p)
 288                                continue;
 289                        *p++ = 0;
 290                        p2 = strchr(p, '\n');
 291                        if (p2) {
 292                                *p2-- = 0;
 293                                if (*p2 == '\r')
 294                                        *p2 = 0;
 295                        }
 296                        if (def == S_DEF_USER) {
 297                                sym = sym_find(line + strlen(CONFIG_));
 298                                if (!sym) {
 299                                        sym_add_change_count(1);
 300                                        goto setsym;
 301                                }
 302                        } else {
 303                                sym = sym_lookup(line + strlen(CONFIG_), 0);
 304                                if (sym->type == S_UNKNOWN)
 305                                        sym->type = S_OTHER;
 306                        }
 307                        if (sym->flags & def_flags) {
 308                                conf_warning("override: reassigning to symbol %s", sym->name);
 309                        }
 310                        if (conf_set_sym_val(sym, def, def_flags, p))
 311                                continue;
 312                } else {
 313                        if (line[0] != '\r' && line[0] != '\n')
 314                                conf_warning("unexpected data");
 315                        continue;
 316                }
 317setsym:
 318                if (sym && sym_is_choice_value(sym)) {
 319                        struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
 320                        switch (sym->def[def].tri) {
 321                        case no:
 322                                break;
 323                        case mod:
 324                                if (cs->def[def].tri == yes) {
 325                                        conf_warning("%s creates inconsistent choice state", sym->name);
 326                                        cs->flags &= ~def_flags;
 327                                }
 328                                break;
 329                        case yes:
 330                                if (cs->def[def].tri != no)
 331                                        conf_warning("override: %s changes choice state", sym->name);
 332                                cs->def[def].val = sym;
 333                                break;
 334                        }
 335                        cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
 336                }
 337        }
 338        fclose(in);
 339
 340        if (modules_sym)
 341                sym_calc_value(modules_sym);
 342        return 0;
 343}
 344
 345int conf_read(const char *name)
 346{
 347        struct symbol *sym, *choice_sym;
 348        struct property *prop;
 349        struct expr *e;
 350        int i, flags;
 351
 352        sym_set_change_count(0);
 353
 354        if (conf_read_simple(name, S_DEF_USER))
 355                return 1;
 356
 357        for_all_symbols(i, sym) {
 358                sym_calc_value(sym);
 359                if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
 360                        goto sym_ok;
 361                if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
 362                        /* check that calculated value agrees with saved value */
 363                        switch (sym->type) {
 364                        case S_BOOLEAN:
 365                        case S_TRISTATE:
 366                                if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
 367                                        break;
 368                                if (!sym_is_choice(sym))
 369                                        goto sym_ok;
 370                                /* fall through */
 371                        default:
 372                                if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
 373                                        goto sym_ok;
 374                                break;
 375                        }
 376                } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE))
 377                        /* no previous value and not saved */
 378                        goto sym_ok;
 379                conf_unsaved++;
 380                /* maybe print value in verbose mode... */
 381        sym_ok:
 382                if (!sym_is_choice(sym))
 383                        continue;
 384                /* The choice symbol only has a set value (and thus is not new)
 385                 * if all its visible childs have values.
 386                 */
 387                prop = sym_get_choice_prop(sym);
 388                flags = sym->flags;
 389                expr_list_for_each_sym(prop->expr, e, choice_sym)
 390                        if (choice_sym->visible != no)
 391                                flags &= choice_sym->flags;
 392                sym->flags &= flags | ~SYMBOL_DEF_USER;
 393        }
 394
 395        for_all_symbols(i, sym) {
 396                if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
 397                        /* Reset values of generates values, so they'll appear
 398                         * as new, if they should become visible, but that
 399                         * doesn't quite work if the Kconfig and the saved
 400                         * configuration disagree.
 401                         */
 402                        if (sym->visible == no && !conf_unsaved)
 403                                sym->flags &= ~SYMBOL_DEF_USER;
 404                        switch (sym->type) {
 405                        case S_STRING:
 406                        case S_INT:
 407                        case S_HEX:
 408                                /* Reset a string value if it's out of range */
 409                                if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
 410                                        break;
 411                                sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
 412                                conf_unsaved++;
 413                                break;
 414                        default:
 415                                break;
 416                        }
 417                }
 418        }
 419
 420        sym_add_change_count(conf_warnings || conf_unsaved);
 421
 422        return 0;
 423}
 424
 425/*
 426 * Kconfig configuration printer
 427 *
 428 * This printer is used when generating the resulting configuration after
 429 * kconfig invocation and `defconfig' files. Unset symbol might be omitted by
 430 * passing a non-NULL argument to the printer.
 431 *
 432 */
 433static void
 434kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 435{
 436
 437        switch (sym->type) {
 438        case S_BOOLEAN:
 439        case S_TRISTATE:
 440                if (*value == 'n') {
 441                        bool skip_unset = (arg != NULL);
 442
 443                        if (!skip_unset)
 444                                fprintf(fp, "# %s%s is not set\n",
 445                                    CONFIG_, sym->name);
 446                        return;
 447                }
 448                break;
 449        default:
 450                break;
 451        }
 452
 453        fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
 454}
 455
 456static void
 457kconfig_print_comment(FILE *fp, const char *value, void *arg)
 458{
 459        const char *p = value;
 460        size_t l;
 461
 462        for (;;) {
 463                l = strcspn(p, "\n");
 464                fprintf(fp, "#");
 465                if (l) {
 466                        fprintf(fp, " ");
 467                        xfwrite(p, l, 1, fp);
 468                        p += l;
 469                }
 470                fprintf(fp, "\n");
 471                if (*p++ == '\0')
 472                        break;
 473        }
 474}
 475
 476static struct conf_printer kconfig_printer_cb =
 477{
 478        .print_symbol = kconfig_print_symbol,
 479        .print_comment = kconfig_print_comment,
 480};
 481
 482/*
 483 * Header printer
 484 *
 485 * This printer is used when generating the `include/generated/autoconf.h' file.
 486 */
 487static void
 488header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 489{
 490
 491        switch (sym->type) {
 492        case S_BOOLEAN:
 493        case S_TRISTATE: {
 494                const char *suffix = "";
 495
 496                switch (*value) {
 497                case 'n':
 498                        break;
 499                case 'm':
 500                        suffix = "_MODULE";
 501                        /* fall through */
 502                default:
 503                        fprintf(fp, "#define %s%s%s 1\n",
 504                            CONFIG_, sym->name, suffix);
 505                }
 506                break;
 507        }
 508        case S_HEX: {
 509                const char *prefix = "";
 510
 511                if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
 512                        prefix = "0x";
 513                fprintf(fp, "#define %s%s %s%s\n",
 514                    CONFIG_, sym->name, prefix, value);
 515                break;
 516        }
 517        case S_STRING:
 518        case S_INT:
 519                fprintf(fp, "#define %s%s %s\n",
 520                    CONFIG_, sym->name, value);
 521                break;
 522        default:
 523                break;
 524        }
 525
 526}
 527
 528static void
 529header_print_comment(FILE *fp, const char *value, void *arg)
 530{
 531        const char *p = value;
 532        size_t l;
 533
 534        fprintf(fp, "/*\n");
 535        for (;;) {
 536                l = strcspn(p, "\n");
 537                fprintf(fp, " *");
 538                if (l) {
 539                        fprintf(fp, " ");
 540                        xfwrite(p, l, 1, fp);
 541                        p += l;
 542                }
 543                fprintf(fp, "\n");
 544                if (*p++ == '\0')
 545                        break;
 546        }
 547        fprintf(fp, " */\n");
 548}
 549
 550static struct conf_printer header_printer_cb =
 551{
 552        .print_symbol = header_print_symbol,
 553        .print_comment = header_print_comment,
 554};
 555
 556/*
 557 * Generate the __enabled_CONFIG_* and __enabled_CONFIG_*_MODULE macros for
 558 * use by the IS_{ENABLED,BUILTIN,MODULE} macros. The _MODULE variant is
 559 * generated even for booleans so that the IS_ENABLED() macro works.
 560 */
 561static void
 562header_print__enabled_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 563{
 564
 565        switch (sym->type) {
 566        case S_BOOLEAN:
 567        case S_TRISTATE: {
 568                fprintf(fp, "#define __enabled_" CONFIG_ "%s %d\n",
 569                    sym->name, (*value == 'y'));
 570                fprintf(fp, "#define __enabled_" CONFIG_ "%s_MODULE %d\n",
 571                    sym->name, (*value == 'm'));
 572                break;
 573        }
 574        default:
 575                break;
 576        }
 577}
 578
 579static struct conf_printer header__enabled_printer_cb =
 580{
 581        .print_symbol = header_print__enabled_symbol,
 582        .print_comment = header_print_comment,
 583};
 584
 585/*
 586 * Tristate printer
 587 *
 588 * This printer is used when generating the `include/config/tristate.conf' file.
 589 */
 590static void
 591tristate_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
 592{
 593
 594        if (sym->type == S_TRISTATE && *value != 'n')
 595                fprintf(fp, "%s%s=%c\n", CONFIG_, sym->name, (char)toupper(*value));
 596}
 597
 598static struct conf_printer tristate_printer_cb =
 599{
 600        .print_symbol = tristate_print_symbol,
 601        .print_comment = kconfig_print_comment,
 602};
 603
 604static void conf_write_symbol(FILE *fp, struct symbol *sym,
 605                              struct conf_printer *printer, void *printer_arg)
 606{
 607        const char *str;
 608
 609        switch (sym->type) {
 610        case S_OTHER:
 611        case S_UNKNOWN:
 612                break;
 613        case S_STRING:
 614                str = sym_get_string_value(sym);
 615                str = sym_escape_string_value(str);
 616                printer->print_symbol(fp, sym, str, printer_arg);
 617                free((void *)str);
 618                break;
 619        default:
 620                str = sym_get_string_value(sym);
 621                printer->print_symbol(fp, sym, str, printer_arg);
 622        }
 623}
 624
 625static void
 626conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
 627{
 628        char buf[256];
 629
 630        snprintf(buf, sizeof(buf),
 631            "\n"
 632            "Automatically generated file; DO NOT EDIT.\n"
 633            "%s\n",
 634            rootmenu.prompt->text);
 635
 636        printer->print_comment(fp, buf, printer_arg);
 637}
 638
 639/*
 640 * Write out a minimal config.
 641 * All values that has default values are skipped as this is redundant.
 642 */
 643int conf_write_defconfig(const char *filename)
 644{
 645        struct symbol *sym;
 646        struct menu *menu;
 647        FILE *out;
 648
 649        out = fopen(filename, "w");
 650        if (!out)
 651                return 1;
 652
 653        sym_clear_all_valid();
 654
 655        /* Traverse all menus to find all relevant symbols */
 656        menu = rootmenu.list;
 657
 658        while (menu != NULL)
 659        {
 660                sym = menu->sym;
 661                if (sym == NULL) {
 662                        if (!menu_is_visible(menu))
 663                                goto next_menu;
 664                } else if (!sym_is_choice(sym)) {
 665                        sym_calc_value(sym);
 666                        if (!(sym->flags & SYMBOL_WRITE))
 667                                goto next_menu;
 668                        sym->flags &= ~SYMBOL_WRITE;
 669                        /* If we cannot change the symbol - skip */
 670                        if (!sym_is_changable(sym))
 671                                goto next_menu;
 672                        /* If symbol equals to default value - skip */
 673                        if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
 674                                goto next_menu;
 675
 676                        /*
 677                         * If symbol is a choice value and equals to the
 678                         * default for a choice - skip.
 679                         * But only if value is bool and equal to "y" and
 680                         * choice is not "optional".
 681                         * (If choice is "optional" then all values can be "n")
 682                         */
 683                        if (sym_is_choice_value(sym)) {
 684                                struct symbol *cs;
 685                                struct symbol *ds;
 686
 687                                cs = prop_get_symbol(sym_get_choice_prop(sym));
 688                                ds = sym_choice_default(cs);
 689                                if (!sym_is_optional(cs) && sym == ds) {
 690                                        if ((sym->type == S_BOOLEAN) &&
 691                                            sym_get_tristate_value(sym) == yes)
 692                                                goto next_menu;
 693                                }
 694                        }
 695                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
 696                }
 697next_menu:
 698                if (menu->list != NULL) {
 699                        menu = menu->list;
 700                }
 701                else if (menu->next != NULL) {
 702                        menu = menu->next;
 703                } else {
 704                        while ((menu = menu->parent)) {
 705                                if (menu->next != NULL) {
 706                                        menu = menu->next;
 707                                        break;
 708                                }
 709                        }
 710                }
 711        }
 712        fclose(out);
 713        return 0;
 714}
 715
 716int conf_write(const char *name)
 717{
 718        FILE *out;
 719        struct symbol *sym;
 720        struct menu *menu;
 721        const char *basename;
 722        const char *str;
 723        char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
 724        char *env;
 725
 726        dirname[0] = 0;
 727        if (name && name[0]) {
 728                struct stat st;
 729                char *slash;
 730
 731                if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
 732                        strcpy(dirname, name);
 733                        strcat(dirname, "/");
 734                        basename = conf_get_configname();
 735                } else if ((slash = strrchr(name, '/'))) {
 736                        int size = slash - name + 1;
 737                        memcpy(dirname, name, size);
 738                        dirname[size] = 0;
 739                        if (slash[1])
 740                                basename = slash + 1;
 741                        else
 742                                basename = conf_get_configname();
 743                } else
 744                        basename = name;
 745        } else
 746                basename = conf_get_configname();
 747
 748        sprintf(newname, "%s%s", dirname, basename);
 749        env = getenv("KCONFIG_OVERWRITECONFIG");
 750        if (!env || !*env) {
 751                sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
 752                out = fopen(tmpname, "w");
 753        } else {
 754                *tmpname = 0;
 755                out = fopen(newname, "w");
 756        }
 757        if (!out)
 758                return 1;
 759
 760        conf_write_heading(out, &kconfig_printer_cb, NULL);
 761
 762        if (!conf_get_changed())
 763                sym_clear_all_valid();
 764
 765        menu = rootmenu.list;
 766        while (menu) {
 767                sym = menu->sym;
 768                if (!sym) {
 769                        if (!menu_is_visible(menu))
 770                                goto next;
 771                        str = menu_get_prompt(menu);
 772                        fprintf(out, "\n"
 773                                     "#\n"
 774                                     "# %s\n"
 775                                     "#\n", str);
 776                } else if (!(sym->flags & SYMBOL_CHOICE)) {
 777                        sym_calc_value(sym);
 778                        if (!(sym->flags & SYMBOL_WRITE))
 779                                goto next;
 780                        sym->flags &= ~SYMBOL_WRITE;
 781
 782                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
 783                }
 784
 785next:
 786                if (menu->list) {
 787                        menu = menu->list;
 788                        continue;
 789                }
 790                if (menu->next)
 791                        menu = menu->next;
 792                else while ((menu = menu->parent)) {
 793                        if (menu->next) {
 794                                menu = menu->next;
 795                                break;
 796                        }
 797                }
 798        }
 799        fclose(out);
 800
 801        if (*tmpname) {
 802                strcat(dirname, basename);
 803                strcat(dirname, ".old");
 804                rename(newname, dirname);
 805                if (rename(tmpname, newname))
 806                        return 1;
 807        }
 808
 809        conf_message(_("configuration written to %s"), newname);
 810
 811        sym_set_change_count(0);
 812
 813        return 0;
 814}
 815
 816static int conf_split_config(void)
 817{
 818        const char *name;
 819        char path[PATH_MAX+1];
 820        char *s, *d, c;
 821        struct symbol *sym;
 822        struct stat sb;
 823        int res, i, fd;
 824
 825        name = conf_get_autoconfig_name();
 826        conf_read_simple(name, S_DEF_AUTO);
 827
 828        if (chdir("include/config"))
 829                return 1;
 830
 831        res = 0;
 832        for_all_symbols(i, sym) {
 833                sym_calc_value(sym);
 834                if ((sym->flags & SYMBOL_AUTO) || !sym->name)
 835                        continue;
 836                if (sym->flags & SYMBOL_WRITE) {
 837                        if (sym->flags & SYMBOL_DEF_AUTO) {
 838                                /*
 839                                 * symbol has old and new value,
 840                                 * so compare them...
 841                                 */
 842                                switch (sym->type) {
 843                                case S_BOOLEAN:
 844                                case S_TRISTATE:
 845                                        if (sym_get_tristate_value(sym) ==
 846                                            sym->def[S_DEF_AUTO].tri)
 847                                                continue;
 848                                        break;
 849                                case S_STRING:
 850                                case S_HEX:
 851                                case S_INT:
 852                                        if (!strcmp(sym_get_string_value(sym),
 853                                                    sym->def[S_DEF_AUTO].val))
 854                                                continue;
 855                                        break;
 856                                default:
 857                                        break;
 858                                }
 859                        } else {
 860                                /*
 861                                 * If there is no old value, only 'no' (unset)
 862                                 * is allowed as new value.
 863                                 */
 864                                switch (sym->type) {
 865                                case S_BOOLEAN:
 866                                case S_TRISTATE:
 867                                        if (sym_get_tristate_value(sym) == no)
 868                                                continue;
 869                                        break;
 870                                default:
 871                                        break;
 872                                }
 873                        }
 874                } else if (!(sym->flags & SYMBOL_DEF_AUTO))
 875                        /* There is neither an old nor a new value. */
 876                        continue;
 877                /* else
 878                 *      There is an old value, but no new value ('no' (unset)
 879                 *      isn't saved in auto.conf, so the old value is always
 880                 *      different from 'no').
 881                 */
 882
 883                /* Replace all '_' and append ".h" */
 884                s = sym->name;
 885                d = path;
 886                while ((c = *s++)) {
 887                        c = tolower(c);
 888                        *d++ = (c == '_') ? '/' : c;
 889                }
 890                strcpy(d, ".h");
 891
 892                /* Assume directory path already exists. */
 893                fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 894                if (fd == -1) {
 895                        if (errno != ENOENT) {
 896                                res = 1;
 897                                break;
 898                        }
 899                        /*
 900                         * Create directory components,
 901                         * unless they exist already.
 902                         */
 903                        d = path;
 904                        while ((d = strchr(d, '/'))) {
 905                                *d = 0;
 906                                if (stat(path, &sb) && mkdir(path, 0755)) {
 907                                        res = 1;
 908                                        goto out;
 909                                }
 910                                *d++ = '/';
 911                        }
 912                        /* Try it again. */
 913                        fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
 914                        if (fd == -1) {
 915                                res = 1;
 916                                break;
 917                        }
 918                }
 919                close(fd);
 920        }
 921out:
 922        if (chdir("../.."))
 923                return 1;
 924
 925        return res;
 926}
 927
 928int conf_write_autoconf(void)
 929{
 930        struct symbol *sym;
 931        const char *name;
 932        FILE *out, *tristate, *out_h;
 933        int i;
 934
 935        sym_clear_all_valid();
 936
 937        file_write_dep("include/config/auto.conf.cmd");
 938
 939        if (conf_split_config())
 940                return 1;
 941
 942        out = fopen(".tmpconfig", "w");
 943        if (!out)
 944                return 1;
 945
 946        tristate = fopen(".tmpconfig_tristate", "w");
 947        if (!tristate) {
 948                fclose(out);
 949                return 1;
 950        }
 951
 952        out_h = fopen(".tmpconfig.h", "w");
 953        if (!out_h) {
 954                fclose(out);
 955                fclose(tristate);
 956                return 1;
 957        }
 958
 959        conf_write_heading(out, &kconfig_printer_cb, NULL);
 960
 961        conf_write_heading(tristate, &tristate_printer_cb, NULL);
 962
 963        conf_write_heading(out_h, &header_printer_cb, NULL);
 964
 965        for_all_symbols(i, sym) {
 966                if (!sym->name)
 967                        continue;
 968
 969                sym_calc_value(sym);
 970
 971                conf_write_symbol(out_h, sym, &header__enabled_printer_cb, NULL);
 972
 973                if (!(sym->flags & SYMBOL_WRITE))
 974                        continue;
 975
 976                conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
 977
 978                conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1);
 979
 980                conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
 981        }
 982        fclose(out);
 983        fclose(tristate);
 984        fclose(out_h);
 985
 986        name = getenv("KCONFIG_AUTOHEADER");
 987        if (!name)
 988                name = "include/generated/autoconf.h";
 989        if (rename(".tmpconfig.h", name))
 990                return 1;
 991        name = getenv("KCONFIG_TRISTATE");
 992        if (!name)
 993                name = "include/config/tristate.conf";
 994        if (rename(".tmpconfig_tristate", name))
 995                return 1;
 996        name = conf_get_autoconfig_name();
 997        /*
 998         * This must be the last step, kbuild has a dependency on auto.conf
 999         * and this marks the successful completion of the previous steps.
1000         */
1001        if (rename(".tmpconfig", name))
1002                return 1;
1003
1004        return 0;
1005}
1006
1007static int sym_change_count;
1008static void (*conf_changed_callback)(void);
1009
1010void sym_set_change_count(int count)
1011{
1012        int _sym_change_count = sym_change_count;
1013        sym_change_count = count;
1014        if (conf_changed_callback &&
1015            (bool)_sym_change_count != (bool)count)
1016                conf_changed_callback();
1017}
1018
1019void sym_add_change_count(int count)
1020{
1021        sym_set_change_count(count + sym_change_count);
1022}
1023
1024bool conf_get_changed(void)
1025{
1026        return sym_change_count;
1027}
1028
1029void conf_set_changed_callback(void (*fn)(void))
1030{
1031        conf_changed_callback = fn;
1032}
1033
1034static void randomize_choice_values(struct symbol *csym)
1035{
1036        struct property *prop;
1037        struct symbol *sym;
1038        struct expr *e;
1039        int cnt, def;
1040
1041        /*
1042         * If choice is mod then we may have more items selected
1043         * and if no then no-one.
1044         * In both cases stop.
1045         */
1046        if (csym->curr.tri != yes)
1047                return;
1048
1049        prop = sym_get_choice_prop(csym);
1050
1051        /* count entries in choice block */
1052        cnt = 0;
1053        expr_list_for_each_sym(prop->expr, e, sym)
1054                cnt++;
1055
1056        /*
1057         * find a random value and set it to yes,
1058         * set the rest to no so we have only one set
1059         */
1060        def = (rand() % cnt);
1061
1062        cnt = 0;
1063        expr_list_for_each_sym(prop->expr, e, sym) {
1064                if (def == cnt++) {
1065                        sym->def[S_DEF_USER].tri = yes;
1066                        csym->def[S_DEF_USER].val = sym;
1067                }
1068                else {
1069                        sym->def[S_DEF_USER].tri = no;
1070                }
1071        }
1072        csym->flags |= SYMBOL_DEF_USER;
1073        /* clear VALID to get value calculated */
1074        csym->flags &= ~(SYMBOL_VALID);
1075}
1076
1077static void set_all_choice_values(struct symbol *csym)
1078{
1079        struct property *prop;
1080        struct symbol *sym;
1081        struct expr *e;
1082
1083        prop = sym_get_choice_prop(csym);
1084
1085        /*
1086         * Set all non-assinged choice values to no
1087         */
1088        expr_list_for_each_sym(prop->expr, e, sym) {
1089                if (!sym_has_value(sym))
1090                        sym->def[S_DEF_USER].tri = no;
1091        }
1092        csym->flags |= SYMBOL_DEF_USER;
1093        /* clear VALID to get value calculated */
1094        csym->flags &= ~(SYMBOL_VALID);
1095}
1096
1097void conf_set_all_new_symbols(enum conf_def_mode mode)
1098{
1099        struct symbol *sym, *csym;
1100        int i, cnt;
1101
1102        for_all_symbols(i, sym) {
1103                if (sym_has_value(sym))
1104                        continue;
1105                switch (sym_get_type(sym)) {
1106                case S_BOOLEAN:
1107                case S_TRISTATE:
1108                        switch (mode) {
1109                        case def_yes:
1110                                sym->def[S_DEF_USER].tri = yes;
1111                                break;
1112                        case def_mod:
1113                                sym->def[S_DEF_USER].tri = mod;
1114                                break;
1115                        case def_no:
1116                                sym->def[S_DEF_USER].tri = no;
1117                                break;
1118                        case def_random:
1119                                cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
1120                                sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
1121                                break;
1122                        default:
1123                                continue;
1124                        }
1125                        if (!(sym_is_choice(sym) && mode == def_random))
1126                                sym->flags |= SYMBOL_DEF_USER;
1127                        break;
1128                default:
1129                        break;
1130                }
1131
1132        }
1133
1134        sym_clear_all_valid();
1135
1136        /*
1137         * We have different type of choice blocks.
1138         * If curr.tri equals to mod then we can select several
1139         * choice symbols in one block.
1140         * In this case we do nothing.
1141         * If curr.tri equals yes then only one symbol can be
1142         * selected in a choice block and we set it to yes,
1143         * and the rest to no.
1144         */
1145        for_all_symbols(i, csym) {
1146                if (sym_has_value(csym) || !sym_is_choice(csym))
1147                        continue;
1148
1149                sym_calc_value(csym);
1150                if (mode == def_random)
1151                        randomize_choice_values(csym);
1152                else
1153                        set_all_choice_values(csym);
1154        }
1155}
1156
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.