From 28a36b609a26f6d213b2290ef0cadbfe94901b44 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Sun, 23 Sep 2007 20:28:53 +0000 Subject: [PATCH] - thinking loud about auto-generating dependencies for make(1) Don't use this, it doesn't work yet. Thoughs welcome. Like: We should probably use the sym->text and not fiddle with the name since the name looses information ('_' != '-' in host-fakeroot). This would not be too robust, i fear, since the name can contain additional, arbitrary info. Also, the real 'depends' are a little bit ugly in kconfig. There doesn't seem to be a nice property that holds reverse deps that are only contain selected symbols. Thoughts? --- package/config/kconfig-to-buildroot2.patch | 124 +++++++++++++++++++++ package/config/util.c | 106 +++++++++++++++++- 2 files changed, 229 insertions(+), 1 deletion(-) diff --git a/package/config/kconfig-to-buildroot2.patch b/package/config/kconfig-to-buildroot2.patch index 01701d8325..ef0d2e04a7 100644 --- a/package/config/kconfig-to-buildroot2.patch +++ b/package/config/kconfig-to-buildroot2.patch @@ -1303,3 +1303,127 @@ diff -rdup kernel-config/zconf.y config/zconf.y return name ? name : ".config"; } +Index: util.c +=================================================================== +--- kernel-config/util.c (revision 19969) ++++ config/util.c (working copy) +@@ -26,6 +26,109 @@ struct file *file_lookup(const char *nam + return file; + } + ++static char* br2_symbol_printer(const char * const in) ++{ ++ ssize_t i, j, len = strlen(in); ++ char *ret; ++ if (len < 1) ++ return NULL; ++ ret = malloc(len); ++ if (!ret) { ++ printf("Out of memory!"); ++ exit(1); ++ } ++ memset(ret, 0, len); ++ i = j = 0; ++ if (strncmp("BR2_", in, 4) == 0) ++ i += 4; ++ if (strncmp("PACKAGE_", in + i, 8) == 0) ++ i += 8; ++ else if (strncmp("TARGET_", in + i, 7) == 0) ++ i += 7; ++ while (i <= len) ++ ret[j++] = tolower(in[i++]); ++ return ret; ++} ++ ++/* write dependencies of the infividual config-symbols */ ++static int write_make_deps(const char *name) ++{ ++ struct menu *menu; ++ struct symbol *sym; ++ struct property *prop, *p; ++ unsigned done; ++ const char * const name_tmp = "..make.deps.tmp"; ++ FILE *out; ++ if (!name) ++ name = ".auto.deps"; ++ out = fopen(name_tmp, "w"); ++ if (!out) ++ return 1; ++ fprintf(out, "# ATTENTION! This does not handle 'depends', just 'select'! \n" ++ "# See package/config/util.c write_make_deps()\n#\n"); ++ menu = &rootmenu;//rootmenu.list; ++ while (menu) { ++ sym = menu->sym; ++ if (!sym) { ++ if (!menu_is_visible(menu)) ++ goto next; ++ } else if (!(sym->flags & SYMBOL_CHOICE)) { ++ sym_calc_value(sym); ++ if (sym->type == S_BOOLEAN ++ && sym_get_tristate_value(sym) != no) { ++ done = 0; ++ for_all_prompts(sym, prop) { ++ struct expr *e; ++//printf("\nname=%s\n", sym->name); ++ for_all_properties(sym, p, P_SELECT) { ++ e = p->expr; ++ if (e && e->left.sym->name) { ++ if (!done) { ++ fprintf(out, "%s:", br2_symbol_printer(sym->name)); ++ done = 1; ++ } ++//printf("SELECTS %s\n",e->left.sym->name); ++ fprintf(out, " %s",br2_symbol_printer(e->left.sym->name)); ++ } ++ } ++ if (done) ++ fprintf(out, "\n"); ++#if 0 ++ e = sym->rev_dep.expr; ++ if (e && e->type == E_SYMBOL ++ && e->left.sym->name) { ++ fprintf(out, "%s: %s", br2_symbol_printer(e->left.sym->name), ++ br2_symbol_printer(sym->name)); ++printf("%s is Selected BY: %s", sym->name, e->left.sym->name); ++ } ++#endif ++ } ++ } ++ } ++next: ++ if (menu->list) { ++ menu = menu->list; ++ continue; ++ } ++ if (menu->next) ++ menu = menu->next; ++ else while ((menu = menu->parent)) { ++ if (menu->next) { ++ menu = menu->next; ++ break; ++ } ++ } ++ } ++ fclose(out); ++ rename(name_tmp, name); ++ printf(_("#\n" ++ "# make dependencies written to %s\n" ++ "# ATTENTION buildroot devels!\n" ++ "# See top of this file before playing with this auto-preprequisites!\n" ++ "#\n"), name); ++ return 0; ++} ++ + /* write a dependency file as used by kbuild to track dependencies */ + int file_write_dep(const char *name) + { +@@ -49,7 +152,8 @@ int file_write_dep(const char *name) + "$(deps_config): ;\n"); + fclose(out); + rename("..config.tmp", name); +- return 0; ++ ++ return write_make_deps(NULL); + } + + diff --git a/package/config/util.c b/package/config/util.c index 4973ee5d52..a388f848cc 100644 --- a/package/config/util.c +++ b/package/config/util.c @@ -26,6 +26,109 @@ struct file *file_lookup(const char *name) return file; } +static char* br2_symbol_printer(const char * const in) +{ + ssize_t i, j, len = strlen(in); + char *ret; + if (len < 1) + return NULL; + ret = malloc(len); + if (!ret) { + printf("Out of memory!"); + exit(1); + } + memset(ret, 0, len); + i = j = 0; + if (strncmp("BR2_", in, 4) == 0) + i += 4; + if (strncmp("PACKAGE_", in + i, 8) == 0) + i += 8; + else if (strncmp("TARGET_", in + i, 7) == 0) + i += 7; + while (i <= len) + ret[j++] = tolower(in[i++]); + return ret; +} + +/* write dependencies of the infividual config-symbols */ +static int write_make_deps(const char *name) +{ + struct menu *menu; + struct symbol *sym; + struct property *prop, *p; + unsigned done; + const char * const name_tmp = "..make.deps.tmp"; + FILE *out; + if (!name) + name = ".auto.deps"; + out = fopen(name_tmp, "w"); + if (!out) + return 1; + fprintf(out, "# ATTENTION! This does not handle 'depends', just 'select'! \n" + "# See package/config/util.c write_make_deps()\n#\n"); + menu = &rootmenu;//rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + } else if (!(sym->flags & SYMBOL_CHOICE)) { + sym_calc_value(sym); + if (sym->type == S_BOOLEAN + && sym_get_tristate_value(sym) != no) { + done = 0; + for_all_prompts(sym, prop) { + struct expr *e; +//printf("\nname=%s\n", sym->name); + for_all_properties(sym, p, P_SELECT) { + e = p->expr; + if (e && e->left.sym->name) { + if (!done) { + fprintf(out, "%s:", br2_symbol_printer(sym->name)); + done = 1; + } +//printf("SELECTS %s\n",e->left.sym->name); + fprintf(out, " %s",br2_symbol_printer(e->left.sym->name)); + } + } + if (done) + fprintf(out, "\n"); +#if 0 + e = sym->rev_dep.expr; + if (e && e->type == E_SYMBOL + && e->left.sym->name) { + fprintf(out, "%s: %s", br2_symbol_printer(e->left.sym->name), + br2_symbol_printer(sym->name)); +printf("%s is Selected BY: %s", sym->name, e->left.sym->name); + } +#endif + } + } + } +next: + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->next) { + menu = menu->next; + break; + } + } + } + fclose(out); + rename(name_tmp, name); + printf(_("#\n" + "# make dependencies written to %s\n" + "# ATTENTION buildroot devels!\n" + "# See top of this file before playing with this auto-preprequisites!\n" + "#\n"), name); + return 0; +} + /* write a dependency file as used by kbuild to track dependencies */ int file_write_dep(const char *name) { @@ -49,7 +152,8 @@ int file_write_dep(const char *name) "$(deps_config): ;\n"); fclose(out); rename("..config.tmp", name); - return 0; + + return write_make_deps(NULL); } -- 2.30.2