On Thu, 19 Jul 2007 23:05:57 +0100 Simon Arlott wrote:

> On 19/07/07 17:19, Robert P. J. Day wrote:
> > On Thu, 19 Jul 2007, Randy Dunlap wrote:
> >> I think that Stefan means a patch to the kconfig source code,
> >> not the the Kconfig files.  Good luck.  I'd still like to see it.
> > 
> > yes, i understand what he wanted now.  as a first step (that
> > theoretically shouldn't change any behaviour), i'd patch the Kconfig
> > structure to add a new attribute ("maturity") which would be allowed
> > to be set to *exactly one* of a pre-defined set of values (say,
> > OBSOLETE, DEPRECATED, EXPERIMENTAL, and STILLBLEEDING).  and that's
> > it, nothing more.
> > 
> > don't try to do anything with any of that just yet, just add the
> > infrastructure to support the (optional) association of a maturity
> > level with a config option.  that's step one.
> 
> What about something like this? I'm not sure if the addition to sym_init
> is desirable... I also had to prefix _ to the name for now otherwise it
> conflicts badly with the current symbols. It probably should stop
> "depends on _BROKEN" etc. too.

Hi Simon,

(sorry for the delay)

I like this patch very much... I just can't get it to build (on
2.6.23-rc4).

Thanks.

