20230322
[build-config.git] / shlib / menuconfig-example.gmr
blob52baee73dfafa58cb91f191b2371a5eb3b5f4e5c
2 #############################################
3 # example.gmr
4 #############################################
6 input: nl start | start;
8 start: mainmenu_stmt stmt_list | no_mainmenu_stmt stmt_list;
10 /* mainmenu entry */
12 mainmenu_stmt: T_MAINMENU prompt nl
14         menu_add_prompt(P_MENU, $2, NULL);
17 /* Default main menu, if there's no mainmenu entry */
19 no_mainmenu_stmt: /* empty */
21         /*
22          * Hack: Keep the main menu title on the heap so we can safely free it
23          * later regardless of whether it comes from the 'prompt' in
24          * mainmenu_stmt or here
25          */
26         menu_add_prompt(P_MENU, xstrdup("Buildroot Configuration"), NULL);
30 stmt_list:
31           /* empty */
32         | stmt_list common_stmt
33         | stmt_list choice_stmt
34         | stmt_list menu_stmt
35         | stmt_list end                 { zconf_error("unexpected end statement"); }
36         | stmt_list T_WORD error T_EOL  { zconf_error("unknown statement \"%s\"", $2); }
37         | stmt_list option_name error T_EOL
39         zconf_error("unexpected option \"%s\"", $2->name);
41         | stmt_list error T_EOL         { zconf_error("invalid statement"); }
44 option_name:
45         T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_IMPLY | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
48 common_stmt:
49           T_EOL
50         | if_stmt
51         | comment_stmt
52         | config_stmt
53         | menuconfig_stmt
54         | source_stmt
57 option_error:
58           T_WORD error T_EOL            { zconf_error("unknown option \"%s\"", $1); }
59         | error T_EOL                   { zconf_error("invalid option"); }
63 /* config/menuconfig entry */
65 config_entry_start: T_CONFIG nonconst_symbol T_EOL
67         $2->flags |= SYMBOL_OPTIONAL;
68         menu_add_entry($2);
69         printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
72 config_stmt: config_entry_start config_option_list
74         printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
77 menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
79         $2->flags |= SYMBOL_OPTIONAL;
80         menu_add_entry($2);
81         printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
84 menuconfig_stmt: menuconfig_entry_start config_option_list
86         if (current_entry->prompt)
87                 current_entry->prompt->type = P_MENU;
88         else
89                 zconfprint("warning: menuconfig statement without prompt");
90         printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
93 config_option_list:
94           /* empty */
95         | config_option_list config_option
96         | config_option_list symbol_option
97         | config_option_list depends
98         | config_option_list help
99         | config_option_list option_error
100         | config_option_list T_EOL
103 config_option: T_TYPE prompt_stmt_opt T_EOL
105         menu_set_type($1->stype);
106         printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
107                 zconf_curname(), zconf_lineno(),
108                 $1->stype);
111 config_option: T_PROMPT prompt if_expr T_EOL
113         menu_add_prompt(P_PROMPT, $2, $3);
114         printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
117 config_option: T_DEFAULT expr if_expr T_EOL
119         menu_add_expr(P_DEFAULT, $2, $3);
120         if ($1->stype != S_UNKNOWN)
121                 menu_set_type($1->stype);
122         printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
123                 zconf_curname(), zconf_lineno(),
124                 $1->stype);
127 config_option: T_SELECT nonconst_symbol if_expr T_EOL
129         menu_add_symbol(P_SELECT, $2, $3);
130         printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
133 config_option: T_IMPLY nonconst_symbol if_expr T_EOL
135         menu_add_symbol(P_IMPLY, $2, $3);
136         printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
139 config_option: T_RANGE symbol symbol if_expr T_EOL
141         menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
142         printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
145 symbol_option: T_OPTION symbol_option_list T_EOL
148 symbol_option_list:
149           /* empty */
150         | symbol_option_list T_WORD symbol_option_arg
152         const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
153         if (id && id->flags & TF_OPTION) {
154                 menu_add_option(id->token, $3);
155                 free($3);
156         }
157         else
158                 zconfprint("warning: ignoring unknown option %s", $2);
159         free($2);
162 symbol_option_arg:
163           /* empty */           { $$ = NULL; }
164         | T_EQUAL prompt        { $$ = $2; }
167 /* choice entry */
169 choice: T_CHOICE word_opt T_EOL
171         struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
172         sym->flags |= SYMBOL_AUTO;
173         menu_add_entry(sym);
174         menu_add_expr(P_CHOICE, NULL, NULL);
175         free($2);
176         printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
179 choice_entry: choice choice_option_list
181         $$ = menu_add_menu();
184 choice_end: end
186         if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
187                 menu_end_menu();
188                 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
189         }
192 choice_stmt: choice_entry choice_block choice_end
195 choice_option_list:
196           /* empty */
197         | choice_option_list choice_option
198         | choice_option_list depends
199         | choice_option_list help
200         | choice_option_list T_EOL
201         | choice_option_list option_error
204 choice_option: T_PROMPT prompt if_expr T_EOL
206         menu_add_prompt(P_PROMPT, $2, $3);
207         printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
210 choice_option: T_TYPE prompt_stmt_opt T_EOL
212         if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
213                 menu_set_type($1->stype);
214                 printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
215                         zconf_curname(), zconf_lineno(),
216                         $1->stype);
217         } else
218                 YYERROR;
221 choice_option: T_OPTIONAL T_EOL
223         current_entry->sym->flags |= SYMBOL_OPTIONAL;
224         printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
227 choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
229         if ($1->stype == S_UNKNOWN) {
230                 menu_add_symbol(P_DEFAULT, $2, $3);
231                 printd(DEBUG_PARSE, "%s:%d:default\n",
232                         zconf_curname(), zconf_lineno());
233         } else
234                 YYERROR;
237 choice_block:
238           /* empty */
239         | choice_block common_stmt
242 /* if entry */
244 if_entry: T_IF expr nl
246         printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
247         menu_add_entry(NULL);
248         menu_add_dep($2);
249         $$ = menu_add_menu();
252 if_end: end
254         if (zconf_endtoken($1, T_IF, T_ENDIF)) {
255                 menu_end_menu();
256                 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
257         }
260 if_stmt: if_entry if_block if_end
263 if_block:
264           /* empty */
265         | if_block common_stmt
266         | if_block menu_stmt
267         | if_block choice_stmt
270 /* menu entry */
272 menu: T_MENU prompt T_EOL
274         menu_add_entry(NULL);
275         menu_add_prompt(P_MENU, $2, NULL);
276         printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
279 menu_entry: menu visibility_list depends_list
281         $$ = menu_add_menu();
284 menu_end: end
286         if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
287                 menu_end_menu();
288                 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
289         }
292 menu_stmt: menu_entry menu_block menu_end
295 menu_block:
296           /* empty */
297         | menu_block common_stmt
298         | menu_block menu_stmt
299         | menu_block choice_stmt
302 source_stmt: T_SOURCE prompt T_EOL
304         printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
305         zconf_nextfile($2);
306         free($2);
309 /* comment entry */
311 comment: T_COMMENT prompt T_EOL
313         menu_add_entry(NULL);
314         menu_add_prompt(P_COMMENT, $2, NULL);
315         printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
318 comment_stmt: comment depends_list
321 /* help option */
323 help_start: T_HELP T_EOL
325         printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
326         zconf_starthelp();
329 help: help_start T_HELPTEXT
331         if (current_entry->help) {
332                 free(current_entry->help);
333                 zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
334                            current_entry->sym->name ?: "<choice>");
335         }
337         /* Is the help text empty or all whitespace? */
338         if ($2[strspn($2, " \f\n\r\t\v")] == '\0')
339                 zconfprint("warning: '%s' defined with blank help text",
340                            current_entry->sym->name ?: "<choice>");
342         current_entry->help = $2;
345 /* depends option */
347 depends_list:
348           /* empty */
349         | depends_list depends
350         | depends_list T_EOL
351         | depends_list option_error
354 depends: T_DEPENDS T_ON expr T_EOL
356         menu_add_dep($3);
357         printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
360 /* visibility option */
362 visibility_list:
363           /* empty */
364         | visibility_list visible
365         | visibility_list T_EOL
368 visible: T_VISIBLE if_expr
370         menu_add_visibility($2);
373 /* prompt statement */
375 prompt_stmt_opt:
376           /* empty */
377         | prompt if_expr
379         menu_add_prompt(P_PROMPT, $1, $2);
382 prompt:   T_WORD
383         | T_WORD_QUOTE
386 end:      T_ENDMENU T_EOL       { $$ = $1; }
387         | T_ENDCHOICE T_EOL     { $$ = $1; }
388         | T_ENDIF T_EOL         { $$ = $1; }
392           T_EOL
393         | nl T_EOL
396 if_expr:  /* empty */                   { $$ = NULL; }
397         | T_IF expr                     { $$ = $2; }
400 expr:     symbol                                { $$ = expr_alloc_symbol($1); }
401         | symbol T_LESS symbol                  { $$ = expr_alloc_comp(E_LTH, $1, $3); }
402         | symbol T_LESS_EQUAL symbol            { $$ = expr_alloc_comp(E_LEQ, $1, $3); }
403         | symbol T_GREATER symbol               { $$ = expr_alloc_comp(E_GTH, $1, $3); }
404         | symbol T_GREATER_EQUAL symbol         { $$ = expr_alloc_comp(E_GEQ, $1, $3); }
405         | symbol T_EQUAL symbol                 { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
406         | symbol T_UNEQUAL symbol               { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
407         | T_OPEN_PAREN expr T_CLOSE_PAREN       { $$ = $2; }
408         | T_NOT expr                            { $$ = expr_alloc_one(E_NOT, $2); }
409         | expr T_OR expr                        { $$ = expr_alloc_two(E_OR, $1, $3); }
410         | expr T_AND expr                       { $$ = expr_alloc_two(E_AND, $1, $3); }
413 /* For symbol definitions, selects, etc., where quotes are not accepted */
414 nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
416 symbol:   nonconst_symbol
417         | T_WORD_QUOTE  { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
420 word_opt: /* empty */                   { $$ = NULL; }
421         | T_WORD