Re: [RFC] kconfig: zconfdump() clean-up

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Mon, May 30, 2011 at 9:24 PM, Arnaud Lacombe <lacombar@xxxxxxxxx> wrote:
> Hi,
>
> On Mon, May 16, 2011 at 12:06 AM, Arnaud Lacombe <lacombar@xxxxxxxxx> wrote:
>> Hi Michal,
>>
>> The following patch is a summarize of changes I made in zconfdump() last week
>> when debugging Yann's multiple choice issue. This might help debugging a bit,
>> espectially by exposing the tree depth.
>>
>> Considering the following Kconfig:
>>
>> config A
>>   bool "A"
>> if A
>> choice C
>>   bool "C"
>> config C1
>>   bool "C1"
>> config C2
>>   bool "C2"
>> endchoice
>> endif # A
>>
>> config B
>>   bool "B"
>>   depends on ! A
>> if B
>> choice C
>>   bool "C"
>> config C1
>>   bool "C1"
>> config C2
>>   bool "C2"
>> endchoice
>> endif # A
>>
>> It generates the following output, after menu_finalize():
>>
>> config A
>>  boolean
>>  symbol
>>  prompt "A"
>>
>>        choice C
>>          boolean
>>          symbol
>>          #choice
>>          prompt "C" if A
>>
>>                config C1
>>                  boolean
>>                  symbol
>>                  prompt "C1" if C
>>                  #choice
>>
>>                config C2
>>                  boolean
>>                  symbol
>>                  prompt "C2" if C
>>                  #choice
>>
>>        endchoice
>>
>>        config B
>>          boolean
>>          symbol
>>          prompt "B" if !A
>>
>>                choice C
>>                  boolean
>>                  symbol
>>                  #choice
>>                  prompt "C" if B
>>
>>                        config C1
>>                          boolean
>>                          symbol
>>                          prompt "C1" if C
>>
>>                        config C2
>>                          boolean
>>                          symbol
>>                          prompt "C2" if C
>>
>>                endchoice
>>
>> instead of:
>>
>> config A
>>  boolean
>>  unknown prop 9!
>>  prompt "A"
>>
>> choice
>>  boolean
>>  unknown prop 9!
>>  #choice value
>>  prompt "C" if A
>>
>> config C1
>>  boolean
>>  unknown prop 9!
>>  prompt "C1" if C
>>  #choice value
>>
>> config C2
>>  boolean
>>  unknown prop 9!
>>  prompt "C2" if C
>>  #choice value
>>
>> config B
>>  boolean
>>  unknown prop 9!
>>  prompt "B" if !A
>>
>> choice
>>  boolean
>>  unknown prop 9!
>>  #choice value
>>  prompt "C" if B
>>
>> config C1
>>  boolean
>>  unknown prop 9!
>>  prompt "C1" if C
>>
>> config C2
>>  boolean
>>  unknown prop 9!
>>  prompt "C2" if C
>>
>> endmenu
>>
>> Broken down patches are available at:
>>
>> https://github.com/lacombar/linux-2.6/tree/kconfig-zconfdump
>>
>> Not for merge for now, even if it merges fine with your kbuild/kconfig's tip.
>>
> ping ?
>
ping^2 ?

 - Arnaud

