kconfig: KCONFIG_OVERWRITECONFIG
authorRoman Zippel <zippel@linux-m68k.org>
Fri, 9 Jun 2006 05:12:51 +0000 (22:12 -0700)
committerSam Ravnborg <sam@mars.ravnborg.org>
Fri, 9 Jun 2006 14:28:07 +0000 (16:28 +0200)
If you set KCONFIG_OVERWRITECONFIG in environment, Kconfig will not break
symlinks when .config is a symlink to somewhere else.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Makefile
scripts/kconfig/confdata.c
scripts/kconfig/lkc.h

index 3c55de99ed31844762ebb08415bcdef8732d7340..3cb9270c584d1babad4d03ca8886ee1def2510ff 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -178,6 +178,8 @@ CROSS_COMPILE       ?=
 # Architecture as present in compile.h
 UTS_MACHINE := $(ARCH)
 
+KCONFIG_CONFIG ?= .config
+
 # SHELL used by kbuild
 CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
          else if [ -x /bin/bash ]; then echo /bin/bash; \
@@ -437,13 +439,13 @@ ifeq ($(dot-config),1)
 -include include/config/auto.conf
 
 # To avoid any implicit rule to kick in, define an empty command
-.config include/config/auto.conf.cmd: ;
+$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
 
 # If .config is newer than include/config/auto.conf, someone tinkered
 # with it and forgot to run make oldconfig.
 # if auto.conf.cmd is missing then we are probarly in a cleaned tree so
 # we execute the config step to be sure to catch updated Kconfig files
-include/config/auto.conf: .config include/config/auto.conf.cmd
+include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
        $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
 
 else
index 5bd66f45118918f123c378b83a57fa448c93a6f8..2ee48c377b66b5e3f01ba752ad1944f303e22ad9 100644 (file)
@@ -21,8 +21,6 @@ static void conf_warning(const char *fmt, ...)
 static const char *conf_filename;
 static int conf_lineno, conf_warnings, conf_unsaved;
 
-const char conf_def_filename[] = ".config";
-
 const char conf_defname[] = "arch/$ARCH/defconfig";
 
 static void conf_warning(const char *fmt, ...)
@@ -36,6 +34,13 @@ static void conf_warning(const char *fmt, ...)
        conf_warnings++;
 }
 
+const char *conf_get_configname(void)
+{
+       char *name = getenv("KCONFIG_CONFIG");
+
+       return name ? name : ".config";
+}
+
 static char *conf_expand_value(const char *in)
 {
        struct symbol *sym;
@@ -91,7 +96,7 @@ int conf_read_simple(const char *name, int def)
        } else {
                struct property *prop;
 
-               name = conf_def_filename;
+               name = conf_get_configname();
                in = zconf_fopen(name);
                if (in)
                        goto load;
@@ -381,7 +386,7 @@ int conf_write(const char *name)
                if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
                        strcpy(dirname, name);
                        strcat(dirname, "/");
-                       basename = conf_def_filename;
+                       basename = conf_get_configname();
                } else if ((slash = strrchr(name, '/'))) {
                        int size = slash - name + 1;
                        memcpy(dirname, name, size);
@@ -389,16 +394,24 @@ int conf_write(const char *name)
                        if (slash[1])
                                basename = slash + 1;
                        else
-                               basename = conf_def_filename;
+                               basename = conf_get_configname();
                } else
                        basename = name;
        } else
-               basename = conf_def_filename;
+               basename = conf_get_configname();
 
-       sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
-       out = fopen(newname, "w");
+       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");
+       }
        if (!out)
                return 1;
+
        sym = sym_lookup("KERNELVERSION", 0);
        sym_calc_value(sym);
        time(&now);
@@ -498,19 +511,18 @@ int conf_write(const char *name)
                }
        }
        fclose(out);
-       if (!name || basename != conf_def_filename) {
-               if (!name)
-                       name = conf_def_filename;
-               sprintf(tmpname, "%s.old", name);
-               rename(name, tmpname);
+
+       if (*tmpname) {
+               strcat(dirname, name ? name : conf_get_configname());
+               strcat(dirname, ".old");
+               rename(newname, dirname);
+               if (rename(tmpname, newname))
+                       return 1;
        }
-       sprintf(tmpname, "%s%s", dirname, basename);
-       if (rename(newname, tmpname))
-               return 1;
 
        printf(_("#\n"
                 "# configuration written to %s\n"
-                "#\n"), tmpname);
+                "#\n"), newname);
 
        sym_change_count = 0;
 
index 2d3d4ed3c9f2e61b50cfcf52e1df5a21f9d770c3..2628023a1fe1d0b95ff99927b53e7652620aa6e8 100644 (file)
@@ -64,8 +64,6 @@ int zconf_lineno(void);
 char *zconf_curname(void);
 
 /* confdata.c */
-extern const char conf_def_filename[];
-
 char *conf_get_default_confname(void);
 
 /* kconfig_load.c */