> ---
> diff --git a/init/Kconfig b/init/Kconfig
> diff --git a/net/Kconfig b/net/Kconfig
> index cdba08c..5e2f4db 100644
> --- a/net/Kconfig
> +++ b/net/Kconfig
> @@ -6,6 +6,7 @@ menu "Networking"
> 
>  config NET
>       bool "Networking support"
> +     maturity _BROKEN
>       ---help---
>         Unless you really know what you are doing, you should say Y here.
>         The reason is that some programs need kernel networking support even
> diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
> diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
> index fb2bb30..1dea08e 100644
> --- a/scripts/kconfig/Makefile
> +++ b/scripts/kconfig/Makefile
> @@ -256,7 +256,7 @@ $(obj)/lkc_defs.h: $(src)/lkc_proto.h
>  # The following requires flex/bison/gperf
>  # By default we use the _shipped versions, uncomment the following line if
>  # you are modifying the flex/bison src.
> -# LKC_GENPARSER := 1
> +LKC_GENPARSER := 1
> 
>  ifdef LKC_GENPARSER
> 
> diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
> index 1199baf..cc9be0e 100644
> --- a/scripts/kconfig/conf.c
> +++ b/scripts/kconfig/conf.c
> @@ -211,6 +211,22 @@ static int conf_sym(struct menu *menu)
> 
>       while (1) {
>               printf("%*s%s ", indent - 1, "", menu->prompt->text);
> +             switch (sym->maturity) {
> +             case M_EXPERIMENTAL:
> +                     printf("(EXPERIMENTAL) ");
> +                     break;
> +             case M_DEPRECATED:
> +                     printf("(DEPRECATED) ");
> +                     break;
> +             case M_OBSOLETE:
> +                     printf("(OBSOLETE) ");
> +                     break;
> +             case M_BROKEN:
> +                     printf("(BROKEN) ");
> +                     break;
> +             default:
> +                     break;
> +             }
>               if (sym->name)
>                       printf("(%s) ", sym->name);
>               type = sym_get_type(sym);
> diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
> index 6084525..a22b6c1 100644
> --- a/scripts/kconfig/expr.h
> +++ b/scripts/kconfig/expr.h
> @@ -60,7 +60,11 @@ struct symbol_value {
>  };
> 
>  enum symbol_type {
> -     S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
> +     S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_MATURITY,
> S_OTHER
> +};
> +
> +enum maturity_level {
> +     M_NONE, M_EXPERIMENTAL, M_DEPRECATED, M_OBSOLETE, M_BROKEN
>  };
> 
>  enum {
> @@ -72,6 +76,7 @@ struct symbol {
>       struct symbol *next;
>       char *name;
>       char *help;
> +     enum maturity_level maturity;
>       enum symbol_type type;
>       struct symbol_value curr;
>       struct symbol_value def[4];
> diff --git a/scripts/kconfig/lex.zconf.c_shipped
> b/scripts/kconfig/lex.zconf.c_shipped
> diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
> index 8a07ee4..9add1cd 100644
> --- a/scripts/kconfig/lkc.h
> +++ b/scripts/kconfig/lkc.h
> @@ -79,6 +79,7 @@ void menu_end_menu(void);
>  void menu_add_entry(struct symbol *sym);
>  void menu_end_entry(void);
>  void menu_add_dep(struct expr *dep);
> +void menu_set_maturity(struct symbol *sym);
>  struct property *menu_add_prop(enum prop_type type, char *prompt,
> struct expr *expr, struct expr *dep);
>  struct property *menu_add_prompt(enum prop_type type, char *prompt,
> struct expr *dep);
>  void menu_add_expr(enum prop_type type, struct expr *expr, struct expr
> *dep);
> diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
> index d0e4fa5..eaf199b 100644
> --- a/scripts/kconfig/mconf.c
> +++ b/scripts/kconfig/mconf.c
> @@ -238,6 +238,7 @@ search_help[] = N_(
>       "Result:\n"
>       "-----------------------------------------------------------------\n"
>       "Symbol: FOO [=m]\n"
> +     "Maturity: FOO\n"
>       "Prompt: Foo bus is used to drive the bar HW\n"
>       "Defined at drivers/pci/Kconfig:47\n"
>       "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
> @@ -359,6 +360,27 @@ static void get_symbol_str(struct gstr *r, struct
> symbol *sym)
> 
>       str_printf(r, "Symbol: %s [=%s]\n", sym->name,
>                                      sym_get_string_value(sym));
> +
> +     if (sym->maturity != M_NONE) {
> +             str_append(r, "Maturity: ");
> +             switch (sym->maturity) {
> +             case M_EXPERIMENTAL:
> +                     str_append(r, "EXPERIMENTAL\n");
> +                     break;
> +             case M_DEPRECATED:
> +                     str_append(r, "DEPRECATED\n");
> +                     break;
> +             case M_OBSOLETE:
> +                     str_append(r, "OBSOLETE\n");
> +                     break;
> +             case M_BROKEN:
> +                     str_append(r, "BROKEN\n");
> +                     break;
> +             default:
> +                     break;
> +             }
> +     }
> +
>       for_all_prompts(sym, prop)
>               get_prompt_str(r, prop);
>       hit = false;
> diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
> index f14aeac..3e37e5b 100644
> --- a/scripts/kconfig/menu.c
> +++ b/scripts/kconfig/menu.c
> @@ -104,6 +104,15 @@ void menu_add_dep(struct expr *dep)
>       current_entry->dep = expr_alloc_and(current_entry->dep,
> menu_check_dep(dep));
>  }
> 
> +void menu_set_maturity(struct symbol *sym)
> +{
> +     if (sym->type != S_MATURITY) {
> +             zconf_error("'%s' is an invalid maturity level", sym->name);
> +     } else {
> +             current_entry->sym->maturity = sym->maturity;
> +     }
> +}
> +
>  void menu_set_type(int type)
>  {
>       struct symbol *sym = current_entry->sym;
> diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
> index c35dcc5..280ee8f 100644
> --- a/scripts/kconfig/symbol.c
> +++ b/scripts/kconfig/symbol.c
> @@ -72,6 +72,22 @@ void sym_init(void)
>       sym->type = S_STRING;
>       sym->flags |= SYMBOL_AUTO;
>       sym_add_default(sym, uts.release);
> +
> +     sym = sym_lookup("_EXPERIMENTAL", 0);
> +     sym->type = S_MATURITY;
> +     sym->maturity = M_EXPERIMENTAL;
> +
> +     sym = sym_lookup("_DEPRECATED", 0);
> +     sym->type = S_MATURITY;
> +     sym->maturity = M_DEPRECATED;
> +
> +     sym = sym_lookup("_OBSOLETE", 0);
> +     sym->type = S_MATURITY;
> +     sym->maturity = M_OBSOLETE;
> +
> +     sym = sym_lookup("_BROKEN", 0);
> +     sym->type = S_MATURITY;
> +     sym->maturity = M_BROKEN;
>  }
> 
>  enum symbol_type sym_get_type(struct symbol *sym)
> @@ -100,6 +116,8 @@ const char *sym_type_name(enum symbol_type type)
>               return "hex";
>       case S_STRING:
>               return "string";
> +     case S_MATURITY:
> +             return "maturity";
>       case S_UNKNOWN:
>               return "unknown";
>       case S_OTHER:
> @@ -679,6 +697,7 @@ struct symbol *sym_lookup(const char *name, int isconst)
>       memset(symbol, 0, sizeof(*symbol));
>       symbol->name = new_name;
>       symbol->type = S_UNKNOWN;
> +     symbol->maturity = M_NONE;
>       if (isconst)
>               symbol->flags |= SYMBOL_CONST;
> 
> diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
> index 9b44c80..756d559 100644
> --- a/scripts/kconfig/zconf.gperf
> +++ b/scripts/kconfig/zconf.gperf
> @@ -25,6 +25,7 @@ endif,              T_ENDIF,        TF_COMMAND
>  depends,     T_DEPENDS,      TF_COMMAND
>  requires,    T_REQUIRES,     TF_COMMAND
>  optional,    T_OPTIONAL,     TF_COMMAND
> +maturity,    T_MATURITY,     TF_COMMAND
>  default,     T_DEFAULT,      TF_COMMAND, S_UNKNOWN
>  prompt,              T_PROMPT,       TF_COMMAND
>  tristate,    T_TYPE,         TF_COMMAND, S_TRISTATE
> diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
> index 92eb02b..1b47966 100644
> --- a/scripts/kconfig/zconf.y
> +++ b/scripts/kconfig/zconf.y
> @@ -66,6 +66,7 @@ static struct menu *current_menu, *current_entry;
>  %token <id>T_DEPENDS
>  %token <id>T_REQUIRES
>  %token <id>T_OPTIONAL
> +%token <id>T_MATURITY
>  %token <id>T_PROMPT
>  %token <id>T_TYPE
>  %token <id>T_DEFAULT
> @@ -120,7 +121,7 @@ stmt_list:
>  ;
> 
>  option_name:
> -     T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE |
> T_DEFAULT
> +     T_DEPENDS | T_MATURITY | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL |
> T_RANGE | T_DEFAULT
>  ;
> 
>  common_stmt:
> @@ -177,6 +178,7 @@ config_option_list:
>       | config_option_list config_option
>       | config_option_list symbol_option
>       | config_option_list depends
> +     | config_option_list maturity
>       | config_option_list help
>       | config_option_list option_error
>       | config_option_list T_EOL
> @@ -269,6 +271,7 @@ choice_option_list:
>         /* empty */
>       | choice_option_list choice_option
>       | choice_option_list depends
> +     | choice_option_list maturity
>       | choice_option_list help
>       | choice_option_list T_EOL
>       | choice_option_list option_error
> @@ -349,7 +352,7 @@ menu: T_MENU prompt T_EOL
>       printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
>  };
> 
> -menu_entry: menu depends_list
> +menu_entry: menu maturity_set_opt depends_list
>  {
>       $$ = menu_add_menu();
>  };
> @@ -430,6 +433,19 @@ depends: T_DEPENDS T_ON expr T_EOL
>       printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), 
> zconf_lineno());
>  };
> 
> +/* maturity setting */
> +
> +maturity_set_opt:
> +       /* empty */
> +     | maturity
> +;
> +
> +maturity: T_MATURITY symbol T_EOL
> +{
> +     menu_set_maturity($2);
> +     printd(DEBUG_PARSE, "%s:%d:maturity\n", zconf_curname(), 
> zconf_lineno());
> +};
> +
>  /* prompt statement */
> 
>  prompt_stmt_opt:
> @@ -519,6 +535,7 @@ const char *zconf_tokenname(int token)
>       case T_IF:              return "if";
>       case T_ENDIF:           return "endif";
>       case T_DEPENDS:         return "depends";
> +     case T_MATURITY:        return "maturity";
>       }
>       return "<token>";
>  }
> @@ -615,6 +632,9 @@ void print_symbol(FILE *out, struct menu *menu)
>       case S_HEX:
>               fputs("  hex\n", out);
>               break;
> +     case S_MATURITY:
> +             fputs("  maturity\n", out);
> +             break;
>       default:
>               fputs("  ???\n", out);
>               break;
> 
> 
> -- 

---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to