confdata.c 23 KB

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