From 3904d85eac20dfd21cf2a3245977f9946865fd92 Mon Sep 17 00:00:00 2001 From: kergoth Date: Thu, 16 Jan 2003 18:04:11 +0000 Subject: Update LinuxKernelConf to 1.3, latest available. --- (limited to 'scripts') diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 7e257be..5a0d7e5 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -1,46 +1,30 @@ -VERSION=1.2 +VERSION=1.3 CC=gcc CXX=g++ -CFLAGS=-O2 -Wall -g -fPIC +CFLAGS=-O0 -Wall -g -fPIC CXXFLAGS=$(CFLAGS) -I$(HOSTQTDIR)/include LDFLAGS= LXXFLAGS=$(LDFLAGS) -L$(HOSTQTDIR)/lib -Wl,-rpath,$(HOSTQTDIR)/lib LEX=flex +LFLAGS=-L YACC=bison -YFLAGS=-d -t #-v +YFLAGS=-l +#YFLAGS=-d -t -v -l ifndef HOSTQTDIR -ifeq ($(shell if [ -e /usr/share/qt ]; then echo foundit; fi),foundit) HOSTQTDIR=/usr/share/qt -else -ifeq ($(shell if [ -e /usr/lib/qt ]; then echo foundit; fi),foundit) -HOSTQTDIR=/usr/lib/qt -endif -endif -endif - -ifndef QTLIB -ifeq ($(shell if [ -e $(HOSTQTDIR)/lib/libqt-mt.so ]; then echo foundit; fi),foundit) -QTLIB=-lqt-mt -else -ifneq ($(shell if [ -e $(HOSTQTDIR)/lib/libqt.so ]; then echo foundit; fi),foundit) -$(warning Unable to locate libqt.so!) endif -QTLIB=-lqt -endif -endif - MOC=$(wildcard $(HOSTQTDIR)/bin/moc) parse_SRC=zconf.y conf_SRC=conf.c $(parse_SRC) mconf_SRC=mconf.c $(parse_SRC) qconf_SRC=qconf.cc -lkcc_SRC=cml1.y cml1.l help.l cml1.h expr1.c HDR=expr.h lkc.h lkc_proto.h qconf.h -OTHER=README lkc_spec lkc_overview Makefile.kernel convert-all prepare-all.diff fixup-all.diff \ +OTHER=README lkc-language.txt Makefile.kernel \ kconfig.i extconf.rb example -INST=zconf.y zconf.l confdata.c expr.c symbol.c menu.c conf.c mconf.c qconf.cc kconfig_load.c images.c $(parse_SRC) $(HDR) -INSTGEN=lex.zconf.c zconf.tab.c zconf.tab.h +INST=zconf.y zconf.l confdata.c expr.c symbol.c menu.c \ + conf.c mconf.c qconf.cc kconfig_load.c images.c $(HDR) +INSTGEN=lex.zconf.c zconf.tab.c #DEBUG=1 ifdef DEBUG @@ -50,7 +34,7 @@ else qconf_SRC+=kconfig_load.c endif -SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC) $(lkcc_SRC) +SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC) CSRC=$(filter %.c, $(SRC)) YSRC=$(filter %.y, $(SRC)) LSRC=$(filter %.l, $(SRC)) @@ -76,28 +60,14 @@ qconf_OBJ=$(filter %.o, \ $(patsubst %.y,%.tab.o, \ $(patsubst %.l,lex.%.o, \ $(qconf_SRC)))))) -lkcc_OBJ=$(filter %.o, \ - $(patsubst %.c,%.o, \ - $(patsubst %.y,%.tab.o, \ - $(patsubst %.l,lex.%.o, \ - $(lkcc_SRC))))) -OBJ=$(conf_OBJ) $(mconf_OBJ) $(qconf_OBJ) $(lkcc_OBJ) +OBJ=$(conf_OBJ) $(mconf_OBJ) $(qconf_OBJ) ifeq ($(MOC),) -all: lkcc conf mconf +all: conf mconf else -all: lkcc conf mconf qconf libkconfig.so +all: conf mconf qconf libkconfig.so endif -lex.help.c: help.l -lex.help.o: lex.help.c cml1.h expr.h -lex.cml1.c: cml1.l -lex.cml1.o: lex.cml1.c cml1.tab.h cml1.h expr.h -cml1.tab.c: cml1.y -cml1.tab.h: cml1.y -cml1.tab.o: cml1.tab.c cml1.h expr.h -expr1.o: expr1.c expr.h - lkc_deps := lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.c: zconf.y @@ -128,13 +98,10 @@ qconf: @echo environment variable is set to the correct location. @false else -qconf: $(qconf_OBJ) libkconfig.so - $(CXX) $(LXXFLAGS) $^ $(QTLIB) -o $@ +qconf: $(qconf_OBJ) + $(CXX) $(LXXFLAGS) $^ -lqt -o $@ endif -lkcc: $(lkcc_OBJ) - $(CC) $(LDFLAGS) $^ -o $@ - libkconfig.so: $(parse_OBJ) $(CC) -shared $^ -o $@ @@ -142,13 +109,14 @@ lkc_defs.h: lkc_proto.h sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' clean: - rm -f $(OBJ) lkcc conf qconf mconf *.moc lex.* *.tab.? *.output + rm -f $(OBJ) conf qconf mconf *.moc lex.* *.tab.? *.output + rm -rf .ruby .python tgz: mkdir tmp mkdir tmp/lkc-$(VERSION) cp -ra Makefile $(sort $(SRC) $(HDR) $(OTHER) $(INST)) tmp/lkc-$(VERSION) - tar -cpvz -C tmp -f lkc-$(VERSION).tar.gz lkc-$(VERSION) + tar -cpvz -C tmp --exclude CVS -f lkc-$(VERSION).tar.gz lkc-$(VERSION) rm -rf tmp %.tab.c %.tab.h: %.y @@ -167,24 +135,15 @@ lex.%.c: %.l $(CXX) $(CXXFLAGS) -c $< -o $@ ifdef KERNELSRC -install: lkcc $(INSTGEN) - set -x; mkdir $(KERNELSRC)/scripts/kconfig; \ - cp $(sort $(INST)) $(KERNELSRC)/scripts/kconfig; \ +install: $(INSTGEN) + set -x; cp $(sort $(INST)) $(KERNELSRC)/scripts/kconfig; \ for f in $(INSTGEN); do cp $$f $(KERNELSRC)/scripts/kconfig/$${f}_shipped; done; \ - cp Makefile.kernel $(KERNELSRC)/scripts/kconfig/Makefile; \ - LKCSRC=$$PWD; export LKCSRC; \ - cd $(KERNELSRC); \ - patch -p0 -N < $$LKCSRC/prepare-all.diff; \ - sh $$LKCSRC/convert-all; \ - patch -p0 -N < $$LKCSRC/fixup-all.diff - -# cp Makefile $(KERNELSRC)/scripts/kconfig/Makefile; \ - -uninstall: - patch -p0 -N -R -d $(KERNELSRC) < prepare-all.diff; \ - cd $(KERNELSRC); \ - find -name "Kconfig*" | xargs rm; \ - rm -rf scripts/kconfig log.* + cp Makefile.kernel $(KERNELSRC)/scripts/kconfig/Makefile + +diff: $(INSTGEN) + for f in $(sort $(INST)); do diff -u $(KERNELSRC)/scripts/kconfig/$$f $$f; done; \ + for f in $(INSTGEN); do diff -u $(KERNELSRC)/scripts/kconfig/$${f}_shipped $$f; done; \ + diff -u $(KERNELSRC)/scripts/kconfig/Makefile Makefile.kernel else install: @echo "Please use KERNELSRC= to install" @@ -204,4 +163,19 @@ ruby: .ruby libkconfig.so .ruby/kconfig.so .ruby/kconfig.so: .ruby/kconfig_wrap.c .ruby/Makefile make -C .ruby -.PHONY: all tgz clean ruby + +PYTHON_INCLUDE=$(shell python -c "import sys; print '-I'+sys.prefix+'/include/python'+sys.version[:3]") + +python: .python .python/kconfig.py .python/_kconfig.so + +.python: + mkdir .python + +.python/kconfig_wrap.c .python/kconfig.py: kconfig.i kconfig_load.c expr.h lkc_proto.h + swig -python -o .python/kconfig_wrap.c kconfig.i + +.python/_kconfig.so: .python/kconfig_wrap.c + cd .python; $(CC) $(CFLAGS) -shared kconfig_wrap.c -o _kconfig.so -I.. $(PYTHON_INCLUDE) + + +.PHONY: all tgz clean ruby python diff --git a/scripts/kconfig/Makefile.kernel b/scripts/kconfig/Makefile.kernel index beb4dcf..22724a7 100644 --- a/scripts/kconfig/Makefile.kernel +++ b/scripts/kconfig/Makefile.kernel @@ -23,33 +23,43 @@ clean-files := libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \ include $(TOPDIR)/Rules.make -# QT needs some extra effort... -ifndef QTDIR -QTDIR := /usr/share/qt -endif - -# Executable to generate the .moc file -MOC=$(wildcard $(QTDIR)/bin/moc) - # generated files seem to need this to find local include files HOSTCFLAGS_lex.zconf.o := -I$(src) HOSTCFLAGS_zconf.tab.o := -I$(src) -HOSTLOADLIBES_qconf := -L$(QTDIR)/lib -Wl,-rpath,$(QTDIR)/lib -lqt -ldl -HOSTCXXFLAGS_qconf.o := -I$(QTDIR)/include +HOSTLOADLIBES_qconf = -L$(QTDIR)/lib -Wl,-rpath,$(QTDIR)/lib -l$(QTLIB) -ldl +HOSTCXXFLAGS_qconf.o = -I$(QTDIR)/include $(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o: $(obj)/zconf.tab.h $(obj)/qconf.o: $(obj)/.tmp_qtcheck +ifeq ($(MAKECMDGOALS),$(obj)/qconf) +MOC = $(QTDIR)/bin/moc +-include $(obj)/.tmp_qtcheck + +# QT needs some extra effort... $(obj)/.tmp_qtcheck: -ifeq ($(MOC),) - @echo Unable to find the QT installation. Please make sure that the - @echo QT development package is correctly installed and the QTDIR - @echo environment variable is set to the correct location. - @false -else - @touch $@ + @set -e; for d in $$QTDIR /usr/share/qt /usr/lib/qt3; do \ + if [ -f $$d/include/qconfig.h ]; then DIR=$$d; break; fi; \ + done; \ + if [ -z "$$DIR" ]; then \ + echo "*"; \ + echo "* Unable to find the QT installation. Please make sure that the"; \ + echo "* QT development package is correctly installed and the QTDIR"; \ + echo "* environment variable is set to the correct location."; \ + echo "*"; \ + false; \ + fi; \ + LIB=qt; \ + if [ -f $$DIR/lib/libqt-mt.so ]; then LIB=qt-mt; fi; \ + echo "QTDIR=$$DIR" > $@; echo "QTLIB=$$LIB" >> $@; \ + if [ ! -x $$DIR/bin/moc -a -x /usr/bin/moc ]; then \ + echo "*"; \ + echo "* Unable to find $$DIR/bin/moc, using /usr/bin/moc instead."; \ + echo "*"; \ + echo "MOC=/usr/bin/moc" >> $@; \ + fi endif $(obj)/zconf.tab.o: $(obj)/lex.zconf.c diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 74c94c2..1602d5f 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -115,6 +115,7 @@ static void conf_askvalue(struct symbol *sym, const char *def) exit(1); } case ask_all: + fflush(stdout); fgets(line, 128, stdin); return; case set_default: @@ -342,6 +343,8 @@ static int conf_choice(struct menu *menu) case ask_new: case ask_silent: case ask_all: + if (is_new) + sym->flags |= SYMBOL_NEW; conf_askvalue(sym, menu_get_prompt(def_menu)); strip(line); break; @@ -357,14 +360,14 @@ static int conf_choice(struct menu *menu) continue; } if (line[0]) { - len = strlen(line) - 1; + len = strlen(line); line[len] = 0; def_menu = NULL; for (cmenu = menu->list; cmenu; cmenu = cmenu->next) { if (!cmenu->sym || !menu_is_visible(cmenu)) continue; - if (!strncmp(line, menu_get_prompt(cmenu), len)) { + if (!strncasecmp(line, menu_get_prompt(cmenu), len)) { def_menu = cmenu; break; } diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 0f5fd97..9bf7af9 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -3,8 +3,8 @@ * Released under the terms of the GNU GPL v2.0. */ +#include #include -#include #include #include #include @@ -14,7 +14,6 @@ #include "lkc.h" const char conf_def_filename[] = ".config"; -char conf_filename[PATH_MAX+1]; const char conf_defname[] = "arch/$ARCH/defconfig"; @@ -55,13 +54,24 @@ static char *conf_expand_value(const char *in) char *conf_get_default_confname(void) { - return conf_expand_value(conf_defname); + struct stat buf; + static char fullname[PATH_MAX+1]; + char *env, *name; + + name = conf_expand_value(conf_defname); + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + if (!stat(fullname, &buf)) + return fullname; + } + return name; } int conf_read(const char *name) { FILE *in = NULL; - char line[128]; + char line[1024]; char *p, *p2; int lineno = 0; struct symbol *sym; @@ -70,14 +80,12 @@ int conf_read(const char *name) int i; if (name) { - in = fopen(name, "r"); - if (in) - strcpy(conf_filename, name); + in = zconf_fopen(name); } else { const char **names = conf_confnames; while ((name = *names++)) { name = conf_expand_value(name); - in = fopen(name, "r"); + in = zconf_fopen(name); if (in) { printf("#\n" "# using defaults found in %s\n" @@ -91,21 +99,21 @@ int conf_read(const char *name) return 1; for_all_symbols(i, sym) { - sym->flags |= SYMBOL_NEW; + sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; + sym->flags &= ~SYMBOL_VALID; switch (sym->type) { case S_INT: case S_HEX: case S_STRING: - if (S_VAL(sym->def)) { + if (S_VAL(sym->def)) free(S_VAL(sym->def)); - S_VAL(sym->def) = NULL; - } default: - ; + S_VAL(sym->def) = NULL; + S_TRI(sym->def) = no; } } - while (fgets(line, 128, in)) { + while (fgets(line, sizeof(line), in)) { lineno++; switch (line[0]) { case '#': @@ -117,7 +125,6 @@ int conf_read(const char *name) *p++ = 0; if (strncmp(p, "is not set", 10)) continue; - //printf("%s -> n\n", line + 9); sym = sym_lookup(line + 9, 0); switch (sym->type) { case S_BOOLEAN: @@ -139,23 +146,29 @@ int conf_read(const char *name) p2 = strchr(p, '\n'); if (p2) *p2 = 0; - //printf("%s -> %s\n", line + 7, p); sym = sym_find(line + 7); if (!sym) { fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 7); break; } switch (sym->type) { - case S_BOOLEAN: - sym->def = symbol_yes.curr; - sym->flags &= ~SYMBOL_NEW; - break; case S_TRISTATE: - if (p[0] == 'm') - sym->def = symbol_mod.curr; - else - sym->def = symbol_yes.curr; - sym->flags &= ~SYMBOL_NEW; + if (p[0] == 'm') { + S_TRI(sym->def) = mod; + sym->flags &= ~SYMBOL_NEW; + break; + } + case S_BOOLEAN: + if (p[0] == 'y') { + S_TRI(sym->def) = yes; + sym->flags &= ~SYMBOL_NEW; + break; + } + if (p[0] == 'n') { + S_TRI(sym->def) = no; + sym->flags &= ~SYMBOL_NEW; + break; + } break; case S_STRING: if (*p++ != '"') @@ -167,13 +180,19 @@ int conf_read(const char *name) } memmove(p2, p2 + 1, strlen(p2)); } + if (!p2) { + fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); + exit(1); + } case S_INT: case S_HEX: if (sym_string_valid(sym, p)) { S_VAL(sym->def) = strdup(p); sym->flags &= ~SYMBOL_NEW; - } else - fprintf(stderr, "%s:%d:symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); + } else { + fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); + exit(1); + } break; default: ; @@ -352,7 +371,6 @@ int conf_write(const char *name) rename(name, oldname); if (rename(".tmpconfig", name)) return 1; - strcpy(conf_filename, name); sym_change_count = 0; diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index fd9c32a..896a296 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -166,12 +166,15 @@ struct menu { struct symbol *sym; struct property *prompt; struct expr *dep; + unsigned int flags; //char *help; struct file *file; int lineno; - //void *data; + void *data; }; +#define MENU_CHANGED 0x0001 + #ifndef SWIG extern struct file *file_list; diff --git a/scripts/kconfig/kconfig.i b/scripts/kconfig/kconfig.i index 699cb13..77405fc 100644 --- a/scripts/kconfig/kconfig.i +++ b/scripts/kconfig/kconfig.i @@ -31,6 +31,11 @@ static void expr_to_s_help(void *data, const char *str) %} #endif +#ifdef SWIGPYTHON +%rename (Property) property; +%rename (default) def; +#endif + %immutable; %include "expr.h" #define P(name,type,arg) extern type name arg diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 688945b..cdd04a9 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -21,12 +21,14 @@ extern "C" { #include "lkc_proto.h" #undef P -void symbol_end(char *help); +#define SRCTREE "srctree" + int zconfparse(void); void zconfdump(FILE *out); extern int zconfdebug; void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); void zconf_initscan(const char *name); void zconf_nextfile(const char *name); int zconf_lineno(void); @@ -61,6 +63,7 @@ extern struct menu *current_menu; /* symbol.c */ void sym_init(void); void sym_clear_all_valid(void); +void sym_set_changed(struct symbol *sym); static inline tristate sym_get_tristate_value(struct symbol *sym) { diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index dec8603..eba5ff7 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -1,6 +1,9 @@ /* * Copyright (C) 2002 Roman Zippel * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis */ #include @@ -8,10 +11,12 @@ #include #include #include +#include #include #include #include #include +#include #include #define LKC_DIRECT_LINK @@ -44,18 +49,18 @@ setmod_text[] = "This feature depends on another which has been configured as a module.\n" "As a result, this feature will be built as a module.", nohelp_text[] = - "There is no help available for this option.\n", + "There is no help available for this kernel option.\n", load_config_text[] = "Enter the name of the configuration file you wish to load. " "Accept the name shown to restore the configuration you " "last retrieved. Leave blank to abort.", load_config_help[] = "\n" - "For various reasons, one may wish to keep several different\n" + "For various reasons, one may wish to keep several different kernel\n" "configurations available on a single machine.\n" "\n" "If you have saved a previous configuration in a file other than the\n" - "default, entering the name of the file here will allow you\n" + "kernel's default, entering the name of the file here will allow you\n" "to modify that configuration.\n" "\n" "If you are uncertain, then you have probably never used alternate\n" @@ -65,7 +70,7 @@ save_config_text[] = "as an alternate. Leave blank to abort.", save_config_help[] = "\n" - "For various reasons, one may wish to keep different\n" + "For various reasons, one may wish to keep different kernel\n" "configurations available on a single machine.\n" "\n" "Entering a file name here will allow you to later retrieve, modify\n" @@ -78,12 +83,15 @@ save_config_help[] = static char buf[4096], *bufptr = buf; static char input_buf[4096]; +static char filename[PATH_MAX+1] = ".config"; static char *args[1024], **argptr = args; static int indent = 0; +static struct termios ios_org; static int rows, cols; static struct menu *current_menu; static int child_count; static int do_resize; +static int single_menu_mode; static void conf(struct menu *menu); static void conf_choice(struct menu *menu); @@ -103,6 +111,7 @@ static int cprint(const char *fmt, ...); static void init_wsize(void) { struct winsize ws; + char *env; if (ioctl(1, TIOCGWINSZ, &ws) == -1) { rows = 24; @@ -110,6 +119,20 @@ static void init_wsize(void) } else { rows = ws.ws_row; cols = ws.ws_col; + if (!rows) { + env = getenv("LINES"); + if (env) + rows = atoi(env); + if (!rows) + rows = 24; + } + if (!cols) { + env = getenv("COLUMNS"); + if (env) + cols = atoi(env); + if (!cols) + cols = 80; + } } if (rows < 19 || cols < 80) { @@ -274,10 +297,20 @@ static void build_conf(struct menu *menu) case P_MENU: child_count++; cprint("m%p", menu); - if (menu->parent != &rootmenu) - cprint1(" %*c", indent + 1, ' '); - cprint1("%s --->", prompt); + + if (single_menu_mode) { + cprint1("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else { + if (menu->parent != &rootmenu) + cprint1(" %*c", indent + 1, ' '); + cprint1("%s --->", prompt); + } + cprint_done(); + if (single_menu_mode && menu->data) + goto conf_childs; return; default: if (prompt) { @@ -392,6 +425,7 @@ static void conf(struct menu *menu) char active_entry[40]; int stat, type, i; + unlink("lxdialog.scrltmp"); active_entry[0] = 0; while (1) { cprint_init(); @@ -442,7 +476,10 @@ static void conf(struct menu *menu) case 0: switch (type) { case 'm': - conf(submenu); + if (single_menu_mode) + submenu->data = (void *) !submenu->data; + else + conf(submenu); break; case 't': if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) @@ -484,6 +521,8 @@ static void conf(struct menu *menu) case 6: if (type == 't') sym_toggle_tristate_value(sym); + else if (type == 'm') + conf(submenu); break; } } @@ -518,11 +557,19 @@ static void show_helptext(const char *title, const char *text) static void show_help(struct menu *menu) { const char *help; + char *helptext; + struct symbol *sym = menu->sym; - help = menu->sym->help; + help = sym->help; if (!help) help = nohelp_text; - show_helptext(menu_get_prompt(menu), help); + if (sym->name) { + helptext = malloc(strlen(sym->name) + strlen(help) + 16); + sprintf(helptext, "CONFIG_%s:\n\n%s", sym->name, help); + show_helptext(menu_get_prompt(menu), helptext); + free(helptext); + } else + show_helptext(menu_get_prompt(menu), help); } static void show_readme(void) @@ -631,7 +678,7 @@ static void conf_load(void) cprint(load_config_text); cprint("11"); cprint("55"); - cprint("%s", conf_filename); + cprint("%s", filename); stat = exec_conf(); switch(stat) { case 0: @@ -660,7 +707,7 @@ static void conf_save(void) cprint(save_config_text); cprint("11"); cprint("55"); - cprint("%s", conf_filename); + cprint("%s", filename); stat = exec_conf(); switch(stat) { case 0: @@ -679,14 +726,35 @@ static void conf_save(void) } } +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); + unlink(".help.tmp"); + unlink("lxdialog.scrltmp"); +} + int main(int ac, char **av) { + struct symbol *sym; + char *mode; int stat; + conf_parse(av[1]); conf_read(NULL); - sprintf(menu_backtitle, "Configuration"); + sym = sym_lookup("KERNELRELEASE", 0); + sym_calc_value(sym); + sprintf(menu_backtitle, "Linux Kernel v%s Configuration", + sym_get_string_value(sym)); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + tcgetattr(1, &ios_org); + atexit(conf_cleanup); init_wsize(); conf(&rootmenu); @@ -702,10 +770,11 @@ int main(int ac, char **av) if (stat == 0) { conf_write(NULL); printf("\n\n" - "*** End of configuration.\n" - "*** Check the top-level Makefile for additional configuration.\n"); + "*** End of Linux kernel configuration.\n" + "*** Check the top-level Makefile for additional configuration.\n" + "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'.\n\n"); } else - printf("\n\nYour configuration changes were NOT saved.\n\n"); + printf("\n\nYour kernel configuration changes were NOT saved.\n\n"); return 0; } diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 4595110..24be0ec 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -290,7 +290,7 @@ int file_write_dep(const char *name) FILE *out; if (!name) - name = "..config.cmd"; + name = ".config.cmd"; out = fopen("..config.tmp", "w"); if (!out) return 1; diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index feefa1c..bed541d 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -17,6 +17,10 @@ #include #include #include +#if QT_VERSION >= 300 +#include +#endif + #include #include "lkc.h" @@ -26,6 +30,9 @@ #include "images.c" static QApplication *configApp; +#if QT_VERSION >= 300 +static QSettings *configSettings; +#endif /* * update all the children of a menu entry @@ -73,9 +80,17 @@ static void updateMenuList(P* parent, struct menu* menu) visible = menu_is_visible(child); if (showAll || visible) { if (!item || item->menu != child) - item = new ConfigItem(parent, last, child); - item->visible = visible; - item->updateMenu(); + item = new ConfigItem(parent, last, child, visible); + else { + item->visible = visible; + if (item->updateNeeded()) { + ConfigItem* i = (ConfigItem*)child->data; + for (; i; i = i->nextItem) { + i->updateMenu(); + } + } else if (list->updateAll) + item->updateMenu(); + } if (mode == fullMode || mode == menuMode || (type != P_MENU && type != P_ROOTMENU)) @@ -120,36 +135,22 @@ void ConfigItem::updateMenu(void) int type; enum prop_type ptype; tristate expr; - bool update; list = listView(); - update = doInit; - if (update) - doInit = false; - else - update = list->updateAll; sym = menu->sym; if (!sym) { - if (update) { - setText(promptColIdx, menu_get_prompt(menu)); - ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; - if ((ptype == P_ROOTMENU || ptype == P_MENU) && - (list->mode == singleMode || list->mode == symbolMode)) - setPixmap(promptColIdx, list->menuPix); - else - setPixmap(promptColIdx, 0); - } + setText(promptColIdx, menu_get_prompt(menu)); + ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; + if ((ptype == P_ROOTMENU || ptype == P_MENU) && + (list->mode == singleMode || list->mode == symbolMode)) + setPixmap(promptColIdx, list->menuPix); + else + setPixmap(promptColIdx, 0); return; } - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_CHANGED) && !update) - return; - - sym->flags &= ~SYMBOL_CHANGED; - - setText(nameColIdx, menu->sym->name); + setText(nameColIdx, sym->name); type = sym_get_type(sym); switch (type) { @@ -204,7 +205,9 @@ void ConfigItem::updateMenu(void) data = sym_get_string_value(sym); #if QT_VERSION >= 300 - setRenameEnabled(list->mapIdx(dataColIdx), TRUE); + int i = list->mapIdx(dataColIdx); + if (i >= 0) + setRenameEnabled(i, TRUE); #endif setText(dataColIdx, data); if (type == S_STRING) @@ -218,6 +221,18 @@ void ConfigItem::updateMenu(void) setText(promptColIdx, prompt); } +bool ConfigItem::updateNeeded(void) +{ + struct symbol* sym = menu->sym; + if (sym) + sym_calc_value(sym); + if (menu->flags & MENU_CHANGED) { + menu->flags &= ~MENU_CHANGED; + return true; + } + return false; +} + void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) { ConfigList* list = listView(); @@ -237,13 +252,14 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w void ConfigItem::init(void) { ConfigList* list = listView(); -#if QT_VERSION < 300 - visible = TRUE; -#endif - //menu->data = this; + nextItem = (ConfigItem*)menu->data; + menu->data = this; + if (list->mode != fullMode) setOpen(TRUE); - doInit= true; + if (menu->sym) + sym_calc_value(menu->sym); + updateMenu(); } /* @@ -251,7 +267,13 @@ void ConfigItem::init(void) */ ConfigItem::~ConfigItem(void) { - //menu->data = 0; + ConfigItem** ip = &(ConfigItem*)menu->data; + for (; *ip; ip = &(*ip)->nextItem) { + if (*ip == this) { + *ip = nextItem; + break; + } + } } void ConfigLineEdit::show(ConfigItem* i) @@ -273,17 +295,18 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) case Key_Return: case Key_Enter: sym_set_string_value(item->menu->sym, text().latin1()); - emit lineChanged(item); + parent()->updateList(item); break; default: Parent::keyPressEvent(e); return; } e->accept(); + parent()->list->setFocus(); hide(); } -ConfigList::ConfigList(QWidget* p, ConfigView* cv) +ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv) : Parent(p), cview(cv), updateAll(false), symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), @@ -352,6 +375,7 @@ void ConfigList::updateList(ConfigItem* item) { (void)item; // unused so far updateMenuList(this, rootEntry); + triggerUpdate(); } void ConfigList::setAllOpen(bool open) @@ -382,7 +406,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val) return; if (oldval == no && item->menu->list) item->setOpen(TRUE); - emit symbolChanged(item); + parent()->updateList(item); break; } } @@ -414,7 +438,7 @@ void ConfigList::changeValue(ConfigItem* item) item->setOpen(TRUE); } if (oldexpr != newexpr) - emit symbolChanged(item); + parent()->updateList(item); break; case S_INT: case S_HEX: @@ -424,7 +448,7 @@ void ConfigList::changeValue(ConfigItem* item) item->startRename(colMap[dataColIdx]); else #endif - lineEdit->show(item); + parent()->lineEdit->show(item); break; } } @@ -516,7 +540,7 @@ void ConfigList::contentsMousePressEvent(QMouseEvent* e) { //QPoint p(contentsToViewport(e->pos())); //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMousePressEvent(e); + Parent::contentsMousePressEvent(e); } void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) @@ -563,14 +587,14 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) skip: //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseReleaseEvent(e); + Parent::contentsMouseReleaseEvent(e); } void ConfigList::contentsMouseMoveEvent(QMouseEvent* e) { //QPoint p(contentsToViewport(e->pos())); //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseMoveEvent(e); + Parent::contentsMouseMoveEvent(e); } void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) @@ -587,10 +611,12 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) if ((ptype == P_ROOTMENU || ptype == P_MENU) && (mode == singleMode || mode == symbolMode)) emit menuSelected(menu); + else if (menu->sym) + changeValue(item); skip: //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseDoubleClickEvent(e); + Parent::contentsMouseDoubleClickEvent(e); } void ConfigList::focusInEvent(QFocusEvent *e) @@ -605,14 +631,75 @@ void ConfigList::focusInEvent(QFocusEvent *e) emit gotFocus(); } +ConfigView* ConfigView::viewList; + +ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview) + : Parent(parent) +{ + list = new ConfigList(this, cview); + lineEdit = new ConfigLineEdit(this); + lineEdit->hide(); + + this->nextView = viewList; + viewList = this; +} + +ConfigView::~ConfigView(void) +{ + ConfigView** vp; + + for (vp = &viewList; *vp; vp = &(*vp)->nextView) { + if (*vp == this) { + *vp = nextView; + break; + } + } +} + +void ConfigView::updateList(ConfigItem* item) +{ + ConfigView* v; + + for (v = viewList; v; v = v->nextView) + v->list->updateList(item); +} + +void ConfigView::updateListAll(void) +{ + ConfigView* v; + + for (v = viewList; v; v = v->nextView) + v->list->updateListAll(); +} + /* * Construct the complete config widget */ -ConfigView::ConfigView(void) +ConfigMainWindow::ConfigMainWindow(void) { + ConfigView* view; QMenuBar* menu; QSplitter* split1; QSplitter* split2; + bool ok; + int x, y, width, height; + + QWidget *d = configApp->desktop(); + +#if QT_VERSION >= 300 + width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64); + height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64); + resize(width, height); + x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); + if (ok) + y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok); + if (ok) + move(x, y); +#else + width = d->width() - 64; + height = d->height() - 64; + resize(width, height); +#endif showDebug = false; @@ -620,22 +707,15 @@ ConfigView::ConfigView(void) split1->setOrientation(QSplitter::Horizontal); setCentralWidget(split1); - menuList = new ConfigList(split1, this); + view = new ConfigView(split1, this); + menuList = view->list; split2 = new QSplitter(split1); split2->setOrientation(QSplitter::Vertical); // create config tree - QVBox* box = new QVBox(split2); - configList = new ConfigList(box, this); - configList->lineEdit = new ConfigLineEdit(box); - configList->lineEdit->hide(); - configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), - configList, SLOT(updateList(ConfigItem*))); - configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), - menuList, SLOT(updateList(ConfigItem*))); - configList->connect(configList->lineEdit, SIGNAL(lineChanged(ConfigItem*)), - SLOT(updateList(ConfigItem*))); + view = new ConfigView(split2, this); + configList = view->list; helpText = new QTextView(split2); helpText->setTextFormat(Qt::RichText); @@ -685,6 +765,11 @@ ConfigView::ConfigView(void) showDebugAction->setOn(showDebug); connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); + QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); + connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); + QAction *showAboutAction = new QAction(NULL, "About", 0, this); + connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout())); + // init tool bar backAction->addTo(toolBar); toolBar->addSeparator(); @@ -714,6 +799,13 @@ ConfigView::ConfigView(void) showAllAction->addTo(optionMenu); showDebugAction->addTo(optionMenu); + // create help menu + QPopupMenu* helpMenu = new QPopupMenu(this); + menu->insertSeparator(); + menu->insertItem("&Help", helpMenu); + showIntroAction->addTo(helpMenu); + showAboutAction->addTo(helpMenu); + connect(configList, SIGNAL(menuSelected(struct menu *)), SLOT(changeMenu(struct menu *))); connect(configList, SIGNAL(parentSelected()), @@ -769,12 +861,12 @@ static void expr_print_help(void *data, const char *str) /* * display a new help entry as soon as a new menu entry is selected */ -void ConfigView::setHelp(QListViewItem* item) +void ConfigMainWindow::setHelp(QListViewItem* item) { struct symbol* sym; struct menu* menu; - configList->lineEdit->hide(); + configList->parent()->lineEdit->hide(); if (item) { QString head, debug, help; menu = ((ConfigItem*)item)->menu; @@ -857,22 +949,23 @@ void ConfigView::setHelp(QListViewItem* item) helpText->setText(NULL); } -void ConfigView::loadConfig(void) +void ConfigMainWindow::loadConfig(void) { QString s = QFileDialog::getOpenFileName(".config", NULL, this); if (s.isNull()) return; if (conf_read(s.latin1())) QMessageBox::information(this, "qconf", "Unable to load configuration!"); + ConfigView::updateListAll(); } -void ConfigView::saveConfig(void) +void ConfigMainWindow::saveConfig(void) { if (conf_write(NULL)) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } -void ConfigView::saveConfigAs(void) +void ConfigMainWindow::saveConfigAs(void) { QString s = QFileDialog::getSaveFileName(".config", NULL, this); if (s.isNull()) @@ -881,13 +974,13 @@ void ConfigView::saveConfigAs(void) QMessageBox::information(this, "qconf", "Unable to save configuration!"); } -void ConfigView::changeMenu(struct menu *menu) +void ConfigMainWindow::changeMenu(struct menu *menu) { configList->setRootMenu(menu); backAction->setEnabled(TRUE); } -void ConfigView::listFocusChanged(void) +void ConfigMainWindow::listFocusChanged(void) { if (menuList->hasFocus()) { if (menuList->mode == menuMode) @@ -898,7 +991,7 @@ void ConfigView::listFocusChanged(void) } } -void ConfigView::goBack(void) +void ConfigMainWindow::goBack(void) { ConfigItem* item; @@ -915,7 +1008,7 @@ void ConfigView::goBack(void) } } -void ConfigView::showSingleView(void) +void ConfigMainWindow::showSingleView(void) { menuList->hide(); menuList->setRootMenu(0); @@ -928,7 +1021,7 @@ void ConfigView::showSingleView(void) configList->setFocus(); } -void ConfigView::showSplitView(void) +void ConfigMainWindow::showSplitView(void) { configList->mode = symbolMode; if (configList->rootEntry == &rootmenu) @@ -944,7 +1037,7 @@ void ConfigView::showSplitView(void) menuList->setFocus(); } -void ConfigView::showFullView(void) +void ConfigMainWindow::showFullView(void) { menuList->hide(); menuList->setRootMenu(0); @@ -957,7 +1050,7 @@ void ConfigView::showFullView(void) configList->setFocus(); } -void ConfigView::setShowAll(bool b) +void ConfigMainWindow::setShowAll(bool b) { if (configList->showAll == b) return; @@ -967,14 +1060,14 @@ void ConfigView::setShowAll(bool b) menuList->updateListAll(); } -void ConfigView::setShowDebug(bool b) +void ConfigMainWindow::setShowDebug(bool b) { if (showDebug == b) return; showDebug = b; } -void ConfigView::setShowName(bool b) +void ConfigMainWindow::setShowName(bool b) { if (configList->showName == b) return; @@ -982,7 +1075,7 @@ void ConfigView::setShowName(bool b) configList->reinit(); } -void ConfigView::setShowRange(bool b) +void ConfigMainWindow::setShowRange(bool b) { if (configList->showRange == b) return; @@ -990,7 +1083,7 @@ void ConfigView::setShowRange(bool b) configList->reinit(); } -void ConfigView::setShowData(bool b) +void ConfigMainWindow::setShowData(bool b) { if (configList->showData == b) return; @@ -1002,7 +1095,7 @@ void ConfigView::setShowData(bool b) * ask for saving configuration before quitting * TODO ask only when something changed */ -void ConfigView::closeEvent(QCloseEvent* e) +void ConfigMainWindow::closeEvent(QCloseEvent* e) { if (!sym_change_count) { e->accept(); @@ -1025,6 +1118,31 @@ void ConfigView::closeEvent(QCloseEvent* e) } } +void ConfigMainWindow::showIntro(void) +{ + static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n" + "For each option, a blank box indicates the feature is disabled, a check\n" + "indicates it is enabled, and a dot indicates that it is to be compiled\n" + "as a module. Clicking on the box will cycle through the three states.\n\n" + "If you do not see an option (e.g., a device driver) that you believe\n" + "should be present, try turning on Show All Options under the Options menu.\n" + "Although there is no cross reference yet to help you figure out what other\n" + "options must be enabled to support the option you are interested in, you can\n" + "still view the help of a grayed-out option.\n\n" + "Toggling Show Debug Info under the Options menu will show the dependencies,\n" + "which you can then match by examining other options.\n\n"; + + QMessageBox::information(this, "qconf", str); +} + +void ConfigMainWindow::showAbout(void) +{ + static char str[] = "qconf is Copyright (C) 2002 Roman Zippel .\n\n" + "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; + + QMessageBox::information(this, "qconf", str); +} + void fixup_rootmenu(struct menu *menu) { struct menu *child; @@ -1038,7 +1156,7 @@ void fixup_rootmenu(struct menu *menu) int main(int ac, char** av) { - ConfigView* v; + ConfigMainWindow* v; const char *name; #ifndef LKC_DIRECT_LINK @@ -1046,6 +1164,9 @@ int main(int ac, char** av) #endif configApp = new QApplication(ac, av); +#if QT_VERSION >= 300 + configSettings = new QSettings; +#endif if (ac > 1 && av[1][0] == '-') { switch (av[1][1]) { case 'a': @@ -1063,11 +1184,20 @@ int main(int ac, char** av) fixup_rootmenu(&rootmenu); conf_read(NULL); //zconfdump(stdout); - v = new ConfigView(); + + v = new ConfigMainWindow(); //zconfdump(stdout); v->show(); configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); configApp->exec(); + +#if QT_VERSION >= 300 + configSettings->writeEntry("/kconfig/qconf/window x", v->pos().x()); + configSettings->writeEntry("/kconfig/qconf/window y", v->pos().y()); + configSettings->writeEntry("/kconfig/qconf/window width", v->size().width()); + configSettings->writeEntry("/kconfig/qconf/window height", v->size().height()); + delete configSettings; +#endif return 0; } diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index f8f3669..6f096b4 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h @@ -5,9 +5,27 @@ #include -class ConfigLineEdit; +class ConfigList; class ConfigItem; -class ConfigView; +class ConfigLineEdit; +class ConfigMainWindow; + +class ConfigView : public QVBox { + Q_OBJECT + typedef class QVBox Parent; +public: + ConfigView(QWidget* parent, ConfigMainWindow* cview); + ~ConfigView(void); + static void updateList(ConfigItem* item); + static void updateListAll(void); + +public: + ConfigList* list; + ConfigLineEdit* lineEdit; + + static ConfigView* viewList; + ConfigView* nextView; +}; enum colIdx { promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr @@ -20,12 +38,15 @@ class ConfigList : public QListView { Q_OBJECT typedef class QListView Parent; public: - ConfigList(QWidget* p, ConfigView* cview); + ConfigList(ConfigView* p, ConfigMainWindow* cview); void reinit(void); + ConfigView* parent(void) const + { + return (ConfigView*)Parent::parent(); + } - ConfigLineEdit* lineEdit; protected: - ConfigView* cview; + ConfigMainWindow* cview; void keyPressEvent(QKeyEvent *e); void contentsMousePressEvent(QMouseEvent *e); @@ -43,7 +64,6 @@ public slots: signals: void menuSelected(struct menu *menu); void parentSelected(void); - void symbolChanged(ConfigItem* item); void gotFocus(void); public: @@ -100,13 +120,13 @@ private: class ConfigItem : public QListViewItem { typedef class QListViewItem Parent; public: - ConfigItem(QListView *parent, ConfigItem *after, struct menu *m) - : Parent(parent, after), menu(m) + ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v) + : Parent(parent, after), menu(m), visible(v) { init(); } - ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m) - : Parent(parent, after), menu(m) + ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) + : Parent(parent, after), menu(m), visible(v) { init(); } @@ -116,6 +136,7 @@ public: void okRename(int col); #endif void updateMenu(void); + bool updateNeeded(void); ConfigList* listView() const { return (ConfigList*)Parent::listView(); @@ -146,31 +167,33 @@ public: } void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align); + ConfigItem* nextItem; struct menu *menu; bool visible; - bool doInit; }; class ConfigLineEdit : public QLineEdit { Q_OBJECT typedef class QLineEdit Parent; public: - ConfigLineEdit(QWidget * parent) - : QLineEdit(parent) + ConfigLineEdit(ConfigView* parent) + : Parent(parent) { } + ConfigView* parent(void) const + { + return (ConfigView*)Parent::parent(); + } void show(ConfigItem *i); void keyPressEvent(QKeyEvent *e); -signals: - void lineChanged(ConfigItem *item); public: ConfigItem *item; }; -class ConfigView : public QMainWindow { +class ConfigMainWindow : public QMainWindow { Q_OBJECT public: - ConfigView(void); + ConfigMainWindow(void); public slots: void setHelp(QListViewItem* item); void changeMenu(struct menu *); @@ -187,6 +210,8 @@ public slots: void setShowRange(bool); void setShowName(bool); void setShowData(bool); + void showIntro(void); + void showAbout(void); protected: void closeEvent(QCloseEvent *e); diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 59c88d2..845d8a3 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -149,7 +149,7 @@ void sym_calc_visibility(struct symbol *sym) visible = E_OR(visible, E_CALC(prop->visible)); if (oldvisible != visible) { sym->visible = visible; - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } } @@ -204,7 +204,8 @@ void sym_calc_value(struct symbol *sym) sym_calc_value(prop->def); newval = prop->def->curr; } - } + } else + S_TRI(newval) = S_TRI(sym->def); } else newval = sym->def; @@ -276,14 +277,17 @@ out: } if (memcmp(&oldval, &newval, sizeof(newval))) - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); sym->curr = newval; if (sym_is_choice(sym)) { int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); prop = sym_get_choice_prop(sym); - for (e = prop->dep; e; e = e->left.expr) + for (e = prop->dep; e; e = e->left.expr) { e->right.sym->flags |= flags; + if (flags & SYMBOL_CHANGED) + sym_set_changed(e->right.sym); + } } } @@ -297,13 +301,24 @@ void sym_clear_all_valid(void) sym_change_count++; } +void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + void sym_set_all_changed(void) { struct symbol *sym; int i; for_all_symbols(i, sym) - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } bool sym_tristate_within_range(struct symbol *sym, tristate val) @@ -340,7 +355,7 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) if (sym->flags & SYMBOL_NEW) { sym->flags &= ~SYMBOL_NEW; - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } if (sym_is_choice_value(sym) && val == yes) { struct property *prop = sym_get_choice_prop(sym); @@ -460,7 +475,7 @@ bool sym_set_string_value(struct symbol *sym, const char *newval) if (sym->flags & SYMBOL_NEW) { sym->flags &= ~SYMBOL_NEW; - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } oldval = S_VAL(sym->def); @@ -525,7 +540,6 @@ struct symbol *sym_lookup(const char *name, int isconst) char *new_name; int hash = 0; - //printf("lookup: %s -> ", name); if (name) { if (name[0] && !name[1]) { switch (name[0]) { @@ -541,10 +555,8 @@ struct symbol *sym_lookup(const char *name, int isconst) for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { if (!strcmp(symbol->name, name)) { if ((isconst && symbol->flags & SYMBOL_CONST) || - (!isconst && !(symbol->flags & SYMBOL_CONST))) { - //printf("h:%p\n", symbol); + (!isconst && !(symbol->flags & SYMBOL_CONST))) return symbol; - } } } new_name = strdup(name); @@ -564,7 +576,6 @@ struct symbol *sym_lookup(const char *name, int isconst) symbol->next = symbol_hash[hash]; symbol_hash[hash] = symbol; - //printf("n:%p\n", symbol); return symbol; } diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 6d81e5e..1471630 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -1,4 +1,4 @@ -%option backup nostdinit noyywrap full ecs +%option backup nostdinit noyywrap never-interactive full ecs %option 8bit backup nodefault perf-report perf-report %x COMMAND HELP STRING PARAM %{ @@ -7,6 +7,7 @@ * Released under the terms of the GNU GPL v2.0. */ +#include #include #include #include @@ -14,7 +15,6 @@ #define LKC_DIRECT_LINK #include "lkc.h" -#include "zconf.tab.h" #define START_STRSIZE 16 @@ -83,8 +83,6 @@ n [A-Za-z0-9_] . { unput(yytext[0]); - //printf("new config: "); - //symbol_end(NULL); BEGIN(COMMAND); } @@ -143,32 +141,46 @@ n [A-Za-z0-9_] zconflval.string = text; return T_WORD; } + \\\n current_file->lineno++; . + <> { + BEGIN(INITIAL); + } } { - [^'"\n\\]+ { + [^'"\\\n]+/\n { + append_string(yytext, yyleng); + zconflval.string = text; + return T_STRING; + } + [^'"\\\n]+ { append_string(yytext, yyleng); } + \\.?/\n { + append_string(yytext + 1, yyleng - 1); + zconflval.string = text; + return T_STRING; + } + \\.? { + append_string(yytext + 1, yyleng - 1); + } \'|\" { if (str == yytext[0]) { BEGIN(PARAM); zconflval.string = text; - //printf("s:%s\n", text); return T_STRING; } else append_string(yytext, 1); } - \\[ \t]*\n append_string(yytext+yyleng-1, 1); current_file->lineno++; - \\[ \t]* append_string(yytext+1, yyleng-1); - \\. append_string(yytext+1, 1); \n { - //printf(":%d: open string!\n", current_file->lineno+1); - exit(0); + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; } <> { - //printf(":%d: open string!\n", current_file->lineno+1); - exit(0); + BEGIN(INITIAL); } } @@ -221,6 +233,7 @@ n [A-Za-z0-9_] zconf_endfile(); return T_EOF; } + fclose(yyin); yyterminate(); } @@ -238,14 +251,38 @@ static void zconf_endhelp(void) BEGIN(INITIAL); } + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + void zconf_initscan(const char *name) { - yyin = fopen(name, "r"); + yyin = zconf_fopen(name); if (!yyin) { printf("can't find file %s\n", name); exit(1); } - //fprintf(stderr, "zconf_initscan: %s\n", name); current_buf = malloc(sizeof(*current_buf)); memset(current_buf, 0, sizeof(*current_buf)); @@ -262,7 +299,7 @@ void zconf_nextfile(const char *name) memset(buf, 0, sizeof(*buf)); current_buf->state = YY_CURRENT_BUFFER; - yyin = fopen(name, "r"); + yyin = zconf_fopen(name); if (!yyin) { printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); exit(1); @@ -271,8 +308,6 @@ void zconf_nextfile(const char *name) buf->parent = current_buf; current_buf = buf; - //fprintf(stderr, "zconf_nextfile: %s\n", name); - if (file->flags & FILE_BUSY) { printf("recursive scan (%s)?\n", name); exit(1); @@ -297,6 +332,7 @@ static struct buffer *zconf_endfile(void) parent = current_buf->parent; if (parent) { + fclose(yyin); yy_delete_buffer(YY_CURRENT_BUFFER); yy_switch_to_buffer(parent->state); } diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index c3f1bd0..996b10a 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -227,10 +227,9 @@ choice_option: T_OPTIONAL printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); }; -choice_option: T_DEFAULT symbol +choice_option: T_DEFAULT symbol if_expr { - menu_add_prop(P_DEFAULT, NULL, $2, NULL); - //current_choice->prop->def = $2; + menu_add_prop(P_DEFAULT, NULL, $2, $3); printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); }; @@ -245,7 +244,6 @@ if: T_IF expr { printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); menu_add_entry(NULL); - //current_entry->prompt = menu_add_prop(T_IF, NULL, NULL, $2); menu_add_dep($2); menu_end_entry(); menu_add_menu(); -- cgit v0.9.0.2