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