]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
kconfig: add a function to dump all menu entries in a tree-like format
authorMasahiro Yamada <masahiroy@kernel.org>
Sun, 29 Jun 2025 18:48:31 +0000 (03:48 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Sat, 26 Jul 2025 06:31:30 +0000 (15:31 +0900)
This is useful for debugging purposes. menu_finalize() re-parents menu
entries, and this function can be used to dump the final structure of
the menu tree.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
scripts/kconfig/lkc.h
scripts/kconfig/menu.c

index 37b606c74bff3a1dd741fde0d60e716029d2830c..56548efc14d70103c2287c0c81e3916c08021c35 100644 (file)
@@ -102,6 +102,7 @@ struct menu *menu_get_menu_or_parent_menu(struct menu *menu);
 int get_jump_key_char(void);
 struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
 void menu_get_ext_help(struct menu *menu, struct gstr *help);
+void menu_dump(void);
 
 /* symbol.c */
 void sym_clear_all_valid(void);
index a5e5b4fdcd935534cf6f2aae4d568096acae8b9a..0f1a6513987c8f0a446fbef3ce1eb7f305a94a42 100644 (file)
@@ -788,3 +788,77 @@ void menu_get_ext_help(struct menu *menu, struct gstr *help)
        if (sym)
                get_symbol_str(help, sym, NULL);
 }
+
+/**
+ * menu_dump - dump all menu entries in a tree-like format
+ */
+void menu_dump(void)
+{
+       struct menu *menu = &rootmenu;
+       unsigned long long bits = 0;
+       int indent = 0;
+
+       while (menu) {
+
+               for (int i = indent - 1; i >= 0; i--) {
+                       if (bits & (1ULL << i)) {
+                               if (i > 0)
+                                       printf("|   ");
+                               else
+                                       printf("|-- ");
+                       } else {
+                               if (i > 0)
+                                       printf("    ");
+                               else
+                                       printf("`-- ");
+                       }
+               }
+
+               switch (menu->type) {
+               case M_CHOICE:
+                       printf("choice \"%s\"\n", menu->prompt->text);
+                       break;
+               case M_COMMENT:
+                       printf("comment \"%s\"\n", menu->prompt->text);
+                       break;
+               case M_IF:
+                       printf("if\n");
+                       break;
+               case M_MENU:
+                       printf("menu \"%s\"", menu->prompt->text);
+                       if (!menu->sym) {
+                               printf("\n");
+                               break;
+                       }
+                       printf(" + ");
+                       /* fallthrough */
+               case M_NORMAL:
+                       printf("symbol %s\n", menu->sym->name);
+                       break;
+               }
+               if (menu->list) {
+                       bits <<= 1;
+                       menu = menu->list;
+                       if (menu->next)
+                               bits |= 1;
+                       else
+                               bits &= ~1;
+                       indent++;
+                       continue;
+               }
+
+               while (menu && !menu->next) {
+                       menu = menu->parent;
+                       bits >>= 1;
+                       indent--;
+               }
+
+               if (menu) {
+                       menu = menu->next;
+                       if (menu->next)
+                               bits |= 1;
+                       else
+                               bits &= ~1;
+               }
+       }
+}