kconfig: rename file_write_dep and move it to confdata.c
[carl9170fw.git] / config / confdata.c
index 94c5efa68912772b3b4ccade24c4c4073382978c..45c462c9312c1176898dccc3e6c9e0c14d63e4e2 100644 (file)
@@ -43,16 +43,16 @@ static void conf_warning(const char *fmt, ...)
        conf_warnings++;
 }
 
-static void conf_default_message_callback(const char *fmt, va_list ap)
+static void conf_default_message_callback(const char *s)
 {
        printf("#\n# ");
-       vprintf(fmt, ap);
+       printf("%s", s);
        printf("\n#\n");
 }
 
-static void (*conf_message_callback) (const char *fmt, va_list ap) =
+static void (*conf_message_callback)(const char *s) =
        conf_default_message_callback;
-void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
+void conf_set_message_callback(void (*fn)(const char *s))
 {
        conf_message_callback = fn;
 }
@@ -60,10 +60,15 @@ void conf_set_message_callback(void (*fn) (const char *fmt, va_list ap))
 static void conf_message(const char *fmt, ...)
 {
        va_list ap;
+       char buf[4096];
+
+       if (!conf_message_callback)
+               return;
 
        va_start(ap, fmt);
-       if (conf_message_callback)
-               conf_message_callback(fmt, ap);
+
+       vsnprintf(buf, sizeof(buf), fmt, ap);
+       conf_message_callback(buf);
        va_end(ap);
 }
 
@@ -81,39 +86,13 @@ const char *conf_get_autoconfig_name(void)
        return name ? name : "include/generated/auto.conf";
 }
 
-static char *conf_expand_value(const char *in)
-{
-       struct symbol *sym;
-       const char *src;
-       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);
+       name = expand_string(conf_defname);
        env = getenv(SRCTREE);
        if (env) {
                sprintf(fullname, "%s/%s", env, name);
@@ -274,7 +253,8 @@ int conf_read_simple(const char *name, int def)
                        if (expr_calc_value(prop->visible.expr) == no ||
                            prop->expr->type != E_SYMBOL)
                                continue;
-                       name = conf_expand_value(prop->expr->left.sym->name);
+                       sym_calc_value(prop->expr->left.sym);
+                       name = sym_get_string_value(prop->expr->left.sym);
                        in = zconf_fopen(name);
                        if (in) {
                                conf_message("using defaults found in %s",
@@ -422,7 +402,7 @@ int conf_read(const char *name)
 
        for_all_symbols(i, sym) {
                sym_calc_value(sym);
-               if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO))
+               if (sym_is_choice(sym) || (sym->flags & SYMBOL_NO_WRITE))
                        continue;
                if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) {
                        /* check that calculated value agrees with saved value */
@@ -791,7 +771,7 @@ int conf_write(const char *name)
        struct menu *menu;
        const char *basename;
        const char *str;
-       char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1];
+       char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8];
        char *env;
 
        dirname[0] = 0;
@@ -884,6 +864,35 @@ next:
        return 0;
 }
 
+/* write a dependency file as used by kbuild to track dependencies */
+static int conf_write_dep(const char *name)
+{
+       struct file *file;
+       FILE *out;
+
+       if (!name)
+               name = ".kconfig.d";
+       out = fopen("..config.tmp", "w");
+       if (!out)
+               return 1;
+       fprintf(out, "deps_config := \\\n");
+       for (file = file_list; file; file = file->next) {
+               if (file->next)
+                       fprintf(out, "\t%s \\\n", file->name);
+               else
+                       fprintf(out, "\t%s\n", file->name);
+       }
+       fprintf(out, "\n%s: \\\n"
+                    "\t$(deps_config)\n\n", conf_get_autoconfig_name());
+
+       env_write_dep(out, conf_get_autoconfig_name());
+
+       fprintf(out, "\n$(deps_config): ;\n");
+       fclose(out);
+       rename("..config.tmp", name);
+       return 0;
+}
+
 static int conf_split_config(void)
 {
        const char *name;
@@ -903,7 +912,7 @@ static int conf_split_config(void)
        res = 0;
        for_all_symbols(i, sym) {
                sym_calc_value(sym);
-               if ((sym->flags & SYMBOL_AUTO) || !sym->name)
+               if ((sym->flags & SYMBOL_NO_WRITE) || !sym->name)
                        continue;
                if (sym->flags & SYMBOL_WRITE) {
                        if (sym->flags & SYMBOL_DEF_AUTO) {
@@ -1006,7 +1015,7 @@ int conf_write_autoconf(void)
 
        sym_clear_all_valid();
 
-       file_write_dep("include/generated/auto.conf.cmd");
+       conf_write_dep("include/generated/auto.conf.cmd");
 
        if (conf_split_config())
                return 1;