confdata.c revision 002d27b1b70f6d574c816ef265147704c4e951f1
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 <fcntl.h> 9#include <stdio.h> 10#include <stdlib.h> 11#include <string.h> 12#include <time.h> 13#include <unistd.h> 14 15#define LKC_DIRECT_LINK 16#include "lkc.h" 17 18static void conf_warning(const char *fmt, ...) 19 __attribute__ ((format (printf, 1, 2))); 20 21static const char *conf_filename; 22static int conf_lineno, conf_warnings, conf_unsaved; 23 24const char conf_defname[] = "arch/$ARCH/defconfig"; 25 26static void conf_warning(const char *fmt, ...) 27{ 28 va_list ap; 29 va_start(ap, fmt); 30 fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno); 31 vfprintf(stderr, fmt, ap); 32 fprintf(stderr, "\n"); 33 va_end(ap); 34 conf_warnings++; 35} 36 37const char *conf_get_configname(void) 38{ 39 char *name = getenv("KCONFIG_CONFIG"); 40 41 return name ? name : ".config"; 42} 43 44static char *conf_expand_value(const char *in) 45{ 46 struct symbol *sym; 47 const char *src; 48 static char res_value[SYMBOL_MAXLENGTH]; 49 char *dst, name[SYMBOL_MAXLENGTH]; 50 51 res_value[0] = 0; 52 dst = name; 53 while ((src = strchr(in, '$'))) { 54 strncat(res_value, in, src - in); 55 src++; 56 dst = name; 57 while (isalnum(*src) || *src == '_') 58 *dst++ = *src++; 59 *dst = 0; 60 sym = sym_lookup(name, 0); 61 sym_calc_value(sym); 62 strcat(res_value, sym_get_string_value(sym)); 63 in = src; 64 } 65 strcat(res_value, in); 66 67 return res_value; 68} 69 70char *conf_get_default_confname(void) 71{ 72 struct stat buf; 73 static char fullname[PATH_MAX+1]; 74 char *env, *name; 75 76 name = conf_expand_value(conf_defname); 77 env = getenv(SRCTREE); 78 if (env) { 79 sprintf(fullname, "%s/%s", env, name); 80 if (!stat(fullname, &buf)) 81 return fullname; 82 } 83 return name; 84} 85 86int conf_read_simple(const char *name, int def) 87{ 88 FILE *in = NULL; 89 char line[1024]; 90 char *p, *p2; 91 struct symbol *sym; 92 int i, def_flags; 93 94 if (name) { 95 in = zconf_fopen(name); 96 } else { 97 struct property *prop; 98 99 name = conf_get_configname(); 100 in = zconf_fopen(name); 101 if (in) 102 goto load; 103 sym_change_count++; 104 if (!sym_defconfig_list) 105 return 1; 106 107 for_all_defaults(sym_defconfig_list, prop) { 108 if (expr_calc_value(prop->visible.expr) == no || 109 prop->expr->type != E_SYMBOL) 110 continue; 111 name = conf_expand_value(prop->expr->left.sym->name); 112 in = zconf_fopen(name); 113 if (in) { 114 printf(_("#\n" 115 "# using defaults found in %s\n" 116 "#\n"), name); 117 goto load; 118 } 119 } 120 } 121 if (!in) 122 return 1; 123 124load: 125 conf_filename = name; 126 conf_lineno = 0; 127 conf_warnings = 0; 128 conf_unsaved = 0; 129 130 def_flags = SYMBOL_DEF << def; 131 for_all_symbols(i, sym) { 132 sym->flags |= SYMBOL_CHANGED; 133 sym->flags &= ~(def_flags|SYMBOL_VALID); 134 if (sym_is_choice(sym)) 135 sym->flags |= def_flags; 136 switch (sym->type) { 137 case S_INT: 138 case S_HEX: 139 case S_STRING: 140 if (sym->def[def].val) 141 free(sym->def[def].val); 142 default: 143 sym->def[def].val = NULL; 144 sym->def[def].tri = no; 145 } 146 } 147 148 while (fgets(line, sizeof(line), in)) { 149 conf_lineno++; 150 sym = NULL; 151 switch (line[0]) { 152 case '#': 153 if (memcmp(line + 2, "CONFIG_", 7)) 154 continue; 155 p = strchr(line + 9, ' '); 156 if (!p) 157 continue; 158 *p++ = 0; 159 if (strncmp(p, "is not set", 10)) 160 continue; 161 if (def == S_DEF_USER) { 162 sym = sym_find(line + 9); 163 if (!sym) { 164 conf_warning("trying to assign nonexistent symbol %s", line + 9); 165 break; 166 } 167 } else { 168 sym = sym_lookup(line + 9, 0); 169 if (sym->type == S_UNKNOWN) 170 sym->type = S_BOOLEAN; 171 } 172 if (sym->flags & def_flags) { 173 conf_warning("trying to reassign symbol %s", sym->name); 174 break; 175 } 176 switch (sym->type) { 177 case S_BOOLEAN: 178 case S_TRISTATE: 179 sym->def[def].tri = no; 180 sym->flags |= def_flags; 181 break; 182 default: 183 ; 184 } 185 break; 186 case 'C': 187 if (memcmp(line, "CONFIG_", 7)) { 188 conf_warning("unexpected data"); 189 continue; 190 } 191 p = strchr(line + 7, '='); 192 if (!p) 193 continue; 194 *p++ = 0; 195 p2 = strchr(p, '\n'); 196 if (p2) 197 *p2 = 0; 198 if (def == S_DEF_USER) { 199 sym = sym_find(line + 7); 200 if (!sym) { 201 conf_warning("trying to assign nonexistent symbol %s", line + 7); 202 break; 203 } 204 } else { 205 sym = sym_lookup(line + 7, 0); 206 if (sym->type == S_UNKNOWN) 207 sym->type = S_OTHER; 208 } 209 if (sym->flags & def_flags) { 210 conf_warning("trying to reassign symbol %s", sym->name); 211 break; 212 } 213 switch (sym->type) { 214 case S_TRISTATE: 215 if (p[0] == 'm') { 216 sym->def[def].tri = mod; 217 sym->flags |= def_flags; 218 break; 219 } 220 case S_BOOLEAN: 221 if (p[0] == 'y') { 222 sym->def[def].tri = yes; 223 sym->flags |= def_flags; 224 break; 225 } 226 if (p[0] == 'n') { 227 sym->def[def].tri = no; 228 sym->flags |= def_flags; 229 break; 230 } 231 conf_warning("symbol value '%s' invalid for %s", p, sym->name); 232 break; 233 case S_OTHER: 234 if (*p != '"') { 235 for (p2 = p; *p2 && !isspace(*p2); p2++) 236 ; 237 sym->type = S_STRING; 238 goto done; 239 } 240 case S_STRING: 241 if (*p++ != '"') 242 break; 243 for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { 244 if (*p2 == '"') { 245 *p2 = 0; 246 break; 247 } 248 memmove(p2, p2 + 1, strlen(p2)); 249 } 250 if (!p2) { 251 conf_warning("invalid string found"); 252 continue; 253 } 254 case S_INT: 255 case S_HEX: 256 done: 257 if (sym_string_valid(sym, p)) { 258 sym->def[def].val = strdup(p); 259 sym->flags |= def_flags; 260 } else { 261 conf_warning("symbol value '%s' invalid for %s", p, sym->name); 262 continue; 263 } 264 break; 265 default: 266 ; 267 } 268 break; 269 case '\n': 270 break; 271 default: 272 conf_warning("unexpected data"); 273 continue; 274 } 275 if (sym && sym_is_choice_value(sym)) { 276 struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); 277 switch (sym->def[def].tri) { 278 case no: 279 break; 280 case mod: 281 if (cs->def[def].tri == yes) { 282 conf_warning("%s creates inconsistent choice state", sym->name); 283 cs->flags &= ~def_flags; 284 } 285 break; 286 case yes: 287 if (cs->def[def].tri != no) { 288 conf_warning("%s creates inconsistent choice state", sym->name); 289 cs->flags &= ~def_flags; 290 } else 291 cs->def[def].val = sym; 292 break; 293 } 294 cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri); 295 } 296 } 297 fclose(in); 298 299 if (modules_sym) 300 sym_calc_value(modules_sym); 301 return 0; 302} 303 304int conf_read(const char *name) 305{ 306 struct symbol *sym; 307 struct property *prop; 308 struct expr *e; 309 int i, flags; 310 311 sym_change_count = 0; 312 313 if (conf_read_simple(name, S_DEF_USER)) 314 return 1; 315 316 for_all_symbols(i, sym) { 317 sym_calc_value(sym); 318 if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) 319 goto sym_ok; 320 if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { 321 /* check that calculated value agrees with saved value */ 322 switch (sym->type) { 323 case S_BOOLEAN: 324 case S_TRISTATE: 325 if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) 326 break; 327 if (!sym_is_choice(sym)) 328 goto sym_ok; 329 default: 330 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) 331 goto sym_ok; 332 break; 333 } 334 } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) 335 /* no previous value and not saved */ 336 goto sym_ok; 337 conf_unsaved++; 338 /* maybe print value in verbose mode... */ 339 sym_ok: 340 if (sym_has_value(sym) && !sym_is_choice_value(sym)) { 341 if (sym->visible == no) 342 sym->flags &= ~SYMBOL_DEF_USER; 343 switch (sym->type) { 344 case S_STRING: 345 case S_INT: 346 case S_HEX: 347 if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val)) 348 sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); 349 default: 350 break; 351 } 352 } 353 if (!sym_is_choice(sym)) 354 continue; 355 prop = sym_get_choice_prop(sym); 356 flags = sym->flags; 357 for (e = prop->expr; e; e = e->left.expr) 358 if (e->right.sym->visible != no) 359 flags &= e->right.sym->flags; 360 sym->flags &= flags | ~SYMBOL_DEF_USER; 361 } 362 363 sym_change_count += conf_warnings || conf_unsaved; 364 365 return 0; 366} 367 368int conf_write(const char *name) 369{ 370 FILE *out; 371 struct symbol *sym; 372 struct menu *menu; 373 const char *basename; 374 char dirname[128], tmpname[128], newname[128]; 375 int type, l; 376 const char *str; 377 time_t now; 378 int use_timestamp = 1; 379 char *env; 380 381 dirname[0] = 0; 382 if (name && name[0]) { 383 struct stat st; 384 char *slash; 385 386 if (!stat(name, &st) && S_ISDIR(st.st_mode)) { 387 strcpy(dirname, name); 388 strcat(dirname, "/"); 389 basename = conf_get_configname(); 390 } else if ((slash = strrchr(name, '/'))) { 391 int size = slash - name + 1; 392 memcpy(dirname, name, size); 393 dirname[size] = 0; 394 if (slash[1]) 395 basename = slash + 1; 396 else 397 basename = conf_get_configname(); 398 } else 399 basename = name; 400 } else 401 basename = conf_get_configname(); 402 403 sprintf(newname, "%s%s", dirname, basename); 404 env = getenv("KCONFIG_OVERWRITECONFIG"); 405 if (!env || !*env) { 406 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); 407 out = fopen(tmpname, "w"); 408 } else { 409 *tmpname = 0; 410 out = fopen(newname, "w"); 411 } 412 if (!out) 413 return 1; 414 415 sym = sym_lookup("KERNELVERSION", 0); 416 sym_calc_value(sym); 417 time(&now); 418 env = getenv("KCONFIG_NOTIMESTAMP"); 419 if (env && *env) 420 use_timestamp = 0; 421 422 fprintf(out, _("#\n" 423 "# Automatically generated make config: don't edit\n" 424 "# Linux kernel version: %s\n" 425 "%s%s" 426 "#\n"), 427 sym_get_string_value(sym), 428 use_timestamp ? "# " : "", 429 use_timestamp ? ctime(&now) : ""); 430 431 if (!sym_change_count) 432 sym_clear_all_valid(); 433 434 menu = rootmenu.list; 435 while (menu) { 436 sym = menu->sym; 437 if (!sym) { 438 if (!menu_is_visible(menu)) 439 goto next; 440 str = menu_get_prompt(menu); 441 fprintf(out, "\n" 442 "#\n" 443 "# %s\n" 444 "#\n", str); 445 } else if (!(sym->flags & SYMBOL_CHOICE)) { 446 sym_calc_value(sym); 447 if (!(sym->flags & SYMBOL_WRITE)) 448 goto next; 449 sym->flags &= ~SYMBOL_WRITE; 450 type = sym->type; 451 if (type == S_TRISTATE) { 452 sym_calc_value(modules_sym); 453 if (modules_sym->curr.tri == no) 454 type = S_BOOLEAN; 455 } 456 switch (type) { 457 case S_BOOLEAN: 458 case S_TRISTATE: 459 switch (sym_get_tristate_value(sym)) { 460 case no: 461 fprintf(out, "# CONFIG_%s is not set\n", sym->name); 462 break; 463 case mod: 464 fprintf(out, "CONFIG_%s=m\n", sym->name); 465 break; 466 case yes: 467 fprintf(out, "CONFIG_%s=y\n", sym->name); 468 break; 469 } 470 break; 471 case S_STRING: 472 str = sym_get_string_value(sym); 473 fprintf(out, "CONFIG_%s=\"", sym->name); 474 while (1) { 475 l = strcspn(str, "\"\\"); 476 if (l) { 477 fwrite(str, l, 1, out); 478 str += l; 479 } 480 if (!*str) 481 break; 482 fprintf(out, "\\%c", *str++); 483 } 484 fputs("\"\n", out); 485 break; 486 case S_HEX: 487 str = sym_get_string_value(sym); 488 if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { 489 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 490 break; 491 } 492 case S_INT: 493 str = sym_get_string_value(sym); 494 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 495 break; 496 } 497 } 498 499 next: 500 if (menu->list) { 501 menu = menu->list; 502 continue; 503 } 504 if (menu->next) 505 menu = menu->next; 506 else while ((menu = menu->parent)) { 507 if (menu->next) { 508 menu = menu->next; 509 break; 510 } 511 } 512 } 513 fclose(out); 514 515 if (*tmpname) { 516 strcat(dirname, name ? name : conf_get_configname()); 517 strcat(dirname, ".old"); 518 rename(newname, dirname); 519 if (rename(tmpname, newname)) 520 return 1; 521 } 522 523 printf(_("#\n" 524 "# configuration written to %s\n" 525 "#\n"), newname); 526 527 sym_change_count = 0; 528 529 return 0; 530} 531 532int conf_split_config(void) 533{ 534 char *name, path[128]; 535 char *s, *d, c; 536 struct symbol *sym; 537 struct stat sb; 538 int res, i, fd; 539 540 name = getenv("KCONFIG_AUTOCONFIG"); 541 if (!name) 542 name = "include/config/auto.conf"; 543 conf_read_simple(name, S_DEF_AUTO); 544 545 if (chdir("include/config")) 546 return 1; 547 548 res = 0; 549 for_all_symbols(i, sym) { 550 sym_calc_value(sym); 551 if ((sym->flags & SYMBOL_AUTO) || !sym->name) 552 continue; 553 if (sym->flags & SYMBOL_WRITE) { 554 if (sym->flags & SYMBOL_DEF_AUTO) { 555 /* 556 * symbol has old and new value, 557 * so compare them... 558 */ 559 switch (sym->type) { 560 case S_BOOLEAN: 561 case S_TRISTATE: 562 if (sym_get_tristate_value(sym) == 563 sym->def[S_DEF_AUTO].tri) 564 continue; 565 break; 566 case S_STRING: 567 case S_HEX: 568 case S_INT: 569 if (!strcmp(sym_get_string_value(sym), 570 sym->def[S_DEF_AUTO].val)) 571 continue; 572 break; 573 default: 574 break; 575 } 576 } else { 577 /* 578 * If there is no old value, only 'no' (unset) 579 * is allowed as new value. 580 */ 581 switch (sym->type) { 582 case S_BOOLEAN: 583 case S_TRISTATE: 584 if (sym_get_tristate_value(sym) == no) 585 continue; 586 break; 587 default: 588 break; 589 } 590 } 591 } else if (!(sym->flags & SYMBOL_DEF_AUTO)) 592 /* There is neither an old nor a new value. */ 593 continue; 594 /* else 595 * There is an old value, but no new value ('no' (unset) 596 * isn't saved in auto.conf, so the old value is always 597 * different from 'no'). 598 */ 599 600 /* Replace all '_' and append ".h" */ 601 s = sym->name; 602 d = path; 603 while ((c = *s++)) { 604 c = tolower(c); 605 *d++ = (c == '_') ? '/' : c; 606 } 607 strcpy(d, ".h"); 608 609 /* Assume directory path already exists. */ 610 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); 611 if (fd == -1) { 612 if (errno != ENOENT) { 613 res = 1; 614 break; 615 } 616 /* 617 * Create directory components, 618 * unless they exist already. 619 */ 620 d = path; 621 while ((d = strchr(d, '/'))) { 622 *d = 0; 623 if (stat(path, &sb) && mkdir(path, 0755)) { 624 res = 1; 625 goto out; 626 } 627 *d++ = '/'; 628 } 629 /* Try it again. */ 630 fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); 631 if (fd == -1) { 632 res = 1; 633 break; 634 } 635 } 636 close(fd); 637 } 638out: 639 if (chdir("../..")) 640 return 1; 641 642 return res; 643} 644 645int conf_write_autoconf(void) 646{ 647 struct symbol *sym; 648 const char *str; 649 char *name; 650 FILE *out, *out_h; 651 time_t now; 652 int i, l; 653 654 sym_clear_all_valid(); 655 656 file_write_dep("include/config/auto.conf.cmd"); 657 658 if (conf_split_config()) 659 return 1; 660 661 out = fopen(".tmpconfig", "w"); 662 if (!out) 663 return 1; 664 665 out_h = fopen(".tmpconfig.h", "w"); 666 if (!out_h) { 667 fclose(out); 668 return 1; 669 } 670 671 sym = sym_lookup("KERNELVERSION", 0); 672 sym_calc_value(sym); 673 time(&now); 674 fprintf(out, "#\n" 675 "# Automatically generated make config: don't edit\n" 676 "# Linux kernel version: %s\n" 677 "# %s" 678 "#\n", 679 sym_get_string_value(sym), ctime(&now)); 680 fprintf(out_h, "/*\n" 681 " * Automatically generated C config: don't edit\n" 682 " * Linux kernel version: %s\n" 683 " * %s" 684 " */\n" 685 "#define AUTOCONF_INCLUDED\n", 686 sym_get_string_value(sym), ctime(&now)); 687 688 for_all_symbols(i, sym) { 689 sym_calc_value(sym); 690 if (!(sym->flags & SYMBOL_WRITE) || !sym->name) 691 continue; 692 switch (sym->type) { 693 case S_BOOLEAN: 694 case S_TRISTATE: 695 switch (sym_get_tristate_value(sym)) { 696 case no: 697 break; 698 case mod: 699 fprintf(out, "CONFIG_%s=m\n", sym->name); 700 fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); 701 break; 702 case yes: 703 fprintf(out, "CONFIG_%s=y\n", sym->name); 704 fprintf(out_h, "#define CONFIG_%s 1\n", sym->name); 705 break; 706 } 707 break; 708 case S_STRING: 709 str = sym_get_string_value(sym); 710 fprintf(out, "CONFIG_%s=\"", sym->name); 711 fprintf(out_h, "#define CONFIG_%s \"", sym->name); 712 while (1) { 713 l = strcspn(str, "\"\\"); 714 if (l) { 715 fwrite(str, l, 1, out); 716 fwrite(str, l, 1, out_h); 717 str += l; 718 } 719 if (!*str) 720 break; 721 fprintf(out, "\\%c", *str); 722 fprintf(out_h, "\\%c", *str); 723 str++; 724 } 725 fputs("\"\n", out); 726 fputs("\"\n", out_h); 727 break; 728 case S_HEX: 729 str = sym_get_string_value(sym); 730 if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { 731 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 732 fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); 733 break; 734 } 735 case S_INT: 736 str = sym_get_string_value(sym); 737 fprintf(out, "CONFIG_%s=%s\n", sym->name, str); 738 fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); 739 break; 740 default: 741 break; 742 } 743 } 744 fclose(out); 745 fclose(out_h); 746 747 name = getenv("KCONFIG_AUTOHEADER"); 748 if (!name) 749 name = "include/linux/autoconf.h"; 750 if (rename(".tmpconfig.h", name)) 751 return 1; 752 name = getenv("KCONFIG_AUTOCONFIG"); 753 if (!name) 754 name = "include/config/auto.conf"; 755 /* 756 * This must be the last step, kbuild has a dependency on auto.conf 757 * and this marks the successful completion of the previous steps. 758 */ 759 if (rename(".tmpconfig", name)) 760 return 1; 761 762 return 0; 763} 764