summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2007-09-23 20:28:53 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2007-09-23 20:28:53 +0000
commit28a36b609a26f6d213b2290ef0cadbfe94901b44 (patch)
tree009c41a3d2eec2544ad4dabfd7edf7d1738961bb
parent28f5ba7f39a3dcd4f154c6d77f4ed483f511c6bc (diff)
- 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?
-rw-r--r--package/config/kconfig-to-buildroot2.patch124
-rw-r--r--package/config/util.c106
2 files changed, 229 insertions, 1 deletions
diff --git a/package/config/kconfig-to-buildroot2.patch b/package/config/kconfig-to-buildroot2.patch
index 01701d832..ef0d2e04a 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 4973ee5d5..a388f848c 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);
}