confdata.c 18 KB

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