OSDN Git Service

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