>
>> Regards,
>>  - Arnaud
>>
>> ---
>>  scripts/kconfig/zconf.y |  161 +++++++++++++++++++----------------------------
>>  1 files changed, 66 insertions(+), 95 deletions(-)
>>
>> diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
>> index 237ae2a..f18bc5a 100644
>> --- a/scripts/kconfig/zconf.y
>> +++ b/scripts/kconfig/zconf.y
>> @@ -612,129 +612,100 @@ static void print_quoted_string(FILE *out, const char *str)
>>        putc('"', out);
>>  }
>>
>> -static void print_symbol(FILE *out, struct menu *menu)
>> +static int indent;
>> +
>> +static void print_property(FILE *out, struct property *prop)
>>  {
>> -       struct symbol *sym = menu->sym;
>> -       struct property *prop;
>> +       const char *prop_string;
>>
>> -       if (sym_is_choice(sym))
>> -               fprintf(out, "\nchoice\n");
>> -       else
>> -               fprintf(out, "\nconfig %s\n", sym->name);
>> -       switch (sym->type) {
>> -       case S_BOOLEAN:
>> -               fputs("  boolean\n", out);
>> -               break;
>> -       case S_TRISTATE:
>> -               fputs("  tristate\n", out);
>> +       prop_string = prop_get_type_name(prop->type);
>> +       if (prop_string == NULL)
>> +               return;
>> +
>> +       fprintf(out, "%*s  %s%s ", indent * 8, "",
>> +           (prop->type == P_CHOICE) ? "#" : "",
>> +           prop_string);
>> +
>> +       switch (prop->type) {
>> +       case P_PROMPT:
>> +               print_quoted_string(out, prop->text);
>> +               if (!expr_is_yes(prop->visible.expr)) {
>> +                       fputs(" if ", out);
>> +                       expr_fprint(prop->visible.expr, out);
>> +               }
>>                break;
>> -       case S_STRING:
>> -               fputs("  string\n", out);
>> +       case P_DEFAULT:
>> +               expr_fprint(prop->expr, out);
>> +               if (!expr_is_yes(prop->visible.expr)) {
>> +                       fputs(" if ", out);
>> +                       expr_fprint(prop->visible.expr, out);
>> +               }
>>                break;
>> -       case S_INT:
>> -               fputs("  integer\n", out);
>> +       case P_SELECT:
>> +       case P_RANGE:
>> +               expr_fprint(prop->expr, out);
>>                break;
>> -       case S_HEX:
>> -               fputs("  hex\n", out);
>> +       case P_MENU:
>> +       case P_COMMENT:
>> +               print_quoted_string(out, prop->text);
>>                break;
>>        default:
>> -               fputs("  ???\n", out);
>>                break;
>>        }
>> +       fprintf(out, "\n");
>> +}
>> +
>> +static void print_symbol(FILE *out, struct menu *menu)
>> +{
>> +       struct symbol *sym = menu->sym;
>> +       struct property *prop;
>> +
>> +       fprintf(out, "%*s%s %s\n", indent * 8, "",
>> +           (sym_is_choice(sym)) ? "choice" : "config",
>> +           (sym->name) ? sym->name: "");
>> +       fprintf(out, "%*s  %s\n", indent * 8, "",
>> +           sym_type_name(sym->type));
>> +
>>        for (prop = sym->prop; prop; prop = prop->next) {
>>                if (prop->menu != menu)
>>                        continue;
>> -               switch (prop->type) {
>> -               case P_PROMPT:
>> -                       fputs("  prompt ", out);
>> -                       print_quoted_string(out, prop->text);
>> -                       if (!expr_is_yes(prop->visible.expr)) {
>> -                               fputs(" if ", out);
>> -                               expr_fprint(prop->visible.expr, out);
>> -                       }
>> -                       fputc('\n', out);
>> -                       break;
>> -               case P_DEFAULT:
>> -                       fputs( "  default ", out);
>> -                       expr_fprint(prop->expr, out);
>> -                       if (!expr_is_yes(prop->visible.expr)) {
>> -                               fputs(" if ", out);
>> -                               expr_fprint(prop->visible.expr, out);
>> -                       }
>> -                       fputc('\n', out);
>> -                       break;
>> -               case P_CHOICE:
>> -                       fputs("  #choice value\n", out);
>> -                       break;
>> -               case P_SELECT:
>> -                       fputs( "  select ", out);
>> -                       expr_fprint(prop->expr, out);
>> -                       fputc('\n', out);
>> -                       break;
>> -               case P_RANGE:
>> -                       fputs( "  range ", out);
>> -                       expr_fprint(prop->expr, out);
>> -                       fputc('\n', out);
>> -                       break;
>> -               case P_MENU:
>> -                       fputs( "  menu ", out);
>> -                       print_quoted_string(out, prop->text);
>> -                       fputc('\n', out);
>> -                       break;
>> -               case P_SYMBOL:
>> -                       break;
>> -               default:
>> -                       fprintf(out, "  unknown prop %d!\n", prop->type);
>> -                       break;
>> -               }
>> -       }
>> -       if (menu->help) {
>> -               int len = strlen(menu->help);
>> -               while (menu->help[--len] == '\n')
>> -                       menu->help[len] = 0;
>> -               fprintf(out, "  help\n%s\n", menu->help);
>> +               print_property(out, prop);
>>        }
>> +       fprintf(out, "\n");
>>  }
>>
>>  void zconfdump(FILE *out)
>>  {
>> -       struct property *prop;
>> -       struct symbol *sym;
>>        struct menu *menu;
>>
>>        menu = rootmenu.list;
>>        while (menu) {
>> -               if ((sym = menu->sym))
>> +               if (menu->sym)
>>                        print_symbol(out, menu);
>> -               else if ((prop = menu->prompt)) {
>> -                       switch (prop->type) {
>> -                       case P_COMMENT:
>> -                               fputs("\ncomment ", out);
>> -                               print_quoted_string(out, prop->text);
>> -                               fputs("\n", out);
>> -                               break;
>> -                       case P_MENU:
>> -                               fputs("\nmenu ", out);
>> -                               print_quoted_string(out, prop->text);
>> -                               fputs("\n", out);
>> -                               break;
>> -                       default:
>> -                               ;
>> -                       }
>> -                       if (!expr_is_yes(prop->visible.expr)) {
>> -                               fputs("  depends ", out);
>> -                               expr_fprint(prop->visible.expr, out);
>> -                               fputc('\n', out);
>> -                       }
>> +
>> +               if (menu->help) {
>> +                       int len = strlen(menu->help);
>> +                       while (menu->help[--len] == '\n')
>> +                               menu->help[len] = 0;
>> +                       fprintf(out, "%*s  help\n%s\n", indent * 8, "",
>> +                           menu->help);
>>                }
>>
>> -               if (menu->list)
>> +               if (menu->list) {
>> +                       indent++;
>>                        menu = menu->list;
>> +               }
>>                else if (menu->next)
>>                        menu = menu->next;
>>                else while ((menu = menu->parent)) {
>> -                       if (menu->prompt && menu->prompt->type == P_MENU)
>> -                               fputs("\nendmenu\n", out);
>> +                       if (menu != &rootmenu)
>> +                               indent--;
>> +                       fprintf(out, "%*s", indent * 8, "");
>> +                       if (menu->sym && sym_is_choice(menu->sym))
>> +                               fprintf(out, "endchoice\n\n");
>> +                       if (menu->prompt && menu->prompt->type == P_MENU &&
>> +                           menu != &rootmenu)
>> +                               fprintf(out, "endmenu\n\n");
>>                        if (menu->next) {
>>                                menu = menu->next;
>>                                break;
>> --
>> 1.7.3.4.574.g608b.dirty
>>
>>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux