summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--scripts/kconfig/Makefile110
-rw-r--r--scripts/kconfig/Makefile.kernel44
-rw-r--r--scripts/kconfig/conf.c7
-rw-r--r--scripts/kconfig/confdata.c74
-rw-r--r--scripts/kconfig/expr.h5
-rw-r--r--scripts/kconfig/kconfig.i5
-rw-r--r--scripts/kconfig/lkc.h5
-rw-r--r--scripts/kconfig/mconf.c101
-rw-r--r--scripts/kconfig/menu.c2
-rw-r--r--scripts/kconfig/qconf.cc274
-rw-r--r--scripts/kconfig/qconf.h59
-rw-r--r--scripts/kconfig/symbol.c35
-rw-r--r--scripts/kconfig/zconf.l72
-rw-r--r--scripts/kconfig/zconf.y6
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,5 +1,5 @@
-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
@@ -8,25 +8,9 @@ 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)
@@ -37,8 +21,8 @@ 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
@@ -52,3 +36,3 @@ endif
-SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC) $(lkcc_SRC)
+SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC)
CSRC=$(filter %.c, $(SRC))
@@ -78,24 +62,10 @@ qconf_OBJ=$(filter %.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
@@ -130,9 +100,6 @@ qconf:
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)
@@ -144,3 +111,4 @@ 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
@@ -150,3 +118,3 @@ tgz:
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
@@ -169,20 +137,11 @@ 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
@@ -206,2 +165,17 @@ ruby: .ruby libkconfig.so .ruby/kconfig.so
-.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
@@ -25,10 +25,2 @@ 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
@@ -37,4 +29,4 @@ 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
@@ -44,10 +36,28 @@ $(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
@@ -117,2 +117,3 @@ static void conf_askvalue(struct symbol *sym, const char *def)
case ask_all:
+ fflush(stdout);
fgets(line, 128, stdin);
@@ -344,2 +345,4 @@ static int conf_choice(struct menu *menu)
case ask_all:
+ if (is_new)
+ sym->flags |= SYMBOL_NEW;
conf_askvalue(sym, menu_get_prompt(def_menu));
@@ -359,3 +362,3 @@ static int conf_choice(struct menu *menu)
if (line[0]) {
- len = strlen(line) - 1;
+ len = strlen(line);
line[len] = 0;
@@ -366,3 +369,3 @@ static int conf_choice(struct menu *menu)
continue;
- if (!strncmp(line, menu_get_prompt(cmenu), len)) {
+ if (!strncasecmp(line, menu_get_prompt(cmenu), len)) {
def_menu = cmenu;
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
@@ -5,4 +5,4 @@
+#include <sys/stat.h>
#include <ctype.h>
-#include <limits.h>
#include <stdio.h>
@@ -16,3 +16,2 @@
const char conf_def_filename[] = ".config";
-char conf_filename[PATH_MAX+1];
@@ -57,3 +56,14 @@ 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;
}
@@ -63,3 +73,3 @@ int conf_read(const char *name)
FILE *in = NULL;
- char line[128];
+ char line[1024];
char *p, *p2;
@@ -72,5 +82,3 @@ int conf_read(const char *name)
if (name) {
- in = fopen(name, "r");
- if (in)
- strcpy(conf_filename, name);
+ in = zconf_fopen(name);
} else {
@@ -79,3 +87,3 @@ int conf_read(const char *name)
name = conf_expand_value(name);
- in = fopen(name, "r");
+ in = zconf_fopen(name);
if (in) {
@@ -93,3 +101,4 @@ 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) {
@@ -98,8 +107,7 @@ int conf_read(const char *name)
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;
}
@@ -107,3 +115,3 @@ int conf_read(const char *name)
- while (fgets(line, 128, in)) {
+ while (fgets(line, sizeof(line), in)) {
lineno++;
@@ -119,3 +127,2 @@ int conf_read(const char *name)
continue;
- //printf("%s -> n\n", line + 9);
sym = sym_lookup(line + 9, 0);
@@ -141,3 +148,2 @@ int conf_read(const char *name)
*p2 = 0;
- //printf("%s -> %s\n", line + 7, p);
sym = sym_find(line + 7);
@@ -148,12 +154,19 @@ 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;
@@ -169,2 +182,6 @@ int conf_read(const char *name)
}
+ if (!p2) {
+ fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+ exit(1);
+ }
case S_INT:
@@ -174,4 +191,6 @@ int conf_read(const char *name)
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;
@@ -354,3 +373,2 @@ int conf_write(const char *name)
return 1;
- strcpy(conf_filename, name);
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
@@ -168,2 +168,3 @@ struct menu {
struct expr *dep;
+ unsigned int flags;
//char *help;
@@ -171,5 +172,7 @@ struct menu {
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
@@ -33,2 +33,7 @@ static void expr_to_s_help(void *data, const char *str)
+#ifdef SWIGPYTHON
+%rename (Property) property;
+%rename (default) def;
+#endif
+
%immutable;
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
@@ -23,3 +23,4 @@ extern "C" {
-void symbol_end(char *help);
+#define SRCTREE "srctree"
+
int zconfparse(void);
@@ -29,2 +30,3 @@ extern int zconfdebug;
void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
void zconf_initscan(const char *name);
@@ -63,2 +65,3 @@ void sym_init(void);
void sym_clear_all_valid(void);
+void sym_set_changed(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
@@ -3,2 +3,5 @@
* 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>
*/
@@ -10,2 +13,3 @@
#include <fcntl.h>
+#include <limits.h>
#include <signal.h>
@@ -14,2 +18,3 @@
#include <string.h>
+#include <termios.h>
#include <unistd.h>
@@ -46,3 +51,3 @@ setmod_text[] =
nohelp_text[] =
- "There is no help available for this option.\n",
+ "There is no help available for this kernel option.\n",
load_config_text[] =
@@ -53,3 +58,3 @@ 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"
@@ -57,3 +62,3 @@ load_config_help[] =
"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"
@@ -67,3 +72,3 @@ 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"
@@ -80,4 +85,6 @@ 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;
@@ -86,2 +93,3 @@ static int child_count;
static int do_resize;
+static int single_menu_mode;
@@ -105,2 +113,3 @@ static void init_wsize(void)
struct winsize ws;
+ char *env;
@@ -112,2 +121,16 @@ static void init_wsize(void)
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;
+ }
}
@@ -276,6 +299,16 @@ static void build_conf(struct menu *menu)
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;
@@ -394,2 +427,3 @@ static void conf(struct menu *menu)
+ unlink("lxdialog.scrltmp");
active_entry[0] = 0;
@@ -444,3 +478,6 @@ static void conf(struct menu *menu)
case 'm':
- conf(submenu);
+ if (single_menu_mode)
+ submenu->data = (void *) !submenu->data;
+ else
+ conf(submenu);
break;
@@ -486,2 +523,4 @@ static void conf(struct menu *menu)
sym_toggle_tristate_value(sym);
+ else if (type == 'm')
+ conf(submenu);
break;
@@ -520,7 +559,15 @@ 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);
}
@@ -633,3 +680,3 @@ static void conf_load(void)
cprint("55");
- cprint("%s", conf_filename);
+ cprint("%s", filename);
stat = exec_conf();
@@ -662,3 +709,3 @@ static void conf_save(void)
cprint("55");
- cprint("%s", conf_filename);
+ cprint("%s", filename);
stat = exec_conf();
@@ -681,5 +728,15 @@ 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]);
@@ -687,4 +744,15 @@ int main(int ac, char **av)
- 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();
@@ -704,6 +772,7 @@ int main(int ac, char **av)
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");
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
@@ -292,3 +292,3 @@ int file_write_dep(const char *name)
if (!name)
- name = "..config.cmd";
+ name = ".config.cmd";
out = fopen("..config.tmp", "w");
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
@@ -19,2 +19,6 @@
#include <qregexp.h>
+#if QT_VERSION >= 300
+#include <qsettings.h>
+#endif
+
#include <stdlib.h>
@@ -28,2 +32,5 @@
static QApplication *configApp;
+#if QT_VERSION >= 300
+static QSettings *configSettings;
+#endif
@@ -75,5 +82,13 @@ static void updateMenuList(P* parent, struct menu* menu)
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();
+ }
@@ -122,10 +137,4 @@ void ConfigItem::updateMenu(void)
tristate expr;
- bool update;
list = listView();
- update = doInit;
- if (update)
- doInit = false;
- else
- update = list->updateAll;
@@ -133,11 +142,9 @@ void ConfigItem::updateMenu(void)
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;
@@ -145,9 +152,3 @@ void ConfigItem::updateMenu(void)
- sym_calc_value(sym);
- if (!(sym->flags & SYMBOL_CHANGED) && !update)
- return;
-
- sym->flags &= ~SYMBOL_CHANGED;
-
- setText(nameColIdx, menu->sym->name);
+ setText(nameColIdx, sym->name);
@@ -206,3 +207,5 @@ void ConfigItem::updateMenu(void)
#if QT_VERSION >= 300
- setRenameEnabled(list->mapIdx(dataColIdx), TRUE);
+ int i = list->mapIdx(dataColIdx);
+ if (i >= 0)
+ setRenameEnabled(i, TRUE);
#endif
@@ -220,2 +223,14 @@ 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)
@@ -239,9 +254,10 @@ 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();
}
@@ -253,3 +269,9 @@ ConfigItem::~ConfigItem(void)
{
- //menu->data = 0;
+ ConfigItem** ip = &(ConfigItem*)menu->data;
+ for (; *ip; ip = &(*ip)->nextItem) {
+ if (*ip == this) {
+ *ip = nextItem;
+ break;
+ }
+ }
}
@@ -275,3 +297,3 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
sym_set_string_value(item->menu->sym, text().latin1());
- emit lineChanged(item);
+ parent()->updateList(item);
break;
@@ -282,2 +304,3 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
e->accept();
+ parent()->list->setFocus();
hide();
@@ -285,3 +308,3 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
-ConfigList::ConfigList(QWidget* p, ConfigView* cv)
+ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv)
: Parent(p), cview(cv),
@@ -354,2 +377,3 @@ void ConfigList::updateList(ConfigItem* item)
updateMenuList(this, rootEntry);
+ triggerUpdate();
}
@@ -384,3 +408,3 @@ void ConfigList::setValue(ConfigItem* item, tristate val)
item->setOpen(TRUE);
- emit symbolChanged(item);
+ parent()->updateList(item);
break;
@@ -416,3 +440,3 @@ void ConfigList::changeValue(ConfigItem* item)
if (oldexpr != newexpr)
- emit symbolChanged(item);
+ parent()->updateList(item);
break;
@@ -426,3 +450,3 @@ void ConfigList::changeValue(ConfigItem* item)
#endif
- lineEdit->show(item);
+ parent()->lineEdit->show(item);
break;
@@ -518,3 +542,3 @@ void ConfigList::contentsMousePressEvent(QMouseEvent* e)
//printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y());
- QListView::contentsMousePressEvent(e);
+ Parent::contentsMousePressEvent(e);
}
@@ -565,3 +589,3 @@ skip:
//printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y());
- QListView::contentsMouseReleaseEvent(e);
+ Parent::contentsMouseReleaseEvent(e);
}
@@ -572,3 +596,3 @@ void ConfigList::contentsMouseMoveEvent(QMouseEvent* e)
//printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y());
- QListView::contentsMouseMoveEvent(e);
+ Parent::contentsMouseMoveEvent(e);
}
@@ -589,2 +613,4 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
emit menuSelected(menu);
+ else if (menu->sym)
+ changeValue(item);
@@ -592,3 +618,3 @@ skip:
//printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y());
- QListView::contentsMouseDoubleClickEvent(e);
+ Parent::contentsMouseDoubleClickEvent(e);
}
@@ -607,2 +633,43 @@ 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();
+}
+
/*
@@ -610,4 +677,5 @@ void ConfigList::focusInEvent(QFocusEvent *e)
*/
-ConfigView::ConfigView(void)
+ConfigMainWindow::ConfigMainWindow(void)
{
+ ConfigView* view;
QMenuBar* menu;
@@ -615,2 +683,21 @@ ConfigView::ConfigView(void)
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
@@ -622,3 +709,4 @@ ConfigView::ConfigView(void)
- menuList = new ConfigList(split1, this);
+ view = new ConfigView(split1, this);
+ menuList = view->list;
@@ -628,12 +716,4 @@ 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;
@@ -687,2 +767,7 @@ ConfigView::ConfigView(void)
+ 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
@@ -716,2 +801,9 @@ ConfigView::ConfigView(void)
+ // 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 *)),
@@ -771,3 +863,3 @@ static void expr_print_help(void *data, const char *str)
*/
-void ConfigView::setHelp(QListViewItem* item)
+void ConfigMainWindow::setHelp(QListViewItem* item)
{
@@ -776,3 +868,3 @@ void ConfigView::setHelp(QListViewItem* item)
- configList->lineEdit->hide();
+ configList->parent()->lineEdit->hide();
if (item) {
@@ -859,3 +951,3 @@ void ConfigView::setHelp(QListViewItem* item)
-void ConfigView::loadConfig(void)
+void ConfigMainWindow::loadConfig(void)
{
@@ -866,5 +958,6 @@ void ConfigView::loadConfig(void)
QMessageBox::information(this, "qconf", "Unable to load configuration!");
+ ConfigView::updateListAll();
}
-void ConfigView::saveConfig(void)
+void ConfigMainWindow::saveConfig(void)
{
@@ -874,3 +967,3 @@ void ConfigView::saveConfig(void)
-void ConfigView::saveConfigAs(void)
+void ConfigMainWindow::saveConfigAs(void)
{
@@ -883,3 +976,3 @@ void ConfigView::saveConfigAs(void)
-void ConfigView::changeMenu(struct menu *menu)
+void ConfigMainWindow::changeMenu(struct menu *menu)
{
@@ -889,3 +982,3 @@ void ConfigView::changeMenu(struct menu *menu)
-void ConfigView::listFocusChanged(void)
+void ConfigMainWindow::listFocusChanged(void)
{
@@ -900,3 +993,3 @@ void ConfigView::listFocusChanged(void)
-void ConfigView::goBack(void)
+void ConfigMainWindow::goBack(void)
{
@@ -917,3 +1010,3 @@ void ConfigView::goBack(void)
-void ConfigView::showSingleView(void)
+void ConfigMainWindow::showSingleView(void)
{
@@ -930,3 +1023,3 @@ void ConfigView::showSingleView(void)
-void ConfigView::showSplitView(void)
+void ConfigMainWindow::showSplitView(void)
{
@@ -946,3 +1039,3 @@ void ConfigView::showSplitView(void)
-void ConfigView::showFullView(void)
+void ConfigMainWindow::showFullView(void)
{
@@ -959,3 +1052,3 @@ void ConfigView::showFullView(void)
-void ConfigView::setShowAll(bool b)
+void ConfigMainWindow::setShowAll(bool b)
{
@@ -969,3 +1062,3 @@ void ConfigView::setShowAll(bool b)
-void ConfigView::setShowDebug(bool b)
+void ConfigMainWindow::setShowDebug(bool b)
{
@@ -976,3 +1069,3 @@ void ConfigView::setShowDebug(bool b)
-void ConfigView::setShowName(bool b)
+void ConfigMainWindow::setShowName(bool b)
{
@@ -984,3 +1077,3 @@ void ConfigView::setShowName(bool b)
-void ConfigView::setShowRange(bool b)
+void ConfigMainWindow::setShowRange(bool b)
{
@@ -992,3 +1085,3 @@ void ConfigView::setShowRange(bool b)
-void ConfigView::setShowData(bool b)
+void ConfigMainWindow::setShowData(bool b)
{
@@ -1004,3 +1097,3 @@ void ConfigView::setShowData(bool b)
*/
-void ConfigView::closeEvent(QCloseEvent* e)
+void ConfigMainWindow::closeEvent(QCloseEvent* e)
{
@@ -1027,2 +1120,27 @@ 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)
@@ -1040,3 +1158,3 @@ int main(int ac, char** av)
{
- ConfigView* v;
+ ConfigMainWindow* v;
const char *name;
@@ -1048,2 +1166,5 @@ 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] == '-') {
@@ -1065,3 +1186,4 @@ int main(int ac, char** av)
//zconfdump(stdout);
- v = new ConfigView();
+
+ v = new ConfigMainWindow();
@@ -1071,2 +1193,10 @@ int main(int ac, char** av)
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
@@ -7,5 +7,23 @@
-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;
+};
@@ -22,8 +40,11 @@ class ConfigList : public QListView {
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;
@@ -45,3 +66,2 @@ signals:
void parentSelected(void);
- void symbolChanged(ConfigItem* item);
void gotFocus(void);
@@ -102,4 +122,4 @@ class ConfigItem : public QListViewItem {
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)
{
@@ -107,4 +127,4 @@ public:
}
- 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)
{
@@ -118,2 +138,3 @@ public:
void updateMenu(void);
+ bool updateNeeded(void);
ConfigList* listView() const
@@ -148,5 +169,5 @@ public:
+ ConfigItem* nextItem;
struct menu *menu;
bool visible;
- bool doInit;
};
@@ -157,9 +178,11 @@ class ConfigLineEdit : public QLineEdit {
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);
@@ -169,6 +192,6 @@ public:
-class ConfigView : public QMainWindow {
+class ConfigMainWindow : public QMainWindow {
Q_OBJECT
public:
- ConfigView(void);
+ ConfigMainWindow(void);
public slots:
@@ -189,2 +212,4 @@ public slots:
void setShowData(bool);
+ void showIntro(void);
+ void showAbout(void);
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
@@ -151,3 +151,3 @@ void sym_calc_visibility(struct symbol *sym)
sym->visible = visible;
- sym->flags |= SYMBOL_CHANGED;
+ sym_set_changed(sym);
}
@@ -206,3 +206,4 @@ void sym_calc_value(struct symbol *sym)
}
- }
+ } else
+ S_TRI(newval) = S_TRI(sym->def);
} else
@@ -278,3 +279,3 @@ out:
if (memcmp(&oldval, &newval, sizeof(newval)))
- sym->flags |= SYMBOL_CHANGED;
+ sym_set_changed(sym);
sym->curr = newval;
@@ -284,4 +285,7 @@ out:
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);
+ }
}
@@ -299,2 +303,13 @@ 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)
@@ -305,3 +320,3 @@ void sym_set_all_changed(void)
for_all_symbols(i, sym)
- sym->flags |= SYMBOL_CHANGED;
+ sym_set_changed(sym);
}
@@ -342,3 +357,3 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val)
sym->flags &= ~SYMBOL_NEW;
- sym->flags |= SYMBOL_CHANGED;
+ sym_set_changed(sym);
}
@@ -462,3 +477,3 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
sym->flags &= ~SYMBOL_NEW;
- sym->flags |= SYMBOL_CHANGED;
+ sym_set_changed(sym);
}
@@ -527,3 +542,2 @@ struct symbol *sym_lookup(const char *name, int isconst)
- //printf("lookup: %s -> ", name);
if (name) {
@@ -543,6 +557,4 @@ struct symbol *sym_lookup(const char *name, int isconst)
if ((isconst && symbol->flags & SYMBOL_CONST) ||
- (!isconst && !(symbol->flags & SYMBOL_CONST))) {
- //printf("h:%p\n", symbol);
+ (!isconst && !(symbol->flags & SYMBOL_CONST)))
return symbol;
- }
}
@@ -566,3 +578,2 @@ struct symbol *sym_lookup(const char *name, int isconst)
- //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,2 +1,2 @@
-%option backup nostdinit noyywrap full ecs
+%option backup nostdinit noyywrap never-interactive full ecs
%option 8bit backup nodefault perf-report perf-report
@@ -9,2 +9,3 @@
+#include <limits.h>
#include <stdio.h>
@@ -16,3 +17,2 @@
#include "lkc.h"
-#include "zconf.tab.h"
@@ -85,4 +85,2 @@ n [A-Za-z0-9_]
unput(yytext[0]);
- //printf("new config: ");
- //symbol_end(NULL);
BEGIN(COMMAND);
@@ -145,3 +143,7 @@ n [A-Za-z0-9_]
}
+ \\\n current_file->lineno++;
.
+ <<EOF>> {
+ BEGIN(INITIAL);
+ }
}
@@ -149,5 +151,18 @@ n [A-Za-z0-9_]
<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);
+ }
\'|\" {
@@ -156,3 +171,2 @@ n [A-Za-z0-9_]
zconflval.string = text;
- //printf("s:%s\n", text);
return T_STRING;
@@ -161,12 +175,10 @@ n [A-Za-z0-9_]
}
- \\[ \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);
}
@@ -223,2 +235,3 @@ n [A-Za-z0-9_]
}
+ fclose(yyin);
yyterminate();
@@ -240,5 +253,30 @@ 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) {
@@ -247,3 +285,2 @@ void zconf_initscan(const char *name)
}
- //fprintf(stderr, "zconf_initscan: %s\n", name);
@@ -264,3 +301,3 @@ void zconf_nextfile(const char *name)
current_buf->state = YY_CURRENT_BUFFER;
- yyin = fopen(name, "r");
+ yyin = zconf_fopen(name);
if (!yyin) {
@@ -273,4 +310,2 @@ void zconf_nextfile(const char *name)
- //fprintf(stderr, "zconf_nextfile: %s\n", name);
-
if (file->flags & FILE_BUSY) {
@@ -299,2 +334,3 @@ static struct buffer *zconf_endfile(void)
if (parent) {
+ fclose(yyin);
yy_delete_buffer(YY_CURRENT_BUFFER);
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
@@ -229,6 +229,5 @@ 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());
@@ -247,3 +246,2 @@ if: T_IF expr
menu_add_entry(NULL);
- //current_entry->prompt = menu_add_prop(T_IF, NULL, NULL, $2);
menu_add_dep($2);