| --- |
| conf.c | 1 |
| confdata.c | 65 +++++++++++++++++++++++++++++++++++++++++++++---------------- |
| util.c | 16 +++++++++++++-- |
| 3 files changed, 62 insertions(+), 20 deletions(-) |
| |
| Index: config/conf.c |
| =================================================================== |
| --- config.orig/conf.c |
| +++ config/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: config/confdata.c |
| =================================================================== |
| --- config.orig/confdata.c |
| +++ config/confdata.c |
| @@ -44,9 +44,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) |
| @@ -542,6 +540,9 @@ |
| int use_timestamp = 1; |
| char *env; |
| |
| + if (!name) |
| + name = conf_get_configname(); |
| + |
| dirname[0] = 0; |
| if (name && name[0]) { |
| struct stat st; |
| @@ -656,6 +657,7 @@ |
| { |
| const char *name; |
| char path[128]; |
| + char *opwd, *dir, *_name; |
| char *s, *d, c; |
| struct symbol *sym; |
| struct stat sb; |
| @@ -664,8 +666,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) { |
| @@ -758,9 +772,11 @@ |
| close(fd); |
| } |
| out: |
| - if (chdir("../..")) |
| - return 1; |
| - |
| + if (chdir(opwd)) |
| + res = 1; |
| +err: |
| + free(opwd); |
| + free(_name); |
| return res; |
| } |
| |
| @@ -772,25 +788,38 @@ |
| FILE *out, *tristate, *out_h; |
| time_t now; |
| 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); |
| @@ -811,8 +840,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) { |
| @@ -866,19 +894,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: config/util.c |
| =================================================================== |
| --- config.orig/util.c |
| +++ config/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"); |
| @@ -182,7 +193,8 @@ |
| |
| 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); |
| } |
| |