#include <vector>
#include <map>
#include <memory>
+#include <deque>
using namespace std;
}
}
+void mark_symbol_variable(const char *sym_name, const char *file, int lineno)
+{
+ struct symbol *sym = sym_find(sym_name);
+ if (!sym) {
+ fprintf(stderr, "%s:%d: Error: Invalid symbol: %s\n", file, lineno, sym_name);
+ exit(EXIT_FAILURE);
+ }
+// if (!(sym->flags & SYMBOL_WRITE)) {
+// fprintf(stderr, "%s:%d: Error: Symbol %s not visible\n", varfile, lineno, sym_name);
+// exit(EXIT_FAILURE);
+// }
+ if (sym->flags & (SYMBOL_CHOICEVAL | SYMBOL_CHOICE)) {
+ fprintf(stderr, "%s:%d: Error: Choice values not yet supported: %s", file, lineno, sym_name);
+ exit(EXIT_FAILURE);
+ }
+ struct property *prop;
+ const char *prompt = NULL;
+ for_all_properties(sym, prop, P_PROMPT) {
+ prompt = prop->text;
+ }
+ if (!prompt) {
+ fprintf(stderr, "%s:%d: Warning: Symbol %s is internal (has no prompt)\n", file, lineno, sym_name);
+ }
+ sym->lcp.variable = 1;
+}
+
void read_varfile(const char *varfile)
{
FILE *f = fopen(varfile, "r");
p += strlen(CONFIG_);
const char *sym_name = strtok(p, " =\n");
- struct symbol *sym = sym_find(sym_name);
- if (!sym) {
- fprintf(stderr, "%s:%d: Error: Invalid symbol: %s\n", varfile, lineno, sym_name);
- exit(EXIT_FAILURE);
- }
-// if (!(sym->flags & SYMBOL_WRITE)) {
-// fprintf(stderr, "%s:%d: Error: Symbol %s not visible\n", varfile, lineno, sym_name);
-// exit(EXIT_FAILURE);
-// }
- if (sym->flags & (SYMBOL_CHOICEVAL | SYMBOL_CHOICE)) {
- fprintf(stderr, "%s:%d: Error: Choice values not yet supported: %s", varfile, lineno, sym_name);
- exit(EXIT_FAILURE);
- }
- struct property *prop;
- const char *prompt = NULL;
- for_all_properties(sym, prop, P_PROMPT) {
- prompt = prop->text;
- }
- if (!prompt) {
- fprintf(stderr, "%s:%d: Warning: Symbol %s is internal (has no prompt)\n", varfile, lineno, sym_name);
- }
- sym->lcp.variable = 1;
+ mark_symbol_variable(sym_name, varfile, lineno);
}
fclose(f);
}
char *kconfig = NULL;
char *varfile = NULL;
int dump = false;
+ deque<string> varopts;
while (1) {
int option_index = 0;
{"help", no_argument, 0, OPT_HELP },
{"kconfig", required_argument, 0, OPT_KCONFIG },
{"varfile", required_argument, 0, OPT_VARFILE },
-// {"varopt", required_argument, 0, OPT_VAROPTION },
+ {"varopt", required_argument, 0, OPT_VAROPTION },
{"verbose", no_argument, 0, OPT_VERBOSE },
{0, 0, 0, 0 }
};
case OPT_VARFILE:
varfile = optarg;
break;
+ case OPT_VAROPTION:
+ varopts.push_back(string(optarg));
+ break;
case '?':
default:
print_help();
if (baseconf)
conf_read(baseconf);
- if (varfile)
- read_varfile(varfile);
- else
+ if (!varfile && varopts.empty())
set_all_symbols_variable();
+ else {
+ if (varfile)
+ read_varfile(varfile);
+ if (!varopts.empty())
+ for (auto o: varopts)
+ mark_symbol_variable(o.c_str(), NULL, 0);
+ }
mark_variable_expressions();
check_dep_consistency();