kconfig: KCONFIG_OVERWRITECONFIG

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>
This commit is contained in:
Roman Zippel 2006-06-08 22:12:51 -07:00 committed by Sam Ravnborg
parent 250725aa13
commit 14cdd3c402
3 changed files with 33 additions and 21 deletions

View File

@ -178,6 +178,8 @@ CROSS_COMPILE ?=
# Architecture as present in compile.h # Architecture as present in compile.h
UTS_MACHINE := $(ARCH) UTS_MACHINE := $(ARCH)
KCONFIG_CONFIG ?= .config
# SHELL used by kbuild # SHELL used by kbuild
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \ else if [ -x /bin/bash ]; then echo /bin/bash; \
@ -437,13 +439,13 @@ ifeq ($(dot-config),1)
-include include/config/auto.conf -include include/config/auto.conf
# To avoid any implicit rule to kick in, define an empty command # 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 # If .config is newer than include/config/auto.conf, someone tinkered
# with it and forgot to run make oldconfig. # with it and forgot to run make oldconfig.
# if auto.conf.cmd is missing then we are probarly in a cleaned tree so # 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 # 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 $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
else else

View File

@ -21,8 +21,6 @@ static void conf_warning(const char *fmt, ...)
static const char *conf_filename; static const char *conf_filename;
static int conf_lineno, conf_warnings, conf_unsaved; static int conf_lineno, conf_warnings, conf_unsaved;
const char conf_def_filename[] = ".config";
const char conf_defname[] = "arch/$ARCH/defconfig"; const char conf_defname[] = "arch/$ARCH/defconfig";
static void conf_warning(const char *fmt, ...) static void conf_warning(const char *fmt, ...)
@ -36,6 +34,13 @@ static void conf_warning(const char *fmt, ...)
conf_warnings++; 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) static char *conf_expand_value(const char *in)
{ {
struct symbol *sym; struct symbol *sym;
@ -91,7 +96,7 @@ int conf_read_simple(const char *name, int def)
} else { } else {
struct property *prop; struct property *prop;
name = conf_def_filename; name = conf_get_configname();
in = zconf_fopen(name); in = zconf_fopen(name);
if (in) if (in)
goto load; goto load;
@ -381,7 +386,7 @@ int conf_write(const char *name)
if (!stat(name, &st) && S_ISDIR(st.st_mode)) { if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
strcpy(dirname, name); strcpy(dirname, name);
strcat(dirname, "/"); strcat(dirname, "/");
basename = conf_def_filename; basename = conf_get_configname();
} else if ((slash = strrchr(name, '/'))) { } else if ((slash = strrchr(name, '/'))) {
int size = slash - name + 1; int size = slash - name + 1;
memcpy(dirname, name, size); memcpy(dirname, name, size);
@ -389,16 +394,24 @@ int conf_write(const char *name)
if (slash[1]) if (slash[1])
basename = slash + 1; basename = slash + 1;
else else
basename = conf_def_filename; basename = conf_get_configname();
} else } else
basename = name; basename = name;
} else } else
basename = conf_def_filename; basename = conf_get_configname();
sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid()); sprintf(newname, "%s%s", dirname, basename);
out = fopen(newname, "w"); 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) if (!out)
return 1; return 1;
sym = sym_lookup("KERNELVERSION", 0); sym = sym_lookup("KERNELVERSION", 0);
sym_calc_value(sym); sym_calc_value(sym);
time(&now); time(&now);
@ -498,19 +511,18 @@ int conf_write(const char *name)
} }
} }
fclose(out); fclose(out);
if (!name || basename != conf_def_filename) {
if (!name) if (*tmpname) {
name = conf_def_filename; strcat(dirname, name ? name : conf_get_configname());
sprintf(tmpname, "%s.old", name); strcat(dirname, ".old");
rename(name, tmpname); rename(newname, dirname);
if (rename(tmpname, newname))
return 1;
} }
sprintf(tmpname, "%s%s", dirname, basename);
if (rename(newname, tmpname))
return 1;
printf(_("#\n" printf(_("#\n"
"# configuration written to %s\n" "# configuration written to %s\n"
"#\n"), tmpname); "#\n"), newname);
sym_change_count = 0; sym_change_count = 0;

View File

@ -64,8 +64,6 @@ int zconf_lineno(void);
char *zconf_curname(void); char *zconf_curname(void);
/* confdata.c */ /* confdata.c */
extern const char conf_def_filename[];
char *conf_get_default_confname(void); char *conf_get_default_confname(void);
/* kconfig_load.c */ /* kconfig_load.c */