Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14cdd3c4 authored by Roman Zippel's avatar Roman Zippel Committed by Sam Ravnborg
Browse files

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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent 250725aa
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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
+29 −17
Original line number Diff line number Diff line
@@ -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());
	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);
	}
	sprintf(tmpname, "%s%s", dirname, basename);
	if (rename(newname, tmpname))

	if (*tmpname) {
		strcat(dirname, name ? name : conf_get_configname());
		strcat(dirname, ".old");
		rename(newname, dirname);
		if (rename(tmpname, newname))
			return 1;
	}

	printf(_("#\n"
		 "# configuration written to %s\n"
		 "#\n"), tmpname);
		 "#\n"), newname);

	sym_change_count = 0;

+0 −2
Original line number Diff line number Diff line
@@ -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 */