diff options
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.patch | 253 |
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); + } + |