2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
13 #define LKC_DIRECT_LINK
16 const char conf_def_filename
[] = "config/.config";
18 const char conf_defname
[] = "config/defconfig";
20 const char *conf_confnames
[] = {
26 static char *conf_expand_value(const char *in
)
30 static char res_value
[SYMBOL_MAXLENGTH
];
31 char *dst
, name
[SYMBOL_MAXLENGTH
];
35 while ((src
= strchr(in
, '$'))) {
36 strncat(res_value
, in
, src
- in
);
39 while (isalnum(*src
) || *src
== '_')
42 sym
= sym_lookup(name
, 0);
44 strcat(res_value
, sym_get_string_value(sym
));
47 strcat(res_value
, in
);
52 char *conf_get_default_confname(void)
55 static char fullname
[PATH_MAX
+1];
58 name
= conf_expand_value(conf_defname
);
59 env
= getenv(SRCTREE
);
61 sprintf(fullname
, "%s/%s", env
, name
);
62 if (!stat(fullname
, &buf
))
68 int conf_read(const char *name
)
75 struct property
*prop
;
80 in
= zconf_fopen(name
);
82 const char **names
= conf_confnames
;
83 while ((name
= *names
++)) {
84 name
= conf_expand_value(name
);
85 in
= zconf_fopen(name
);
88 "# using defaults found in %s\n"
98 for_all_symbols(i
, sym
) {
99 sym
->flags
|= SYMBOL_NEW
| SYMBOL_CHANGED
;
100 sym
->flags
&= ~SYMBOL_VALID
;
108 sym
->user
.val
= NULL
;
113 while (fgets(line
, sizeof(line
), in
)) {
120 p
= strchr(line
+ 2, ' ');
124 if (strncmp(p
, "is not set", 10))
126 sym
= sym_find(line
+ 2);
128 fprintf(stderr
, "%s:%d: trying to assign nonexistent symbol %s\n", name
, lineno
, line
+ 2);
135 sym
->flags
&= ~SYMBOL_NEW
;
143 p
= strchr(line
, '=');
147 p2
= strchr(p
, '\n');
150 sym
= sym_find(line
);
152 fprintf(stderr
, "%s:%d: trying to assign nonexistent symbol %s\n", name
, lineno
, line
);
159 sym
->flags
&= ~SYMBOL_NEW
;
165 sym
->flags
&= ~SYMBOL_NEW
;
170 sym
->flags
&= ~SYMBOL_NEW
;
177 for (p2
= p
; (p2
= strpbrk(p2
, "\"\\")); p2
++) {
182 memmove(p2
, p2
+ 1, strlen(p2
));
185 fprintf(stderr
, "%s:%d: invalid string found\n", name
, lineno
);
190 if (sym_string_valid(sym
, p
)) {
191 sym
->user
.val
= strdup(p
);
192 sym
->flags
&= ~SYMBOL_NEW
;
194 fprintf(stderr
, "%s:%d: symbol value '%s' invalid for %s\n", name
, lineno
, p
, sym
->name
);
207 if (sym
&& sym_is_choice_value(sym
)) {
208 struct symbol
*cs
= prop_get_symbol(sym_get_choice_prop(sym
));
209 switch (sym
->user
.tri
) {
213 if (cs
->user
.tri
== yes
)
217 if (cs
->user
.tri
!= no
)
222 cs
->user
.tri
= E_OR(cs
->user
.tri
, sym
->user
.tri
);
223 cs
->flags
&= ~SYMBOL_NEW
;
229 sym_calc_value(modules_sym
);
230 for_all_symbols(i
, sym
) {
232 if (sym_has_value(sym
) && !sym_is_choice_value(sym
)) {
233 if (sym
->visible
== no
)
234 sym
->flags
|= SYMBOL_NEW
;
239 if (!sym_string_within_range(sym
, sym
->user
.val
))
240 sym
->flags
|= SYMBOL_NEW
;
245 if (!sym_is_choice(sym
))
247 prop
= sym_get_choice_prop(sym
);
248 for (e
= prop
->expr
; e
; e
= e
->left
.expr
)
249 if (e
->right
.sym
->visible
!= no
)
250 sym
->flags
|= e
->right
.sym
->flags
& SYMBOL_NEW
;
253 sym_change_count
= 1;
258 struct menu
*next_menu(struct menu
*menu
)
260 if (menu
->list
) return menu
->list
;
266 } while ((menu
= menu
->parent
));
271 #define SYMBOL_FORCEWRITE (1<<31)
273 int conf_write(const char *name
)
278 const char *basename
;
279 char dirname
[128], tmpname
[128], newname
[128];
284 if (name
&& name
[0]) {
288 if (!stat(name
, &st
) && S_ISDIR(st
.st_mode
)) {
289 strcpy(dirname
, name
);
290 strcat(dirname
, "/");
291 basename
= conf_def_filename
;
292 } else if ((slash
= strrchr(name
, '/'))) {
293 int size
= slash
- name
+ 1;
294 memcpy(dirname
, name
, size
);
297 basename
= slash
+ 1;
299 basename
= conf_def_filename
;
303 basename
= conf_def_filename
;
305 sprintf(newname
, "config/%s.tmpconfig.%d", dirname
, (int)getpid());
306 out
= fopen(newname
, "w");
311 out_h
= fopen("config/.tmpconfig.h", "w");
316 "# Automatically generated make config: don't edit\n"
319 fprintf(out_h
, "/*\n"
320 " * Automatically generated header file: don't edit\n"
323 "/* Version Number */\n"
324 "#define BB_VER \"%s\"\n"
325 "#define BB_BT \"%s\"\n",
327 getenv("BUILDTIME"));
328 if (getenv("EXTRA_VERSION"))
329 fprintf(out_h
, "#define BB_EXTRA_VERSION \"%s\"\n",
330 getenv("EXTRA_VERSION"));
331 fprintf(out_h
, "\n");
335 if (!sym_change_count
)
336 sym_clear_all_valid();
338 /* Force write of all non-duplicate symbols. */
340 /* Write out everything by default. */
341 for(menu
= rootmenu
.list
; menu
; menu
= next_menu(menu
))
342 if (menu
->sym
) menu
->sym
->flags
|= SYMBOL_FORCEWRITE
;
344 menu
= rootmenu
.list
;
348 if (!menu_is_visible(menu
))
350 str
= menu_get_prompt(menu
);
360 } else if (!(sym
->flags
& SYMBOL_CHOICE
)) {
362 if (!(sym
->flags
& SYMBOL_FORCEWRITE
))
365 sym
->flags
&= ~SYMBOL_FORCEWRITE
;
367 if (type
== S_TRISTATE
) {
368 sym_calc_value(modules_sym
);
369 if (modules_sym
->curr
.tri
== no
)
375 switch (sym_get_tristate_value(sym
)) {
377 fprintf(out
, "# %s is not set\n", sym
->name
);
379 fprintf(out_h
, "#undef %s\n", sym
->name
);
383 fprintf(out
, "%s=m\n", sym
->name
);
385 fprintf(out_h
, "#define %s_MODULE 1\n", sym
->name
);
389 fprintf(out
, "%s=y\n", sym
->name
);
391 fprintf(out_h
, "#define %s 1\n", sym
->name
);
397 str
= sym_get_string_value(sym
);
398 fprintf(out
, "%s=\"", sym
->name
);
400 fprintf(out_h
, "#define %s \"", sym
->name
);
402 l
= strcspn(str
, "\"\\");
404 fwrite(str
, l
, 1, out
);
406 fwrite(str
, l
, 1, out_h
);
409 while (*str
== '\\' || *str
== '"') {
410 fprintf(out
, "\\%c", *str
);
412 fprintf(out_h
, "\\%c", *str
);
418 fputs("\"\n", out_h
);
421 str
= sym_get_string_value(sym
);
422 if (str
[0] != '0' || (str
[1] != 'x' && str
[1] != 'X')) {
423 fprintf(out
, "%s=%s\n", sym
->name
, *str
? str
: "0");
425 fprintf(out_h
, "#define %s 0x%s\n", sym
->name
, str
);
429 str
= sym_get_string_value(sym
);
430 fprintf(out
, "%s=%s\n", sym
->name
, *str
? str
: "0");
432 fprintf(out_h
, "#define %s %s\n", sym
->name
, str
);
437 menu
= next_menu(menu
);
442 rename("config/.tmpconfig.h", "config/config.h");
443 file_write_dep(NULL
);
445 if (!name
|| basename
!= conf_def_filename
) {
447 name
= conf_def_filename
;
448 sprintf(tmpname
, "%s.old", name
);
449 rename(name
, tmpname
);
451 sprintf(tmpname
, "%s%s", dirname
, basename
);
452 if (rename(newname
, tmpname
))
455 sym_change_count
= 0;