--- conf.c | 1 confdata.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++--------------- util.c | 16 +++++++++++++-- 3 files changed, 61 insertions(+), 18 deletions(-) Index: kconfig/conf.c =================================================================== --- kconfig.orig/conf.c +++ kconfig/conf.c @@ -503,7 +503,6 @@ } name = av[optind]; conf_parse(name); - //zconfdump(stdout); if (sync_kconfig) { name = conf_get_configname(); if (stat(name, &tmpstat)) { Index: kconfig/confdata.c =================================================================== --- kconfig.orig/confdata.c +++ kconfig/confdata.c @@ -71,9 +71,7 @@ const char *conf_get_autoconfig_name(void) { - char *name = getenv("KCONFIG_AUTOCONFIG"); - - return name ? name : "include/config/auto.conf"; + return getenv("KCONFIG_AUTOCONFIG"); } static char *conf_expand_value(const char *in) @@ -563,6 +561,9 @@ char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1]; char *env; + if (!name) + name = conf_get_configname(); + dirname[0] = 0; if (name && name[0]) { struct stat st; @@ -661,6 +662,7 @@ { const char *name; char path[PATH_MAX+1]; + char *opwd, *dir, *_name; char *s, *d, c; struct symbol *sym; struct stat sb; @@ -669,8 +671,20 @@ name = conf_get_autoconfig_name(); conf_read_simple(name, S_DEF_AUTO); - if (chdir("include/config")) - return 1; + 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) { @@ -763,9 +777,11 @@ close(fd); } out: - if (chdir("../..")) - return 1; - + if (chdir(opwd)) + res = 1; +err: + free(opwd); + free(_name); return res; } @@ -776,25 +792,38 @@ const char *name; FILE *out, *tristate, *out_h; int i; + 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; - tristate = fopen(".tmpconfig_tristate", "w"); + sprintf(buf, "%s.tmpconfig_tristate", dir); + tristate = fopen(buf, "w"); if (!tristate) { fclose(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); fclose(tristate); @@ -871,19 +900,22 @@ name = getenv("KCONFIG_AUTOHEADER"); if (!name) name = "include/generated/autoconf.h"; - if (rename(".tmpconfig.h", name)) + sprintf(buf, "%s.tmpconfig.h", dir); + if (rename(buf, name)) return 1; name = getenv("KCONFIG_TRISTATE"); if (!name) name = "include/config/tristate.conf"; - if (rename(".tmpconfig_tristate", name)) + sprintf(buf, "%s.tmpconfig_tristate", dir); + if (rename(buf, name)) return 1; 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: kconfig/util.c =================================================================== --- kconfig.orig/util.c +++ kconfig/util.c @@ -32,6 +32,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; @@ -39,7 +41,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"); @@ -70,7 +81,8 @@ fprintf(out, "\n$(deps_config): ;\n"); fclose(out); - rename("..config.tmp", name); + sprintf(buf2, "%s%s", dir, name); + rename(buf, buf2); return 0; }