summaryrefslogtreecommitdiff
path: root/scripts/kconfig/zconf.y
Unidiff
Diffstat (limited to 'scripts/kconfig/zconf.y') (more/less context) (show whitespace changes)
-rw-r--r--scripts/kconfig/zconf.y228
1 files changed, 133 insertions, 95 deletions
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 996b10a..2468068 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -28,5 +28,5 @@ struct symbol *symbol_hash[257];
28#define YYERROR_VERBOSE 28#define YYERROR_VERBOSE
29%} 29%}
30%expect 36 30%expect 40
31 31
32%union 32%union
@@ -47,4 +47,5 @@ struct symbol *symbol_hash[257];
47%token T_COMMENT 47%token T_COMMENT
48%token T_CONFIG 48%token T_CONFIG
49%token T_MENUCONFIG
49%token T_HELP 50%token T_HELP
50%token <string> T_HELPTEXT 51%token <string> T_HELPTEXT
@@ -57,9 +58,12 @@ struct symbol *symbol_hash[257];
57%token T_DEFAULT 58%token T_DEFAULT
58%token T_TRISTATE 59%token T_TRISTATE
60%token T_DEF_TRISTATE
59%token T_BOOLEAN 61%token T_BOOLEAN
62%token T_DEF_BOOLEAN
63%token T_STRING
60%token T_INT 64%token T_INT
61%token T_HEX 65%token T_HEX
62%token <string> T_WORD 66%token <string> T_WORD
63%token <string> T_STRING 67%token <string> T_WORD_QUOTE
64%token T_UNEQUAL 68%token T_UNEQUAL
65%token T_EOF 69%token T_EOF
@@ -68,4 +72,6 @@ struct symbol *symbol_hash[257];
68%token T_OPEN_PAREN 72%token T_OPEN_PAREN
69%token T_ON 73%token T_ON
74%token T_SELECT
75%token T_RANGE
70 76
71%left T_OR 77%left T_OR
@@ -104,4 +110,5 @@ common_block:
104 | comment_stmt 110 | comment_stmt
105 | config_stmt 111 | config_stmt
112 | menuconfig_stmt
106 | source_stmt 113 | source_stmt
107 | nl_or_eof 114 | nl_or_eof
@@ -109,7 +116,7 @@ common_block:
109 116
110 117
111/* config entry */ 118/* config/menuconfig entry */
112 119
113config_entry_start: T_CONFIG T_WORD 120config_entry_start: T_CONFIG T_WORD T_EOL
114{ 121{
115 struct symbol *sym = sym_lookup($2, 0); 122 struct symbol *sym = sym_lookup($2, 0);
@@ -119,5 +126,5 @@ config_entry_start: T_CONFIG T_WORD
119}; 126};
120 127
121config_stmt: config_entry_start T_EOL config_option_list 128config_stmt: config_entry_start config_option_list
122{ 129{
123 menu_end_entry(); 130 menu_end_entry();
@@ -125,13 +132,31 @@ config_stmt: config_entry_start T_EOL config_option_list
125}; 132};
126 133
134menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
135{
136 struct symbol *sym = sym_lookup($2, 0);
137 sym->flags |= SYMBOL_OPTIONAL;
138 menu_add_entry(sym);
139 printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
140};
141
142menuconfig_stmt: menuconfig_entry_start config_option_list
143{
144 if (current_entry->prompt)
145 current_entry->prompt->type = P_MENU;
146 else
147 zconfprint("warning: menuconfig statement without prompt");
148 menu_end_entry();
149 printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
150};
151
127config_option_list: 152config_option_list:
128 /* empty */ 153 /* empty */
129 | config_option_list config_option T_EOL 154 | config_option_list config_option
130 | config_option_list depends T_EOL 155 | config_option_list depends
131 | config_option_list help 156 | config_option_list help
132 | config_option_list T_EOL 157 | config_option_list T_EOL
133{ }; 158;
134 159
135config_option: T_TRISTATE prompt_stmt_opt 160config_option: T_TRISTATE prompt_stmt_opt T_EOL
136{ 161{
137 menu_set_type(S_TRISTATE); 162 menu_set_type(S_TRISTATE);
@@ -139,5 +164,12 @@ config_option: T_TRISTATE prompt_stmt_opt
139}; 164};
140 165
141config_option: T_BOOLEAN prompt_stmt_opt 166config_option: T_DEF_TRISTATE expr if_expr T_EOL
167{
168 menu_add_expr(P_DEFAULT, $2, $3);
169 menu_set_type(S_TRISTATE);
170 printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
171};
172
173config_option: T_BOOLEAN prompt_stmt_opt T_EOL
142{ 174{
143 menu_set_type(S_BOOLEAN); 175 menu_set_type(S_BOOLEAN);
@@ -145,5 +177,12 @@ config_option: T_BOOLEAN prompt_stmt_opt
145}; 177};
146 178
147config_option: T_INT prompt_stmt_opt 179config_option: T_DEF_BOOLEAN expr if_expr T_EOL
180{
181 menu_add_expr(P_DEFAULT, $2, $3);
182 menu_set_type(S_BOOLEAN);
183 printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
184};
185
186config_option: T_INT prompt_stmt_opt T_EOL
148{ 187{
149 menu_set_type(S_INT); 188 menu_set_type(S_INT);
@@ -151,5 +190,5 @@ config_option: T_INT prompt_stmt_opt
151}; 190};
152 191
153config_option: T_HEX prompt_stmt_opt 192config_option: T_HEX prompt_stmt_opt T_EOL
154{ 193{
155 menu_set_type(S_HEX); 194 menu_set_type(S_HEX);
@@ -157,5 +196,5 @@ config_option: T_HEX prompt_stmt_opt
157}; 196};
158 197
159config_option: T_STRING prompt_stmt_opt 198config_option: T_STRING prompt_stmt_opt T_EOL
160{ 199{
161 menu_set_type(S_STRING); 200 menu_set_type(S_STRING);
@@ -163,28 +202,40 @@ config_option: T_STRING prompt_stmt_opt
163}; 202};
164 203
165config_option: T_PROMPT prompt if_expr 204config_option: T_PROMPT prompt if_expr T_EOL
166{ 205{
167 menu_add_prop(P_PROMPT, $2, NULL, $3); 206 menu_add_prompt(P_PROMPT, $2, $3);
168 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); 207 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
169}; 208};
170 209
171config_option: T_DEFAULT symbol if_expr 210config_option: T_DEFAULT expr if_expr T_EOL
172{ 211{
173 menu_add_prop(P_DEFAULT, NULL, $2, $3); 212 menu_add_expr(P_DEFAULT, $2, $3);
174 printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); 213 printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
175}; 214};
176 215
216config_option: T_SELECT T_WORD if_expr T_EOL
217{
218 menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
219 printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
220};
221
222config_option: T_RANGE symbol symbol if_expr T_EOL
223{
224 menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
225 printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
226};
227
177/* choice entry */ 228/* choice entry */
178 229
179choice: T_CHOICE 230choice: T_CHOICE T_EOL
180{ 231{
181 struct symbol *sym = sym_lookup(NULL, 0); 232 struct symbol *sym = sym_lookup(NULL, 0);
182 sym->flags |= SYMBOL_CHOICE; 233 sym->flags |= SYMBOL_CHOICE;
183 menu_add_entry(sym); 234 menu_add_entry(sym);
184 menu_add_prop(P_CHOICE, NULL, NULL, NULL); 235 menu_add_expr(P_CHOICE, NULL, NULL);
185 printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); 236 printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
186}; 237};
187 238
188choice_entry: choice T_EOL choice_option_list 239choice_entry: choice choice_option_list
189{ 240{
190 menu_end_entry(); 241 menu_end_entry();
@@ -201,5 +252,5 @@ choice_end: end
201 252
202choice_stmt: 253choice_stmt:
203 choice_entry choice_block choice_end T_EOL 254 choice_entry choice_block choice_end
204 | choice_entry choice_block 255 | choice_entry choice_block
205{ 256{
@@ -210,17 +261,29 @@ choice_stmt:
210choice_option_list: 261choice_option_list:
211 /* empty */ 262 /* empty */
212 | choice_option_list choice_option T_EOL 263 | choice_option_list choice_option
213 | choice_option_list depends T_EOL 264 | choice_option_list depends
214 | choice_option_list help 265 | choice_option_list help
215 | choice_option_list T_EOL 266 | choice_option_list T_EOL
216; 267;
217 268
218choice_option: T_PROMPT prompt if_expr 269choice_option: T_PROMPT prompt if_expr T_EOL
219{ 270{
220 menu_add_prop(P_PROMPT, $2, NULL, $3); 271 menu_add_prompt(P_PROMPT, $2, $3);
221 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); 272 printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
222}; 273};
223 274
224choice_option: T_OPTIONAL 275choice_option: T_TRISTATE prompt_stmt_opt T_EOL
276{
277 menu_set_type(S_TRISTATE);
278 printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
279};
280
281choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
282{
283 menu_set_type(S_BOOLEAN);
284 printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
285};
286
287choice_option: T_OPTIONAL T_EOL
225{ 288{
226 current_entry->sym->flags |= SYMBOL_OPTIONAL; 289 current_entry->sym->flags |= SYMBOL_OPTIONAL;
@@ -228,7 +291,7 @@ choice_option: T_OPTIONAL
228}; 291};
229 292
230choice_option: T_DEFAULT symbol if_expr 293choice_option: T_DEFAULT T_WORD if_expr T_EOL
231{ 294{
232 menu_add_prop(P_DEFAULT, NULL, $2, $3); 295 menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
233 printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); 296 printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
234}; 297};
@@ -241,5 +304,5 @@ choice_block:
241/* if entry */ 304/* if entry */
242 305
243if: T_IF expr 306if: T_IF expr T_EOL
244{ 307{
245 printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); 308 printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
@@ -259,6 +322,6 @@ if_end: end
259 322
260if_stmt: 323if_stmt:
261 if T_EOL if_block if_end T_EOL 324 if if_block if_end
262 | if T_EOL if_block 325 | if if_block
263{ 326{
264 printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); 327 printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
@@ -275,5 +338,5 @@ if_block:
275/* menu entry */ 338/* menu entry */
276 339
277menu: T_MENU prompt 340menu: T_MENU prompt T_EOL
278{ 341{
279 menu_add_entry(NULL); 342 menu_add_entry(NULL);
@@ -282,5 +345,5 @@ menu: T_MENU prompt
282}; 345};
283 346
284menu_entry: menu T_EOL depends_list 347menu_entry: menu depends_list
285{ 348{
286 menu_end_entry(); 349 menu_end_entry();
@@ -297,5 +360,5 @@ menu_end: end
297 360
298menu_stmt: 361menu_stmt:
299 menu_entry menu_block menu_end T_EOL 362 menu_entry menu_block menu_end
300 | menu_entry menu_block 363 | menu_entry menu_block
301{ 364{
@@ -312,5 +375,5 @@ menu_block:
312; 375;
313 376
314source: T_SOURCE prompt 377source: T_SOURCE prompt T_EOL
315{ 378{
316 $$ = $2; 379 $$ = $2;
@@ -318,5 +381,5 @@ source: T_SOURCE prompt
318}; 381};
319 382
320source_stmt: source T_EOL 383source_stmt: source
321{ 384{
322 zconf_nextfile($1); 385 zconf_nextfile($1);
@@ -325,5 +388,5 @@ source_stmt: source T_EOL
325/* comment entry */ 388/* comment entry */
326 389
327comment: T_COMMENT prompt 390comment: T_COMMENT prompt T_EOL
328{ 391{
329 menu_add_entry(NULL); 392 menu_add_entry(NULL);
@@ -332,5 +395,5 @@ comment: T_COMMENT prompt
332}; 395};
333 396
334comment_stmt: comment T_EOL depends_list 397comment_stmt: comment depends_list
335{ 398{
336 menu_end_entry(); 399 menu_end_entry();
@@ -353,19 +416,19 @@ help: help_start T_HELPTEXT
353 416
354 depends_list: /* empty */ 417 depends_list: /* empty */
355 | depends_list depends T_EOL 418 | depends_list depends
356 | depends_list T_EOL 419 | depends_list T_EOL
357{ }; 420;
358 421
359depends: T_DEPENDS T_ON expr 422depends: T_DEPENDS T_ON expr T_EOL
360{ 423{
361 menu_add_dep($3); 424 menu_add_dep($3);
362 printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); 425 printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
363} 426}
364 | T_DEPENDS expr 427 | T_DEPENDS expr T_EOL
365{ 428{
366 menu_add_dep($2); 429 menu_add_dep($2);
367 printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); 430 printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
368} 431}
369 | T_REQUIRES expr 432 | T_REQUIRES expr T_EOL
370{ 433{
371 menu_add_dep($2); 434 menu_add_dep($2);
@@ -377,20 +440,16 @@ depends: T_DEPENDS T_ON expr
377prompt_stmt_opt: 440prompt_stmt_opt:
378 /* empty */ 441 /* empty */
379 | prompt 442 | prompt if_expr
380{
381 menu_add_prop(P_PROMPT, $1, NULL, NULL);
382}
383 | prompt T_IF expr
384{ 443{
385 menu_add_prop(P_PROMPT, $1, NULL, $3); 444 menu_add_prop(P_PROMPT, $1, NULL, $2);
386}; 445};
387 446
388 prompt: T_WORD 447 prompt: T_WORD
389 | T_STRING 448 | T_WORD_QUOTE
390; 449;
391 450
392 end: T_ENDMENU { $$ = T_ENDMENU; } 451 end: T_ENDMENU nl_or_eof{ $$ = T_ENDMENU; }
393 | T_ENDCHOICE { $$ = T_ENDCHOICE; } 452 | T_ENDCHOICE nl_or_eof{ $$ = T_ENDCHOICE; }
394 | T_ENDIF { $$ = T_ENDIF; } 453 | T_ENDIF nl_or_eof{ $$ = T_ENDIF; }
395; 454;
396 455
@@ -412,5 +471,5 @@ expr: symbol { $$ = expr_alloc_symbol($1); }
412 471
413 symbol: T_WORD{ $$ = sym_lookup($1, 0); free($1); } 472 symbol: T_WORD{ $$ = sym_lookup($1, 0); free($1); }
414 | T_STRING{ $$ = sym_lookup($1, 1); free($1); } 473 | T_WORD_QUOTE{ $$ = sym_lookup($1, 1); free($1); }
415; 474;
416 475
@@ -419,9 +478,13 @@ symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
419void conf_parse(const char *name) 478void conf_parse(const char *name)
420{ 479{
480 struct symbol *sym;
481 int i;
482
421 zconf_initscan(name); 483 zconf_initscan(name);
422 484
423 sym_init(); 485 sym_init();
424 menu_init(); 486 menu_init();
425 rootmenu.prompt = menu_add_prop(P_MENU, "Configuration", NULL, NULL); 487 modules_sym = sym_lookup("MODULES", 0);
488 rootmenu.prompt = menu_add_prop(P_MENU, "Build Configuration", NULL, NULL);
426 489
427 //zconfdebug = 1; 490 //zconfdebug = 1;
@@ -430,6 +493,10 @@ void conf_parse(const char *name)
430 exit(1); 493 exit(1);
431 menu_finalize(&rootmenu); 494 menu_finalize(&rootmenu);
432 495 for_all_symbols(i, sym) {
433 modules_sym = sym_lookup("MODULES", 0); 496 if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
497 printf("\n");
498 else
499 sym->flags |= SYMBOL_CHECK_DONE;
500 }
434 501
435 sym_change_count = 1; 502 sym_change_count = 1;
@@ -469,5 +536,5 @@ static void zconfprint(const char *err, ...)
469 va_list ap; 536 va_list ap;
470 537
471 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); 538 fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
472 va_start(ap, err); 539 va_start(ap, err);
473 vfprintf(stderr, err, ap); 540 vfprintf(stderr, err, ap);
@@ -478,5 +545,5 @@ static void zconfprint(const char *err, ...)
478static void zconferror(const char *err) 545static void zconferror(const char *err)
479{ 546{
480 fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno(), err); 547 fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
481} 548}
482 549
@@ -503,6 +570,4 @@ void print_symbol(FILE *out, struct menu *menu)
503 struct property *prop; 570 struct property *prop;
504 571
505 //sym->flags |= SYMBOL_PRINTED;
506
507 if (sym_is_choice(sym)) 572 if (sym_is_choice(sym))
508 fprintf(out, "choice\n"); 573 fprintf(out, "choice\n");
@@ -529,11 +594,4 @@ void print_symbol(FILE *out, struct menu *menu)
529 break; 594 break;
530 } 595 }
531#if 0
532 if (!expr_is_yes(sym->dep)) {
533 fputs(" depends ", out);
534 expr_fprint(sym->dep, out);
535 fputc('\n', out);
536 }
537#endif
538 for (prop = sym->prop; prop; prop = prop->next) { 596 for (prop = sym->prop; prop; prop = prop->next) {
539 if (prop->menu != menu) 597 if (prop->menu != menu)
@@ -543,14 +601,7 @@ void print_symbol(FILE *out, struct menu *menu)
543 fputs(" prompt ", out); 601 fputs(" prompt ", out);
544 print_quoted_string(out, prop->text); 602 print_quoted_string(out, prop->text);
545 if (prop->def) { 603 if (!expr_is_yes(prop->visible.expr)) {
546 fputc(' ', out);
547 if (prop->def->flags & SYMBOL_CONST)
548 print_quoted_string(out, prop->def->name);
549 else
550 fputs(prop->def->name, out);
551 }
552 if (!expr_is_yes(E_EXPR(prop->visible))) {
553 fputs(" if ", out); 604 fputs(" if ", out);
554 expr_fprint(E_EXPR(prop->visible), out); 605 expr_fprint(prop->visible.expr, out);
555 } 606 }
556 fputc('\n', out); 607 fputc('\n', out);
@@ -558,8 +609,8 @@ void print_symbol(FILE *out, struct menu *menu)
558 case P_DEFAULT: 609 case P_DEFAULT:
559 fputs( " default ", out); 610 fputs( " default ", out);
560 print_quoted_string(out, prop->def->name); 611 expr_fprint(prop->expr, out);
561 if (!expr_is_yes(E_EXPR(prop->visible))) { 612 if (!expr_is_yes(prop->visible.expr)) {
562 fputs(" if ", out); 613 fputs(" if ", out);
563 expr_fprint(E_EXPR(prop->visible), out); 614 expr_fprint(prop->visible.expr, out);
564 } 615 }
565 fputc('\n', out); 616 fputc('\n', out);
@@ -584,5 +635,4 @@ void print_symbol(FILE *out, struct menu *menu)
584void zconfdump(FILE *out) 635void zconfdump(FILE *out)
585{ 636{
586 //struct file *file;
587 struct property *prop; 637 struct property *prop;
588 struct symbol *sym; 638 struct symbol *sym;
@@ -595,9 +645,4 @@ void zconfdump(FILE *out)
595 else if ((prop = menu->prompt)) { 645 else if ((prop = menu->prompt)) {
596 switch (prop->type) { 646 switch (prop->type) {
597 //case T_MAINMENU:
598 //fputs("\nmainmenu ", out);
599 //print_quoted_string(out, prop->text);
600 //fputs("\n", out);
601 //break;
602 case P_COMMENT: 647 case P_COMMENT:
603 fputs("\ncomment ", out); 648 fputs("\ncomment ", out);
@@ -610,17 +655,10 @@ void zconfdump(FILE *out)
610 fputs("\n", out); 655 fputs("\n", out);
611 break; 656 break;
612 //case T_SOURCE:
613 //fputs("\nsource ", out);
614 //print_quoted_string(out, prop->text);
615 //fputs("\n", out);
616 //break;
617 //case T_IF:
618 //fputs("\nif\n", out);
619 default: 657 default:
620 ; 658 ;
621 } 659 }
622 if (!expr_is_yes(E_EXPR(prop->visible))) { 660 if (!expr_is_yes(prop->visible.expr)) {
623 fputs(" depends ", out); 661 fputs(" depends ", out);
624 expr_fprint(E_EXPR(prop->visible), out); 662 expr_fprint(prop->visible.expr, out);
625 fputc('\n', out); 663 fputc('\n', out);
626 } 664 }