-rw-r--r-- | scripts/kconfig/Makefile | 110 | ||||
-rw-r--r-- | scripts/kconfig/Makefile.kernel | 44 | ||||
-rw-r--r-- | scripts/kconfig/conf.c | 7 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 74 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 5 | ||||
-rw-r--r-- | scripts/kconfig/kconfig.i | 5 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 5 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 101 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 2 | ||||
-rw-r--r-- | scripts/kconfig/qconf.cc | 274 | ||||
-rw-r--r-- | scripts/kconfig/qconf.h | 59 | ||||
-rw-r--r-- | scripts/kconfig/symbol.c | 35 | ||||
-rw-r--r-- | scripts/kconfig/zconf.l | 72 | ||||
-rw-r--r-- | scripts/kconfig/zconf.y | 6 |
14 files changed, 542 insertions, 257 deletions
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 7e257be..5a0d7e5 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -1,33 +1,17 @@ -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) @@ -36,10 +20,10 @@ 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 @@ -51,5 +35,5 @@ 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)) @@ -77,26 +61,12 @@ qconf_OBJ=$(filter %.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 @@ -129,11 +99,8 @@ qconf: @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 $@ @@ -143,5 +110,6 @@ lkc_defs.h: lkc_proto.h 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: @@ -149,5 +117,5 @@ tgz: 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 @@ -168,22 +136,13 @@ lex.%.c: %.l 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: @@ -205,3 +164,18 @@ ruby: .ruby libkconfig.so .ruby/kconfig.so 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 @@ -24,18 +24,10 @@ 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 @@ -43,12 +35,30 @@ $(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 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 @@ -116,4 +116,5 @@ static void conf_askvalue(struct symbol *sym, const char *def) } case ask_all: + fflush(stdout); fgets(line, 128, stdin); return; @@ -343,4 +344,6 @@ static int conf_choice(struct menu *menu) case ask_silent: case ask_all: + if (is_new) + sym->flags |= SYMBOL_NEW; conf_askvalue(sym, menu_get_prompt(def_menu)); strip(line); @@ -358,5 +361,5 @@ static int conf_choice(struct menu *menu) } if (line[0]) { - len = strlen(line) - 1; + len = strlen(line); line[len] = 0; @@ -365,5 +368,5 @@ static int conf_choice(struct menu *menu) 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 @@ -4,6 +4,6 @@ */ +#include <sys/stat.h> #include <ctype.h> -#include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -15,5 +15,4 @@ const char conf_def_filename[] = ".config"; -char conf_filename[PATH_MAX+1]; const char conf_defname[] = "arch/$ARCH/defconfig"; @@ -56,5 +55,16 @@ 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; } @@ -62,5 +72,5 @@ int conf_read(const char *name) { FILE *in = NULL; - char line[128]; + char line[1024]; char *p, *p2; int lineno = 0; @@ -71,12 +81,10 @@ int conf_read(const char *name) 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" @@ -92,19 +100,19 @@ int conf_read(const char *name) 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]) { @@ -118,5 +126,4 @@ int conf_read(const char *name) if (strncmp(p, "is not set", 10)) continue; - //printf("%s -> n\n", line + 9); sym = sym_lookup(line + 9, 0); switch (sym->type) { @@ -140,5 +147,4 @@ int conf_read(const char *name) if (p2) *p2 = 0; - //printf("%s -> %s\n", line + 7, p); sym = sym_find(line + 7); if (!sym) { @@ -147,14 +153,21 @@ int conf_read(const char *name) } 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: @@ -168,4 +181,8 @@ 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: @@ -173,6 +190,8 @@ int conf_read(const char *name) 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: @@ -353,5 +372,4 @@ int conf_write(const char *name) 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 @@ -167,10 +167,13 @@ struct menu { 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 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 @@ -32,4 +32,9 @@ 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" 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 @@ -22,5 +22,6 @@ extern "C" { #undef P -void symbol_end(char *help); +#define SRCTREE "srctree" + int zconfparse(void); void zconfdump(FILE *out); @@ -28,4 +29,5 @@ 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); @@ -62,4 +64,5 @@ extern struct menu *current_menu; 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 @@ -2,4 +2,7 @@ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> * 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 <pasky@ucw.cz> */ @@ -9,8 +12,10 @@ #include <errno.h> #include <fcntl.h> +#include <limits.h> #include <signal.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <termios.h> #include <unistd.h> @@ -45,5 +50,5 @@ setmod_text[] = "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. " @@ -52,9 +57,9 @@ load_config_text[] = 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" @@ -66,5 +71,5 @@ save_config_text[] = 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" @@ -79,10 +84,13 @@ 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); @@ -104,4 +112,5 @@ static void init_wsize(void) { struct winsize ws; + char *env; if (ioctl(1, TIOCGWINSZ, &ws) == -1) { @@ -111,4 +120,18 @@ static void init_wsize(void) 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; + } } @@ -275,8 +298,18 @@ static void build_conf(struct menu *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: @@ -393,4 +426,5 @@ static void conf(struct menu *menu) int stat, type, i; + unlink("lxdialog.scrltmp"); active_entry[0] = 0; while (1) { @@ -443,5 +477,8 @@ static void conf(struct menu *menu) switch (type) { case 'm': - conf(submenu); + if (single_menu_mode) + submenu->data = (void *) !submenu->data; + else + conf(submenu); break; case 't': @@ -485,4 +522,6 @@ static void conf(struct menu *menu) if (type == 't') sym_toggle_tristate_value(sym); + else if (type == 'm') + conf(submenu); break; } @@ -519,9 +558,17 @@ 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); } @@ -632,5 +679,5 @@ static void conf_load(void) cprint("11"); cprint("55"); - cprint("%s", conf_filename); + cprint("%s", filename); stat = exec_conf(); switch(stat) { @@ -661,5 +708,5 @@ static void conf_save(void) cprint("11"); cprint("55"); - cprint("%s", conf_filename); + cprint("%s", filename); stat = exec_conf(); switch(stat) { @@ -680,12 +727,33 @@ 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); @@ -703,8 +771,9 @@ int main(int ac, char **av) 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 @@ -291,5 +291,5 @@ int file_write_dep(const char *name) if (!name) - name = "..config.cmd"; + name = ".config.cmd"; out = fopen("..config.tmp", "w"); if (!out) 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 @@ -18,4 +18,8 @@ #include <qfiledialog.h> #include <qregexp.h> +#if QT_VERSION >= 300 +#include <qsettings.h> +#endif + #include <stdlib.h> @@ -27,4 +31,7 @@ static QApplication *configApp; +#if QT_VERSION >= 300 +static QSettings *configSettings; +#endif /* @@ -74,7 +81,15 @@ static void updateMenuList(P* parent, struct menu* menu) 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 || @@ -121,34 +136,20 @@ void ConfigItem::updateMenu(void) 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); @@ -205,5 +206,7 @@ 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); @@ -219,4 +222,16 @@ void ConfigItem::updateMenu(void) } +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) { @@ -238,11 +253,12 @@ 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(); } @@ -252,5 +268,11 @@ 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; + } + } } @@ -274,5 +296,5 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) case Key_Enter: sym_set_string_value(item->menu->sym, text().latin1()); - emit lineChanged(item); + parent()->updateList(item); break; default: @@ -281,8 +303,9 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) } e->accept(); + parent()->list->setFocus(); hide(); } -ConfigList::ConfigList(QWidget* p, ConfigView* cv) +ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv) : Parent(p), cview(cv), updateAll(false), @@ -353,4 +376,5 @@ void ConfigList::updateList(ConfigItem* item) (void)item; // unused so far updateMenuList(this, rootEntry); + triggerUpdate(); } @@ -383,5 +407,5 @@ void ConfigList::setValue(ConfigItem* item, tristate val) if (oldval == no && item->menu->list) item->setOpen(TRUE); - emit symbolChanged(item); + parent()->updateList(item); break; } @@ -415,5 +439,5 @@ void ConfigList::changeValue(ConfigItem* item) } if (oldexpr != newexpr) - emit symbolChanged(item); + parent()->updateList(item); break; case S_INT: @@ -425,5 +449,5 @@ void ConfigList::changeValue(ConfigItem* item) else #endif - lineEdit->show(item); + parent()->lineEdit->show(item); break; } @@ -517,5 +541,5 @@ 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); } @@ -564,5 +588,5 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) skip: //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); - QListView::contentsMouseReleaseEvent(e); + Parent::contentsMouseReleaseEvent(e); } @@ -571,5 +595,5 @@ 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); } @@ -588,8 +612,10 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) (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); } @@ -606,12 +632,73 @@ void ConfigList::focusInEvent(QFocusEvent *e) } +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; @@ -621,5 +708,6 @@ ConfigView::ConfigView(void) setCentralWidget(split1); - menuList = new ConfigList(split1, this); + view = new ConfigView(split1, this); + menuList = view->list; split2 = new QSplitter(split1); @@ -627,14 +715,6 @@ ConfigView::ConfigView(void) // 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); @@ -686,4 +766,9 @@ ConfigView::ConfigView(void) 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); @@ -715,4 +800,11 @@ ConfigView::ConfigView(void) 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 *))); @@ -770,10 +862,10 @@ 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; @@ -858,5 +950,5 @@ void ConfigView::setHelp(QListViewItem* item) } -void ConfigView::loadConfig(void) +void ConfigMainWindow::loadConfig(void) { QString s = QFileDialog::getOpenFileName(".config", NULL, this); @@ -865,7 +957,8 @@ void ConfigView::loadConfig(void) 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)) @@ -873,5 +966,5 @@ void ConfigView::saveConfig(void) } -void ConfigView::saveConfigAs(void) +void ConfigMainWindow::saveConfigAs(void) { QString s = QFileDialog::getSaveFileName(".config", NULL, this); @@ -882,5 +975,5 @@ void ConfigView::saveConfigAs(void) } -void ConfigView::changeMenu(struct menu *menu) +void ConfigMainWindow::changeMenu(struct menu *menu) { configList->setRootMenu(menu); @@ -888,5 +981,5 @@ void ConfigView::changeMenu(struct menu *menu) } -void ConfigView::listFocusChanged(void) +void ConfigMainWindow::listFocusChanged(void) { if (menuList->hasFocus()) { @@ -899,5 +992,5 @@ void ConfigView::listFocusChanged(void) } -void ConfigView::goBack(void) +void ConfigMainWindow::goBack(void) { ConfigItem* item; @@ -916,5 +1009,5 @@ void ConfigView::goBack(void) } -void ConfigView::showSingleView(void) +void ConfigMainWindow::showSingleView(void) { menuList->hide(); @@ -929,5 +1022,5 @@ void ConfigView::showSingleView(void) } -void ConfigView::showSplitView(void) +void ConfigMainWindow::showSplitView(void) { configList->mode = symbolMode; @@ -945,5 +1038,5 @@ void ConfigView::showSplitView(void) } -void ConfigView::showFullView(void) +void ConfigMainWindow::showFullView(void) { menuList->hide(); @@ -958,5 +1051,5 @@ void ConfigView::showFullView(void) } -void ConfigView::setShowAll(bool b) +void ConfigMainWindow::setShowAll(bool b) { if (configList->showAll == b) @@ -968,5 +1061,5 @@ void ConfigView::setShowAll(bool b) } -void ConfigView::setShowDebug(bool b) +void ConfigMainWindow::setShowDebug(bool b) { if (showDebug == b) @@ -975,5 +1068,5 @@ void ConfigView::setShowDebug(bool b) } -void ConfigView::setShowName(bool b) +void ConfigMainWindow::setShowName(bool b) { if (configList->showName == b) @@ -983,5 +1076,5 @@ void ConfigView::setShowName(bool b) } -void ConfigView::setShowRange(bool b) +void ConfigMainWindow::setShowRange(bool b) { if (configList->showRange == b) @@ -991,5 +1084,5 @@ void ConfigView::setShowRange(bool b) } -void ConfigView::setShowData(bool b) +void ConfigMainWindow::setShowData(bool b) { if (configList->showData == b) @@ -1003,5 +1096,5 @@ void ConfigView::setShowData(bool b) * TODO ask only when something changed */ -void ConfigView::closeEvent(QCloseEvent* e) +void ConfigMainWindow::closeEvent(QCloseEvent* e) { if (!sym_change_count) { @@ -1026,4 +1119,29 @@ 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 <zippel@linux-m68k.org>.\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) { @@ -1039,5 +1157,5 @@ void fixup_rootmenu(struct menu *menu) int main(int ac, char** av) { - ConfigView* v; + ConfigMainWindow* v; const char *name; @@ -1047,4 +1165,7 @@ int main(int ac, char** av) configApp = new QApplication(ac, av); +#if QT_VERSION >= 300 + configSettings = new QSettings; +#endif if (ac > 1 && av[1][0] == '-') { switch (av[1][1]) { @@ -1064,5 +1185,6 @@ int main(int ac, char** av) conf_read(NULL); //zconfdump(stdout); - v = new ConfigView(); + + v = new ConfigMainWindow(); //zconfdump(stdout); @@ -1070,4 +1192,12 @@ int main(int ac, char** av) 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 @@ -6,7 +6,25 @@ #include <qlistview.h> -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 { @@ -21,10 +39,13 @@ class ConfigList : public QListView { 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); @@ -44,5 +65,4 @@ signals: void menuSelected(struct menu *menu); void parentSelected(void); - void symbolChanged(ConfigItem* item); void gotFocus(void); @@ -101,11 +121,11 @@ 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(); @@ -117,4 +137,5 @@ public: #endif void updateMenu(void); + bool updateNeeded(void); ConfigList* listView() const { @@ -147,7 +168,7 @@ public: void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align); + ConfigItem* nextItem; struct menu *menu; bool visible; - bool doInit; }; @@ -156,11 +177,13 @@ class ConfigLineEdit : public QLineEdit { 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: @@ -168,8 +191,8 @@ public: }; -class ConfigView : public QMainWindow { +class ConfigMainWindow : public QMainWindow { Q_OBJECT public: - ConfigView(void); + ConfigMainWindow(void); public slots: void setHelp(QListViewItem* item); @@ -188,4 +211,6 @@ public slots: void setShowName(bool); void setShowData(bool); + void showIntro(void); + void showAbout(void); protected: 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 @@ -150,5 +150,5 @@ void sym_calc_visibility(struct symbol *sym) if (oldvisible != visible) { sym->visible = visible; - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } } @@ -205,5 +205,6 @@ void sym_calc_value(struct symbol *sym) newval = prop->def->curr; } - } + } else + S_TRI(newval) = S_TRI(sym->def); } else newval = sym->def; @@ -277,5 +278,5 @@ out: if (memcmp(&oldval, &newval, sizeof(newval))) - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); sym->curr = newval; @@ -283,6 +284,9 @@ out: 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); + } } } @@ -298,4 +302,15 @@ void sym_clear_all_valid(void) } +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) { @@ -304,5 +319,5 @@ void sym_set_all_changed(void) for_all_symbols(i, sym) - sym->flags |= SYMBOL_CHANGED; + sym_set_changed(sym); } @@ -341,5 +356,5 @@ 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) { @@ -461,5 +476,5 @@ 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); } @@ -526,5 +541,4 @@ struct symbol *sym_lookup(const char *name, int isconst) int hash = 0; - //printf("lookup: %s -> ", name); if (name) { if (name[0] && !name[1]) { @@ -542,8 +556,6 @@ struct symbol *sym_lookup(const char *name, int isconst) 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; - } } } @@ -565,5 +577,4 @@ struct symbol *sym_lookup(const char *name, int isconst) 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,3 +1,3 @@ -%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 @@ -8,4 +8,5 @@ */ +#include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -15,5 +16,4 @@ #define LKC_DIRECT_LINK #include "lkc.h" -#include "zconf.tab.h" #define START_STRSIZE 16 @@ -84,6 +84,4 @@ n [A-Za-z0-9_] . { unput(yytext[0]); - //printf("new config: "); - //symbol_end(NULL); BEGIN(COMMAND); } @@ -144,30 +142,44 @@ n [A-Za-z0-9_] return T_WORD; } + \\\n current_file->lineno++; . + <<EOF>> { + BEGIN(INITIAL); + } } <STRING>{ - [^'"\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; } <<EOF>> { - //printf(":%d: open string!\n", current_file->lineno+1); - exit(0); + BEGIN(INITIAL); } } @@ -222,4 +234,5 @@ n [A-Za-z0-9_] return T_EOF; } + fclose(yyin); yyterminate(); } @@ -239,12 +252,36 @@ static void zconf_endhelp(void) } + +/* + * 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)); @@ -263,5 +300,5 @@ void zconf_nextfile(const char *name) 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); @@ -272,6 +309,4 @@ void zconf_nextfile(const char *name) current_buf = buf; - //fprintf(stderr, "zconf_nextfile: %s\n", name); - if (file->flags & FILE_BUSY) { printf("recursive scan (%s)?\n", name); @@ -298,4 +333,5 @@ 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 @@ -228,8 +228,7 @@ choice_option: T_OPTIONAL }; -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()); }; @@ -246,5 +245,4 @@ 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(); |