summaryrefslogtreecommitdiffstats
path: root/package/config/patches/14-support-out-of-tree-config.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/config/patches/14-support-out-of-tree-config.patch')
-rw-r--r--package/config/patches/14-support-out-of-tree-config.patch253
1 files changed, 253 insertions, 0 deletions
diff --git a/package/config/patches/14-support-out-of-tree-config.patch b/package/config/patches/14-support-out-of-tree-config.patch
new file mode 100644
index 000000000..4aae0c154
--- /dev/null
+++ b/package/config/patches/14-support-out-of-tree-config.patch
@@ -0,0 +1,253 @@
+---
+ conf.c | 8 +++---
+ confdata.c | 71 ++++++++++++++++++++++++++++++++++++++++++++-----------------
+ lkc.h | 1
+ util.c | 22 ++++++++++++++----
+ 4 files changed, 74 insertions(+), 28 deletions(-)
+
+Index: config.clean/conf.c
+===================================================================
+--- config.clean.orig/conf.c
++++ config.clean/conf.c
+@@ -496,16 +496,16 @@
+ }
+ name = av[optind];
+ conf_parse(name);
+- //zconfdump(stdout);
+ if (sync_kconfig) {
+- if (stat(".config", &tmpstat)) {
++ name = conf_get_configname();
++ if (stat(name, &tmpstat)) {
+ fprintf(stderr, _("***\n"
+ "*** You have not yet configured Buildroot!\n"
+- "*** (missing .config file)\n"
++ "*** (missing .config file \"%s\")\n"
+ "***\n"
+ "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+ "*** \"make menuconfig\" or \"make xconfig\").\n"
+- "***\n"));
++ "***\n"), name);
+ exit(1);
+ }
+ }
+Index: config.clean/confdata.c
+===================================================================
+--- config.clean.orig/confdata.c
++++ config.clean/confdata.c
+@@ -42,6 +42,11 @@
+ return name ? name : ".config";
+ }
+
++const char *conf_get_autoconfig_name(void)
++{
++ return getenv("KCONFIG_AUTOCONFIG");
++}
++
+ static char *conf_expand_value(const char *in)
+ {
+ struct symbol *sym;
+@@ -399,6 +404,9 @@
+ int use_timestamp = 1;
+ char *env;
+
++ if (!name)
++ name = conf_get_configname();
++
+ dirname[0] = 0;
+ if (name && name[0]) {
+ struct stat st;
+@@ -550,19 +558,31 @@
+
+ int conf_split_config(void)
+ {
+- char *name, path[128];
++ const char *name;
++ char path[128];
++ char *opwd, *dir, *_name;
+ char *s, *d, c;
+ struct symbol *sym;
+ struct stat sb;
+ int res, i, fd;
+
+- name = getenv("KCONFIG_AUTOCONFIG");
+- if (!name)
+- name = "include/config/auto.conf";
++ name = conf_get_autoconfig_name();
+ conf_read_simple(name, S_DEF_AUTO);
+
+- if (chdir("include/config"))
++ opwd = malloc(256);
++ _name = strdup(name);
++ if (opwd == NULL || _name == NULL)
+ return 1;
++ opwd = getcwd(opwd, 256);
++ dir = dirname(_name);
++ if (dir == NULL) {
++ res = 1;
++ goto err;
++ }
++ if (chdir(dir)) {
++ res = 1;
++ goto err;
++ }
+
+ res = 0;
+ for_all_symbols(i, sym) {
+@@ -655,9 +675,11 @@
+ close(fd);
+ }
+ out:
+- if (chdir("../.."))
+- return 1;
+-
++ if (chdir(opwd))
++ res = 1;
++err:
++ free(opwd);
++ free(_name);
+ return res;
+ }
+
+@@ -665,23 +687,35 @@
+ {
+ struct symbol *sym;
+ const char *str;
+- char *name;
++ const char *name;
+ FILE *out, *out_h;
+ time_t now;
+ int i, l;
++ char dir[PATH_MAX+1], buf[PATH_MAX+1];
++ char *s;
++
++ strcpy(dir, conf_get_configname());
++ s = strrchr(dir, '/');
++ if (s)
++ s[1] = 0;
++ else
++ dir[0] = 0;
+
+ sym_clear_all_valid();
+
+- file_write_dep("include/config/auto.conf.cmd");
++ sprintf(buf, "%s.config.cmd", dir);
++ file_write_dep(buf);
+
+ if (conf_split_config())
+ return 1;
+
+- out = fopen(".tmpconfig", "w");
++ sprintf(buf, "%s.tmpconfig", dir);
++ out = fopen(buf, "w");
+ if (!out)
+ return 1;
+
+- out_h = fopen(".tmpconfig.h", "w");
++ sprintf(buf, "%s.tmpconfig.h", dir);
++ out_h = fopen(buf, "w");
+ if (!out_h) {
+ fclose(out);
+ return 1;
+@@ -698,8 +732,7 @@
+ fprintf(out_h, "/*\n"
+ " * Automatically generated C config: don't edit\n"
+ " * %s"
+- " */\n"
+- "#define AUTOCONF_INCLUDED\n",
++ " */\n",
+ ctime(&now));
+
+ for_all_symbols(i, sym) {
+@@ -764,16 +797,16 @@
+ name = getenv("KCONFIG_AUTOHEADER");
+ if (!name)
+ name = "include/linux/autoconf.h";
+- if (rename(".tmpconfig.h", name))
++ sprintf(buf, "%s.tmpconfig.h", dir);
++ if (rename(buf, name))
+ return 1;
+- name = getenv("KCONFIG_AUTOCONFIG");
+- if (!name)
+- name = "include/config/auto.conf";
++ name = conf_get_autoconfig_name();
+ /*
+ * This must be the last step, kbuild has a dependency on auto.conf
+ * and this marks the successful completion of the previous steps.
+ */
+- if (rename(".tmpconfig", name))
++ sprintf(buf, "%s.tmpconfig", dir);
++ if (rename(buf, name))
+ return 1;
+
+ return 0;
+Index: config.clean/lkc.h
+===================================================================
+--- config.clean.orig/lkc.h
++++ config.clean/lkc.h
+@@ -74,6 +74,7 @@
+
+ /* confdata.c */
+ const char *conf_get_configname(void);
++const char *conf_get_autoconfig_name(void);
+ char *conf_get_default_confname(void);
+ void sym_set_change_count(int count);
+ void sym_add_change_count(int count);
+Index: config.clean/util.c
+===================================================================
+--- config.clean.orig/util.c
++++ config.clean/util.c
+@@ -144,6 +144,8 @@
+ /* write a dependency file as used by kbuild to track dependencies */
+ int file_write_dep(const char *name)
+ {
++ char *str;
++ char buf[PATH_MAX+1], buf2[PATH_MAX+1], dir[PATH_MAX+1];
+ struct symbol *sym, *env_sym;
+ struct expr *e;
+ struct file *file;
+@@ -151,7 +153,16 @@
+
+ if (!name)
+ name = ".kconfig.d";
+- out = fopen("..config.tmp", "w");
++
++ strcpy(dir, conf_get_configname());
++ str = strrchr(dir, '/');
++ if (str)
++ str[1] = 0;
++ else
++ dir[0] = 0;
++
++ sprintf(buf, "%s..config.tmp", dir);
++ out = fopen(buf, "w");
+ if (!out)
+ return 1;
+ fprintf(out, "deps_config := \\\n");
+@@ -161,8 +172,8 @@
+ else
+ fprintf(out, "\t%s\n", file->name);
+ }
+- fprintf(out, "\ninclude/config/auto.conf: \\\n"
+- "\t$(deps_config)\n\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;
+@@ -176,13 +187,14 @@
+ if (!value)
+ value = "";
+ fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
+- fprintf(out, "include/config/auto.conf: FORCE\n");
++ 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);
++ sprintf(buf2, "%s%s", dir, name);
++ rename(buf, buf2);
+ return write_make_deps(NULL);
+ }
+