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. --- 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; -- Simon Arlott - 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