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,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();