]> nv-tegra.nvidia Code Review - linux-2.6.git/blobdiff - scripts/kconfig/util.c
kconfig: add missing <stdarg.h> inclusion
[linux-2.6.git] / scripts / kconfig / util.c
index e1cad924c0a41ab6fa1e8f917c0c01198419b549..e07d557bb3a9263efaf3ee4b849003fd7b916d3a 100644 (file)
@@ -5,6 +5,7 @@
  * Released under the terms of the GNU GPL v2.0.
  */
 
+#include <stdarg.h>
 #include <string.h>
 #include "lkc.h"
 
 struct file *file_lookup(const char *name)
 {
        struct file *file;
+       const char *file_name = sym_expand_string_value(name);
 
        for (file = file_list; file; file = file->next) {
-               if (!strcmp(name, file->name))
+               if (!strcmp(name, file->name)) {
+                       free((void *)file_name);
                        return file;
+               }
        }
 
        file = malloc(sizeof(*file));
        memset(file, 0, sizeof(*file));
-       file->name = strdup(name);
+       file->name = file_name;
        file->next = file_list;
        file_list = file;
        return file;
@@ -29,6 +33,8 @@ struct file *file_lookup(const char *name)
 /* write a dependency file as used by kbuild to track dependencies */
 int file_write_dep(const char *name)
 {
+       struct symbol *sym, *env_sym;
+       struct expr *e;
        struct file *file;
        FILE *out;
 
@@ -44,21 +50,39 @@ int file_write_dep(const char *name)
                else
                        fprintf(out, "\t%s\n", file->name);
        }
-       fprintf(out, "\ninclude/config/auto.conf: \\\n"
-                    "\t$(deps_config)\n\n"
-                    "$(deps_config): ;\n");
+       fprintf(out, "\n%s: \\\n"
+                    "\t$(deps_config)\n\n", conf_get_autoconfig_name());
+
+       expr_list_for_each_sym(sym_env_list, e, sym) {
+               struct property *prop;
+               const char *value;
+
+               prop = sym_get_env_prop(sym);
+               env_sym = prop_get_symbol(prop);
+               if (!env_sym)
+                       continue;
+               value = getenv(env_sym->name);
+               if (!value)
+                       value = "";
+               fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
+               fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name());
+               fprintf(out, "endif\n");
+       }
+
+       fprintf(out, "\n$(deps_config): ;\n");
        fclose(out);
        rename("..config.tmp", name);
        return 0;
 }
 
 
-/* Allocate initial growable sting */
+/* Allocate initial growable string */
 struct gstr str_new(void)
 {
        struct gstr gs;
        gs.s = malloc(sizeof(char) * 64);
-       gs.len = 16;
+       gs.len = 64;
+       gs.max_width = 0;
        strcpy(gs.s, "\0");
        return gs;
 }
@@ -69,6 +93,7 @@ struct gstr str_assign(const char *s)
        struct gstr gs;
        gs.s = strdup(s);
        gs.len = strlen(s) + 1;
+       gs.max_width = 0;
        return gs;
 }