--- 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); }