mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-07-27 05:06:39 +00:00
Merge branch 'for-2010.11/kconfig-upgrade' of git://git.busybox.net/~tpetazzoni/git/buildroot
This commit is contained in:
commit
e62ed84b19
104
Makefile
104
Makefile
@ -25,12 +25,11 @@
|
|||||||
# absolute path
|
# absolute path
|
||||||
TOPDIR:=$(shell pwd)
|
TOPDIR:=$(shell pwd)
|
||||||
CONFIG_CONFIG_IN=Config.in
|
CONFIG_CONFIG_IN=Config.in
|
||||||
CONFIG_DEFCONFIG=.defconfig
|
|
||||||
CONFIG=package/config
|
CONFIG=package/config
|
||||||
DATE:=$(shell date +%Y%m%d)
|
DATE:=$(shell date +%Y%m%d)
|
||||||
|
|
||||||
noconfig_targets:=menuconfig gconfig xconfig config oldconfig randconfig \
|
noconfig_targets:=menuconfig nconfig gconfig xconfig config oldconfig randconfig \
|
||||||
defconfig allyesconfig allnoconfig release \
|
defconfig %_defconfig savedefconfig allyesconfig allnoconfig silentoldconfig release \
|
||||||
randpackageconfig allyespackageconfig allnopackageconfig \
|
randpackageconfig allyespackageconfig allnopackageconfig \
|
||||||
source-check help
|
source-check help
|
||||||
|
|
||||||
@ -323,17 +322,17 @@ TARGETS_ALL:=$(patsubst %,__real_tgt_%,$(TARGETS))
|
|||||||
# all targets depend on the crosscompiler and it's prerequisites
|
# all targets depend on the crosscompiler and it's prerequisites
|
||||||
$(TARGETS_ALL): __real_tgt_%: $(BASE_TARGETS) %
|
$(TARGETS_ALL): __real_tgt_%: $(BASE_TARGETS) %
|
||||||
|
|
||||||
$(BR2_DEPENDS_DIR): $(CONFIG_DIR)/.config
|
|
||||||
# rm -rf $@
|
|
||||||
# mkdir -p $(@D)
|
|
||||||
# cp -dpRf $(CONFIG)/buildroot-config $@
|
|
||||||
|
|
||||||
dirs: $(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \
|
dirs: $(DL_DIR) $(TOOLCHAIN_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) \
|
||||||
$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR)
|
$(HOST_DIR) $(BR2_DEPENDS_DIR) $(BINARIES_DIR) $(STAMP_DIR)
|
||||||
|
|
||||||
$(BASE_TARGETS): dirs
|
$(BASE_TARGETS): dirs
|
||||||
|
|
||||||
world: dependencies dirs $(BASE_TARGETS) $(TARGETS_ALL)
|
$(BUILD_DIR)/buildroot-config/auto.conf: $(CONFIG_DIR)/.config
|
||||||
|
$(MAKE) $(EXTRAMAKEARGS) silentoldconfig
|
||||||
|
|
||||||
|
prepare: $(BUILD_DIR)/buildroot-config/auto.conf
|
||||||
|
|
||||||
|
world: prepare dependencies dirs $(BASE_TARGETS) $(TARGETS_ALL)
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all world dirs clean distclean source \
|
.PHONY: all world dirs clean distclean source \
|
||||||
@ -468,99 +467,98 @@ export HOSTCFLAGS
|
|||||||
|
|
||||||
$(BUILD_DIR)/buildroot-config/%onf:
|
$(BUILD_DIR)/buildroot-config/%onf:
|
||||||
mkdir -p $(@D)/lxdialog
|
mkdir -p $(@D)/lxdialog
|
||||||
$(MAKE) CC="$(HOSTCC)" obj=$(@D) -C $(CONFIG) $(@F)
|
$(MAKE) CC="$(HOSTCC)" obj=$(@D) -C $(CONFIG) -f Makefile.br $(@F)
|
||||||
-@if [ ! -f $(CONFIG_DIR)/.config ]; then \
|
|
||||||
cp $(CONFIG_DEFCONFIG) $(CONFIG_DIR)/.config; \
|
COMMON_CONFIG_ENV = \
|
||||||
fi
|
KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
||||||
|
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
||||||
|
KCONFIG_TRISTATE=$(BUILD_DIR)/buildroot-config/tristate.config \
|
||||||
|
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config
|
||||||
|
|
||||||
xconfig: $(BUILD_DIR)/buildroot-config/qconf
|
xconfig: $(BUILD_DIR)/buildroot-config/qconf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@if ! KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@if ! $(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN); then \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< $(CONFIG_CONFIG_IN); then \
|
|
||||||
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
gconfig: $(BUILD_DIR)/buildroot-config/gconf
|
gconfig: $(BUILD_DIR)/buildroot-config/gconf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@if ! KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@if ! $(COMMON_CONFIG_ENV) srctree=$(TOPDIR) \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
$< $(CONFIG_CONFIG_IN); then \
|
||||||
srctree=$(TOPDIR) \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< $(CONFIG_CONFIG_IN); then \
|
|
||||||
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
menuconfig: $(BUILD_DIR)/buildroot-config/mconf
|
menuconfig: $(BUILD_DIR)/buildroot-config/mconf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@if ! KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@if ! $(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN); then \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< $(CONFIG_CONFIG_IN); then \
|
fi
|
||||||
|
|
||||||
|
nconfig: $(BUILD_DIR)/buildroot-config/nconf
|
||||||
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
|
@if ! $(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN); then \
|
||||||
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
test -f $(CONFIG_DIR)/.config.cmd || rm -f $(CONFIG_DIR)/.config; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
config: $(BUILD_DIR)/buildroot-config/conf
|
config: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< $(CONFIG_CONFIG_IN)
|
|
||||||
|
|
||||||
oldconfig: $(BUILD_DIR)/buildroot-config/conf
|
oldconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
mkdir -p $(BUILD_DIR)/buildroot-config
|
mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< --oldconfig $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -o $(CONFIG_CONFIG_IN)
|
|
||||||
|
|
||||||
randconfig: $(BUILD_DIR)/buildroot-config/conf
|
randconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< --randconfig $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -r $(CONFIG_CONFIG_IN)
|
|
||||||
|
|
||||||
allyesconfig: $(BUILD_DIR)/buildroot-config/conf
|
allyesconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
cat $(CONFIG_DEFCONFIG) > $(CONFIG_DIR)/.config
|
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< --allyesconfig $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -y $(CONFIG_CONFIG_IN)
|
|
||||||
|
|
||||||
allnoconfig: $(BUILD_DIR)/buildroot-config/conf
|
allnoconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< --allnoconfig $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -n $(CONFIG_CONFIG_IN)
|
|
||||||
|
|
||||||
randpackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
randpackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -r $(CONFIG_CONFIG_IN)
|
$< --randconfig $(CONFIG_CONFIG_IN)
|
||||||
@rm -f $(CONFIG_DIR)/.config.nopkg
|
@rm -f $(CONFIG_DIR)/.config.nopkg
|
||||||
|
|
||||||
allyespackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
allyespackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -y $(CONFIG_CONFIG_IN)
|
$< --allyesconfig $(CONFIG_CONFIG_IN)
|
||||||
@rm -f $(CONFIG_DIR)/.config.nopkg
|
@rm -f $(CONFIG_DIR)/.config.nopkg
|
||||||
|
|
||||||
allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
allnopackageconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
@grep -v BR2_PACKAGE_ $(CONFIG_DIR)/.config > $(CONFIG_DIR)/.config.nopkg
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) \
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
KCONFIG_ALLCONFIG=$(CONFIG_DIR)/.config.nopkg \
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -n $(CONFIG_CONFIG_IN)
|
$< --allnoconfig $(CONFIG_CONFIG_IN)
|
||||||
@rm -f $(CONFIG_DIR)/.config.nopkg
|
@rm -f $(CONFIG_DIR)/.config.nopkg
|
||||||
|
|
||||||
|
silentoldconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
|
$(COMMON_CONFIG_ENV) $< --silentoldconfig $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
defconfig: $(BUILD_DIR)/buildroot-config/conf
|
defconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
@mkdir -p $(BUILD_DIR)/buildroot-config
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
@KCONFIG_AUTOCONFIG=$(BUILD_DIR)/buildroot-config/auto.conf \
|
@$(COMMON_CONFIG_ENV) $< --defconfig $(CONFIG_CONFIG_IN)
|
||||||
KCONFIG_AUTOHEADER=$(BUILD_DIR)/buildroot-config/autoconf.h \
|
|
||||||
BUILDROOT_CONFIG=$(CONFIG_DIR)/.config $< -d $(CONFIG_CONFIG_IN)
|
%_defconfig: $(BUILD_DIR)/buildroot-config/conf $(TOPDIR)/configs/%_defconfig
|
||||||
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
|
@$(COMMON_CONFIG_ENV) $< --defconfig=$(TOPDIR)/configs/$@ $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
savedefconfig: $(BUILD_DIR)/buildroot-config/conf
|
||||||
|
@mkdir -p $(BUILD_DIR)/buildroot-config
|
||||||
|
@$(COMMON_CONFIG_ENV) $< --savedefconfig=$(TOPDIR)/defconfig $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
# check if download URLs are outdated
|
# check if download URLs are outdated
|
||||||
source-check: allyesconfig
|
source-check: allyesconfig
|
||||||
@ -589,10 +587,6 @@ endif
|
|||||||
flush:
|
flush:
|
||||||
rm -f $(BUILD_DIR)/tgt-config.cache $(BUILD_DIR)/host-config.cache
|
rm -f $(BUILD_DIR)/tgt-config.cache $(BUILD_DIR)/host-config.cache
|
||||||
|
|
||||||
%_defconfig: $(TOPDIR)/configs/%_defconfig
|
|
||||||
cp $^ $(CONFIG_DIR)/.config
|
|
||||||
@$(MAKE) $(EXTRAMAKEARGS) oldconfig
|
|
||||||
|
|
||||||
configured: dirs host-sed kernel-headers uclibc-config busybox-config linux26-config
|
configured: dirs host-sed kernel-headers uclibc-config busybox-config linux26-config
|
||||||
|
|
||||||
prepatch: gcc-patched binutils-patched gdb-patched uclibc-patched
|
prepatch: gcc-patched binutils-patched gdb-patched uclibc-patched
|
||||||
|
37
package/config/.gitignore
vendored
37
package/config/.gitignore
vendored
@ -1,9 +1,28 @@
|
|||||||
/conf
|
#
|
||||||
/mconf
|
# Generated files
|
||||||
/qconf
|
#
|
||||||
/qconf.moc
|
config*
|
||||||
/.tmp_qtcheck
|
lex.*.c
|
||||||
/lkc_defs.h
|
*.tab.c
|
||||||
/lex.zconf.c
|
*.tab.h
|
||||||
/zconf.hash.c
|
zconf.hash.c
|
||||||
/zconf.tab.c
|
*.moc
|
||||||
|
lkc_defs.h
|
||||||
|
gconf.glade.h
|
||||||
|
*.pot
|
||||||
|
*.mo
|
||||||
|
|
||||||
|
#
|
||||||
|
# configuration programs
|
||||||
|
#
|
||||||
|
conf
|
||||||
|
mconf
|
||||||
|
nconf
|
||||||
|
qconf
|
||||||
|
gconf
|
||||||
|
kxgettext
|
||||||
|
|
||||||
|
#
|
||||||
|
# Quilt is being used to handle the patch series
|
||||||
|
#
|
||||||
|
.pc
|
||||||
|
@ -1,53 +1,365 @@
|
|||||||
src := .
|
# ===========================================================================
|
||||||
top_srcdir=../../
|
# Kernel configuration targets
|
||||||
top_builddir=../../
|
# These targets are used from top-level makefile
|
||||||
srctree := .
|
|
||||||
obj ?= .
|
|
||||||
|
|
||||||
include Makefile.kconfig
|
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config \
|
||||||
#HOSTCFLAGS+=-Dinline="" -include foo.h
|
localmodconfig localyesconfig
|
||||||
-include $(obj)/.depend
|
|
||||||
$(obj)/.depend: $(wildcard *.h *.c)
|
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) -MM *.c > $@ 2>/dev/null || :
|
|
||||||
|
|
||||||
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
|
ifdef KBUILD_KCONFIG
|
||||||
host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m)))
|
Kconfig := $(KBUILD_KCONFIG)
|
||||||
host-cmulti := $(foreach m,$(__hostprogs),\
|
else
|
||||||
$(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
|
Kconfig := arch/$(SRCARCH)/Kconfig
|
||||||
host-cxxmulti := $(foreach m,$(__hostprogs),\
|
endif
|
||||||
$(if $($(m)-cxxobjs),$(m),$(if $($(m)-objs),)))
|
|
||||||
host-cobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-objs))))
|
|
||||||
host-cxxobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-cxxobjs))))
|
|
||||||
|
|
||||||
HOST_EXTRACFLAGS += -I$(obj)
|
xconfig: $(obj)/qconf
|
||||||
|
$< $(Kconfig)
|
||||||
|
|
||||||
$(host-csingle): %: %.c
|
gconfig: $(obj)/gconf
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $< $(HOST_LOADLIBES) -o $(obj)/$@
|
$< $(Kconfig)
|
||||||
|
|
||||||
$(host-cmulti): %: $(host-cobjs) $(host-cshlib)
|
menuconfig: $(obj)/mconf
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs)) $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
$< $(Kconfig)
|
||||||
|
|
||||||
$(host-cxxmulti): %: $(host-cxxobjs) $(host-cobjs) $(host-cshlib)
|
config: $(obj)/conf
|
||||||
$(HOSTCXX) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs) $($(@F)-cxxobjs)) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
$< --oldaskconfig $(Kconfig)
|
||||||
|
|
||||||
$(obj)/%.o: %.c
|
nconfig: $(obj)/nconf
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
$< $(Kconfig)
|
||||||
|
|
||||||
$(obj)/%.o: $(obj)/%.c
|
oldconfig: $(obj)/conf
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
$(obj)/%.o: %.cc
|
silentoldconfig: $(obj)/conf
|
||||||
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$(@F)) -c $< -o $@
|
$(Q)mkdir -p include/generated
|
||||||
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
$(obj)/%:: $(src)/%_shipped
|
# if no path is given, then use src directory to find file
|
||||||
$(Q)cat $< > $@
|
ifdef LSMOD
|
||||||
|
LSMOD_F := $(LSMOD)
|
||||||
|
ifeq ($(findstring /,$(LSMOD)),)
|
||||||
|
LSMOD_F := $(objtree)/$(LSMOD)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
clean:
|
localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
$(Q)rm -f $(addprefix $(obj)/,$(clean-files))
|
$(Q)mkdir -p include/generated
|
||||||
distclean: clean
|
$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
|
||||||
$(Q)rm -f $(addprefix $(obj)/,$(lxdialog) $(conf-objs) $(mconf-objs) $(kxgettext-objs) \
|
$(Q)if [ -f .config ]; then \
|
||||||
$(hostprogs-y) $(qconf-cxxobjs) $(qconf-objs) $(gconf-objs) \
|
cmp -s .tmp.config .config || \
|
||||||
mconf .depend)
|
(mv -f .config .config.old.1; \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
mv -f .config.old.1 .config.old) \
|
||||||
|
else \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
FORCE:
|
localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||||
.PHONY: FORCE clean distclean
|
$(Q)mkdir -p include/generated
|
||||||
|
$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
|
||||||
|
$(Q)sed -i s/=m/=y/ .tmp.config
|
||||||
|
$(Q)if [ -f .config ]; then \
|
||||||
|
cmp -s .tmp.config .config || \
|
||||||
|
(mv -f .config .config.old.1; \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
mv -f .config.old.1 .config.old) \
|
||||||
|
else \
|
||||||
|
mv -f .tmp.config .config; \
|
||||||
|
$(obj)/conf --silentoldconfig $(Kconfig); \
|
||||||
|
fi
|
||||||
|
$(Q)rm -f .tmp.config
|
||||||
|
|
||||||
|
# Create new linux.pot file
|
||||||
|
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
||||||
|
# The symlink is used to repair a deficiency in arch/um
|
||||||
|
update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
|
||||||
|
$(Q)echo " GEN config"
|
||||||
|
$(Q)xgettext --default-domain=linux \
|
||||||
|
--add-comments --keyword=_ --keyword=N_ \
|
||||||
|
--from-code=UTF-8 \
|
||||||
|
--files-from=scripts/kconfig/POTFILES.in \
|
||||||
|
--output $(obj)/config.pot
|
||||||
|
$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
|
||||||
|
$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
|
||||||
|
$(Q)(for i in `ls arch/*/Kconfig`; \
|
||||||
|
do \
|
||||||
|
echo " GEN $$i"; \
|
||||||
|
$(obj)/kxgettext $$i \
|
||||||
|
>> $(obj)/config.pot; \
|
||||||
|
done )
|
||||||
|
$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
||||||
|
--output $(obj)/linux.pot
|
||||||
|
$(Q)rm -f arch/um/Kconfig.arch
|
||||||
|
$(Q)rm -f $(obj)/config.pot
|
||||||
|
|
||||||
|
PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig
|
||||||
|
|
||||||
|
allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf
|
||||||
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
|
PHONY += listnewconfig oldnoconfig savedefconfig defconfig
|
||||||
|
|
||||||
|
listnewconfig oldnoconfig: $(obj)/conf
|
||||||
|
$< --$@ $(Kconfig)
|
||||||
|
|
||||||
|
savedefconfig: $(obj)/conf
|
||||||
|
$< --$@=defconfig $(Kconfig)
|
||||||
|
|
||||||
|
defconfig: $(obj)/conf
|
||||||
|
ifeq ($(KBUILD_DEFCONFIG),)
|
||||||
|
$< --defconfig $(Kconfig)
|
||||||
|
else
|
||||||
|
@echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
|
||||||
|
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
||||||
|
endif
|
||||||
|
|
||||||
|
%_defconfig: $(obj)/conf
|
||||||
|
$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||||
|
|
||||||
|
# Help text used by make help
|
||||||
|
help:
|
||||||
|
@echo ' config - Update current config utilising a line-oriented program'
|
||||||
|
@echo ' nconfig - Update current config utilising a ncurses menu based program'
|
||||||
|
@echo ' menuconfig - Update current config utilising a menu based program'
|
||||||
|
@echo ' xconfig - Update current config utilising a QT based front-end'
|
||||||
|
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
||||||
|
@echo ' oldconfig - Update current config utilising a provided .config as base'
|
||||||
|
@echo ' localmodconfig - Update current config disabling modules not loaded'
|
||||||
|
@echo ' localyesconfig - Update current config converting local mods to core'
|
||||||
|
@echo ' silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
|
||||||
|
@echo ' defconfig - New config with default from ARCH supplied defconfig'
|
||||||
|
@echo ' savedefconfig - Save current config as ./defconfig (minimal config)'
|
||||||
|
@echo ' allnoconfig - New config where all options are answered with no'
|
||||||
|
@echo ' allyesconfig - New config where all options are accepted with yes'
|
||||||
|
@echo ' allmodconfig - New config selecting modules when possible'
|
||||||
|
@echo ' alldefconfig - New config with all symbols set to default'
|
||||||
|
@echo ' randconfig - New config with random answer to all options'
|
||||||
|
@echo ' listnewconfig - List new options'
|
||||||
|
@echo ' oldnoconfig - Same as silentoldconfig but set new symbols to n (unset)'
|
||||||
|
|
||||||
|
# lxdialog stuff
|
||||||
|
check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
|
||||||
|
|
||||||
|
# Use recursively expanded variables so we do not call gcc unless
|
||||||
|
# we really need to do so. (Do not call gcc as part of make mrproper)
|
||||||
|
HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
|
||||||
|
HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
|
||||||
|
|
||||||
|
HOST_EXTRACFLAGS += -DLOCALE
|
||||||
|
|
||||||
|
|
||||||
|
# ===========================================================================
|
||||||
|
# Shared Makefile for the various kconfig executables:
|
||||||
|
# conf: Used for defconfig, oldconfig and related targets
|
||||||
|
# nconf: Used for the nconfig target.
|
||||||
|
# Utilizes ncurses
|
||||||
|
# mconf: Used for the menuconfig target
|
||||||
|
# Utilizes the lxdialog package
|
||||||
|
# qconf: Used for the xconfig target
|
||||||
|
# Based on QT which needs to be installed to compile it
|
||||||
|
# gconf: Used for the gconfig target
|
||||||
|
# Based on GTK which needs to be installed to compile it
|
||||||
|
# object files used by all kconfig flavours
|
||||||
|
|
||||||
|
lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
|
||||||
|
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
|
||||||
|
|
||||||
|
conf-objs := conf.o zconf.tab.o
|
||||||
|
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
||||||
|
nconf-objs := nconf.o zconf.tab.o nconf.gui.o
|
||||||
|
kxgettext-objs := kxgettext.o zconf.tab.o
|
||||||
|
|
||||||
|
hostprogs-y := conf qconf gconf kxgettext
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),nconfig)
|
||||||
|
hostprogs-y += nconf
|
||||||
|
endif
|
||||||
|
ifeq ($(findstring nconf,$(MAKECMDGOALS)),nconf)
|
||||||
|
hostprogs-y += nconf
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),menuconfig)
|
||||||
|
hostprogs-y += mconf
|
||||||
|
endif
|
||||||
|
ifeq ($(findstring mconf,$(MAKECMDGOALS)),mconf)
|
||||||
|
hostprogs-y += mconf
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),xconfig)
|
||||||
|
qconf-target := 1
|
||||||
|
endif
|
||||||
|
ifeq ($(findstring qconf,$(MAKECMDGOALS)),qconf)
|
||||||
|
qconf-target := 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),gconfig)
|
||||||
|
gconf-target := 1
|
||||||
|
endif
|
||||||
|
ifeq ($(findstring gconf,$(MAKECMDGOALS)),gconf)
|
||||||
|
gconf-target := 1
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(qconf-target),1)
|
||||||
|
qconf-cxxobjs := qconf.o
|
||||||
|
qconf-objs := kconfig_load.o zconf.tab.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(gconf-target),1)
|
||||||
|
gconf-objs := gconf.o kconfig_load.o zconf.tab.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||||
|
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
||||||
|
clean-files += config.pot linux.pot
|
||||||
|
clean-files += conf $(conf-objs)
|
||||||
|
clean-files += mconf $(mconf-objs)
|
||||||
|
clean-files += nconf $(nconf-objs)
|
||||||
|
clean-files += qconf qconf.o
|
||||||
|
clean-files += gconf gconf.o
|
||||||
|
clean-files += kconfig_load.o zconf.tab.o
|
||||||
|
clean-files += $(kxgettext-objs)
|
||||||
|
|
||||||
|
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
||||||
|
PHONY += $(obj)/dochecklxdialog
|
||||||
|
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
|
||||||
|
$(obj)/dochecklxdialog:
|
||||||
|
$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)
|
||||||
|
|
||||||
|
always := dochecklxdialog
|
||||||
|
|
||||||
|
# Add environment specific flags
|
||||||
|
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
|
||||||
|
|
||||||
|
# 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 = $(KC_QT_LIBS) -ldl
|
||||||
|
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
|
||||||
|
|
||||||
|
HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
|
||||||
|
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
||||||
|
-D LKC_DIRECT_LINK
|
||||||
|
|
||||||
|
HOSTLOADLIBES_nconf = -lmenu -lpanel -lncurses
|
||||||
|
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
||||||
|
|
||||||
|
ifeq ($(qconf-target),1)
|
||||||
|
$(obj)/.tmp_qtcheck: $(src)/Makefile
|
||||||
|
-include $(obj)/.tmp_qtcheck
|
||||||
|
|
||||||
|
# QT needs some extra effort...
|
||||||
|
$(obj)/.tmp_qtcheck:
|
||||||
|
@set -e; echo " CHECK qt"; dir=""; pkg=""; \
|
||||||
|
pkg-config --exists qt 2> /dev/null && pkg=qt; \
|
||||||
|
pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt; \
|
||||||
|
if [ -n "$$pkg" ]; then \
|
||||||
|
cflags="\$$(shell pkg-config $$pkg --cflags)"; \
|
||||||
|
libs="\$$(shell pkg-config $$pkg --libs)"; \
|
||||||
|
moc="\$$(shell pkg-config $$pkg --variable=prefix)/bin/moc"; \
|
||||||
|
dir="$$(pkg-config $$pkg --variable=prefix)"; \
|
||||||
|
else \
|
||||||
|
for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
|
||||||
|
if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi; \
|
||||||
|
done; \
|
||||||
|
if [ -z "$$dir" ]; then \
|
||||||
|
echo "*"; \
|
||||||
|
echo "* Unable to find the QT3 installation. Please make sure that"; \
|
||||||
|
echo "* the QT3 development package is correctly installed and"; \
|
||||||
|
echo "* either install pkg-config or set the QTDIR environment"; \
|
||||||
|
echo "* variable to the correct location."; \
|
||||||
|
echo "*"; \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
libpath=$$dir/lib; lib=qt; osdir=""; \
|
||||||
|
$(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
|
||||||
|
osdir=x$$($(HOSTCXX) -print-multi-os-directory); \
|
||||||
|
test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir; \
|
||||||
|
test -f $$libpath/libqt-mt.so && lib=qt-mt; \
|
||||||
|
cflags="-I$$dir/include"; \
|
||||||
|
libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib"; \
|
||||||
|
moc="$$dir/bin/moc"; \
|
||||||
|
fi; \
|
||||||
|
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 "*"; \
|
||||||
|
moc="/usr/bin/moc"; \
|
||||||
|
fi; \
|
||||||
|
echo "KC_QT_CFLAGS=$$cflags" > $@; \
|
||||||
|
echo "KC_QT_LIBS=$$libs" >> $@; \
|
||||||
|
echo "KC_QT_MOC=$$moc" >> $@
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
|
||||||
|
|
||||||
|
ifeq ($(gconf-target),1)
|
||||||
|
-include $(obj)/.tmp_gtkcheck
|
||||||
|
|
||||||
|
# GTK needs some extra effort, too...
|
||||||
|
$(obj)/.tmp_gtkcheck:
|
||||||
|
@if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then \
|
||||||
|
if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then \
|
||||||
|
touch $@; \
|
||||||
|
else \
|
||||||
|
echo "*"; \
|
||||||
|
echo "* GTK+ is present but version >= 2.0.0 is required."; \
|
||||||
|
echo "*"; \
|
||||||
|
false; \
|
||||||
|
fi \
|
||||||
|
else \
|
||||||
|
echo "*"; \
|
||||||
|
echo "* Unable to find the GTK+ installation. Please make sure that"; \
|
||||||
|
echo "* the GTK+ 2.0 development package is correctly installed..."; \
|
||||||
|
echo "* You need gtk+-2.0, glib-2.0 and libglade-2.0."; \
|
||||||
|
echo "*"; \
|
||||||
|
false; \
|
||||||
|
fi
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(obj)/zconf.tab.o: $(obj)/lex.zconf.c $(obj)/zconf.hash.c
|
||||||
|
|
||||||
|
$(obj)/kconfig_load.o: $(obj)/lkc_defs.h
|
||||||
|
|
||||||
|
$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
|
||||||
|
|
||||||
|
$(obj)/gconf.o: $(obj)/lkc_defs.h
|
||||||
|
|
||||||
|
$(obj)/%.moc: $(src)/%.h
|
||||||
|
$(KC_QT_MOC) -i $< -o $@
|
||||||
|
|
||||||
|
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
|
||||||
|
sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
|
||||||
|
|
||||||
|
# Extract gconf menu items for I18N support
|
||||||
|
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
||||||
|
intltool-extract --type=gettext/glade $(obj)/gconf.glade
|
||||||
|
|
||||||
|
###
|
||||||
|
# The following requires flex/bison/gperf
|
||||||
|
# By default we use the _shipped versions, uncomment the following line if
|
||||||
|
# you are modifying the flex/bison src.
|
||||||
|
# LKC_GENPARSER := 1
|
||||||
|
|
||||||
|
ifdef LKC_GENPARSER
|
||||||
|
|
||||||
|
$(obj)/zconf.tab.c: $(src)/zconf.y
|
||||||
|
$(obj)/lex.zconf.c: $(src)/zconf.l
|
||||||
|
$(obj)/zconf.hash.c: $(src)/zconf.gperf
|
||||||
|
|
||||||
|
%.tab.c: %.y
|
||||||
|
bison -l -b $* -p $(notdir $*) $<
|
||||||
|
cp $@ $@_shipped
|
||||||
|
|
||||||
|
lex.%.c: %.l
|
||||||
|
flex -L -P$(notdir $*) -o$@ $<
|
||||||
|
cp $@ $@_shipped
|
||||||
|
|
||||||
|
%.hash.c: %.gperf
|
||||||
|
gperf < $< > $@
|
||||||
|
cp $@ $@_shipped
|
||||||
|
|
||||||
|
endif
|
||||||
|
53
package/config/Makefile.br
Normal file
53
package/config/Makefile.br
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
src := .
|
||||||
|
top_srcdir=../../
|
||||||
|
top_builddir=../../
|
||||||
|
srctree := .
|
||||||
|
obj ?= .
|
||||||
|
|
||||||
|
include Makefile
|
||||||
|
#HOSTCFLAGS+=-Dinline="" -include foo.h
|
||||||
|
-include $(obj)/.depend
|
||||||
|
$(obj)/.depend: $(wildcard *.h *.c)
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) -MM *.c > $@ 2>/dev/null || :
|
||||||
|
|
||||||
|
__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
|
||||||
|
host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m)))
|
||||||
|
host-cmulti := $(foreach m,$(__hostprogs),\
|
||||||
|
$(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
|
||||||
|
host-cxxmulti := $(foreach m,$(__hostprogs),\
|
||||||
|
$(if $($(m)-cxxobjs),$(m),$(if $($(m)-objs),)))
|
||||||
|
host-cobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-objs))))
|
||||||
|
host-cxxobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-cxxobjs))))
|
||||||
|
|
||||||
|
HOST_EXTRACFLAGS += -I$(obj)
|
||||||
|
|
||||||
|
$(host-csingle): %: %.c
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $< $(HOST_LOADLIBES) -o $(obj)/$@
|
||||||
|
|
||||||
|
$(host-cmulti): %: $(host-cobjs) $(host-cshlib)
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs)) $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
||||||
|
|
||||||
|
$(host-cxxmulti): %: $(host-cxxobjs) $(host-cobjs) $(host-cshlib)
|
||||||
|
$(HOSTCXX) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs) $($(@F)-cxxobjs)) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
||||||
|
|
||||||
|
$(obj)/%.o: %.c
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
||||||
|
|
||||||
|
$(obj)/%.o: $(obj)/%.c
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
||||||
|
|
||||||
|
$(obj)/%.o: %.cc
|
||||||
|
$(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$(@F)) -c $< -o $@
|
||||||
|
|
||||||
|
$(obj)/%:: $(src)/%_shipped
|
||||||
|
$(Q)cat $< > $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(Q)rm -f $(addprefix $(obj)/,$(clean-files))
|
||||||
|
distclean: clean
|
||||||
|
$(Q)rm -f $(addprefix $(obj)/,$(lxdialog) $(conf-objs) $(mconf-objs) $(kxgettext-objs) \
|
||||||
|
$(hostprogs-y) $(qconf-cxxobjs) $(qconf-objs) $(gconf-objs) \
|
||||||
|
mconf .depend)
|
||||||
|
|
||||||
|
FORCE:
|
||||||
|
.PHONY: FORCE clean distclean
|
@ -1,303 +0,0 @@
|
|||||||
# ===========================================================================
|
|
||||||
# Kernel configuration targets
|
|
||||||
# These targets are used from top-level makefile
|
|
||||||
|
|
||||||
PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config
|
|
||||||
|
|
||||||
ifdef KBUILD_KCONFIG
|
|
||||||
Kconfig := $(KBUILD_KCONFIG)
|
|
||||||
else
|
|
||||||
Kconfig := arch/$(SRCARCH)/Kconfig
|
|
||||||
endif
|
|
||||||
|
|
||||||
xconfig: $(obj)/qconf
|
|
||||||
$< $(Kconfig)
|
|
||||||
|
|
||||||
gconfig: $(obj)/gconf
|
|
||||||
$< $(Kconfig)
|
|
||||||
|
|
||||||
menuconfig: $(obj)/mconf
|
|
||||||
$< $(Kconfig)
|
|
||||||
|
|
||||||
config: $(obj)/conf
|
|
||||||
$< $(Kconfig)
|
|
||||||
|
|
||||||
oldconfig: $(obj)/conf
|
|
||||||
$< -o $(Kconfig)
|
|
||||||
|
|
||||||
silentoldconfig: $(obj)/conf
|
|
||||||
$< -s $(Kconfig)
|
|
||||||
|
|
||||||
# Create new linux.pot file
|
|
||||||
# Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
|
|
||||||
# The symlink is used to repair a deficiency in arch/um
|
|
||||||
update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
|
|
||||||
$(Q)echo " GEN config"
|
|
||||||
$(Q)xgettext --default-domain=linux \
|
|
||||||
--add-comments --keyword=_ --keyword=N_ \
|
|
||||||
--from-code=UTF-8 \
|
|
||||||
--files-from=scripts/kconfig/POTFILES.in \
|
|
||||||
--output $(obj)/config.pot
|
|
||||||
$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
|
|
||||||
$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
|
|
||||||
$(Q)(for i in `ls arch/*/Kconfig`; \
|
|
||||||
do \
|
|
||||||
echo " GEN $$i"; \
|
|
||||||
$(obj)/kxgettext $$i \
|
|
||||||
>> $(obj)/config.pot; \
|
|
||||||
done )
|
|
||||||
$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
|
|
||||||
--output $(obj)/linux.pot
|
|
||||||
$(Q)rm -f arch/um/Kconfig.arch
|
|
||||||
$(Q)rm -f $(obj)/config.pot
|
|
||||||
|
|
||||||
PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
|
|
||||||
|
|
||||||
randconfig: $(obj)/conf
|
|
||||||
$< -r $(Kconfig)
|
|
||||||
|
|
||||||
allyesconfig: $(obj)/conf
|
|
||||||
$< -y $(Kconfig)
|
|
||||||
|
|
||||||
allnoconfig: $(obj)/conf
|
|
||||||
$< -n $(Kconfig)
|
|
||||||
|
|
||||||
allmodconfig: $(obj)/conf
|
|
||||||
$< -m $(Kconfig)
|
|
||||||
|
|
||||||
defconfig: $(obj)/conf
|
|
||||||
ifeq ($(KBUILD_DEFCONFIG),)
|
|
||||||
$< -d $(Kconfig)
|
|
||||||
else
|
|
||||||
@echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
|
|
||||||
$(Q)$< -D arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
|
||||||
endif
|
|
||||||
|
|
||||||
%_defconfig: $(obj)/conf
|
|
||||||
$(Q)$< -D arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
|
||||||
|
|
||||||
# Help text used by make help
|
|
||||||
help:
|
|
||||||
@echo ' config - Update current config utilising a line-oriented program'
|
|
||||||
@echo ' menuconfig - Update current config utilising a menu based program'
|
|
||||||
@echo ' xconfig - Update current config utilising a QT based front-end'
|
|
||||||
@echo ' gconfig - Update current config utilising a GTK based front-end'
|
|
||||||
@echo ' oldconfig - Update current config utilising a provided .config as base'
|
|
||||||
@echo ' silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
|
|
||||||
@echo ' randconfig - New config with random answer to all options'
|
|
||||||
@echo ' defconfig - New config with default answer to all options'
|
|
||||||
@echo ' allmodconfig - New config selecting modules when possible'
|
|
||||||
@echo ' allyesconfig - New config where all options are accepted with yes'
|
|
||||||
@echo ' allnoconfig - New config where all options are answered with no'
|
|
||||||
|
|
||||||
# lxdialog stuff
|
|
||||||
check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
|
|
||||||
|
|
||||||
# Use recursively expanded variables so we do not call gcc unless
|
|
||||||
# we really need to do so. (Do not call gcc as part of make mrproper)
|
|
||||||
HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
|
|
||||||
HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
|
|
||||||
|
|
||||||
HOST_EXTRACFLAGS += -DLOCALE
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================================
|
|
||||||
# Shared Makefile for the various kconfig executables:
|
|
||||||
# conf: Used for defconfig, oldconfig and related targets
|
|
||||||
# mconf: Used for the menuconfig target
|
|
||||||
# Utilizes the lxdialog package
|
|
||||||
# qconf: Used for the xconfig target
|
|
||||||
# Based on QT which needs to be installed to compile it
|
|
||||||
# gconf: Used for the gconfig target
|
|
||||||
# Based on GTK which needs to be installed to compile it
|
|
||||||
# object files used by all kconfig flavours
|
|
||||||
|
|
||||||
lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
|
|
||||||
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
|
|
||||||
|
|
||||||
conf-objs := conf.o zconf.tab.o
|
|
||||||
mconf-objs := mconf.o zconf.tab.o $(lxdialog)
|
|
||||||
kxgettext-objs := kxgettext.o zconf.tab.o
|
|
||||||
|
|
||||||
hostprogs-y := conf qconf gconf kxgettext
|
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),menuconfig)
|
|
||||||
hostprogs-y += mconf
|
|
||||||
endif
|
|
||||||
ifeq ($(findstring mconf,$(MAKECMDGOALS)),mconf)
|
|
||||||
hostprogs-y += mconf
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),xconfig)
|
|
||||||
qconf-target := 1
|
|
||||||
endif
|
|
||||||
ifeq ($(findstring qconf,$(MAKECMDGOALS)),qconf)
|
|
||||||
qconf-target := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),gconfig)
|
|
||||||
gconf-target := 1
|
|
||||||
endif
|
|
||||||
ifeq ($(findstring gconf,$(MAKECMDGOALS)),gconf)
|
|
||||||
gconf-target := 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(qconf-target),1)
|
|
||||||
qconf-cxxobjs := qconf.o
|
|
||||||
qconf-objs := kconfig_load.o zconf.tab.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(gconf-target),1)
|
|
||||||
gconf-objs := gconf.o kconfig_load.o zconf.tab.o
|
|
||||||
endif
|
|
||||||
|
|
||||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
|
||||||
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
|
||||||
clean-files += config.pot linux.pot
|
|
||||||
clean-files += conf $(conf-objs)
|
|
||||||
clean-files += mconf $(mconf-objs)
|
|
||||||
clean-files += qconf qconf.o
|
|
||||||
clean-files += gconf gconf.o
|
|
||||||
clean-files += kconfig_load.o zconf.tab.o
|
|
||||||
clean-files += $(kxgettext-objs)
|
|
||||||
|
|
||||||
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
|
||||||
PHONY += $(obj)/dochecklxdialog
|
|
||||||
$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
|
|
||||||
$(obj)/dochecklxdialog:
|
|
||||||
$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)
|
|
||||||
|
|
||||||
always := dochecklxdialog
|
|
||||||
|
|
||||||
# Add environment specific flags
|
|
||||||
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
|
|
||||||
|
|
||||||
# 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 = $(KC_QT_LIBS) -ldl
|
|
||||||
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
|
|
||||||
|
|
||||||
HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
|
|
||||||
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
|
|
||||||
-D LKC_DIRECT_LINK
|
|
||||||
|
|
||||||
$(obj)/qconf.o: $(obj)/.tmp_qtcheck
|
|
||||||
|
|
||||||
ifeq ($(qconf-target),1)
|
|
||||||
$(obj)/.tmp_qtcheck: $(src)/Makefile
|
|
||||||
-include $(obj)/.tmp_qtcheck
|
|
||||||
|
|
||||||
# QT needs some extra effort...
|
|
||||||
$(obj)/.tmp_qtcheck:
|
|
||||||
@set -e; echo " CHECK qt"; dir=""; pkg=""; \
|
|
||||||
pkg-config --exists qt 2> /dev/null && pkg=qt; \
|
|
||||||
pkg-config --exists qt-mt 2> /dev/null && pkg=qt-mt; \
|
|
||||||
if [ -n "$$pkg" ]; then \
|
|
||||||
cflags="\$$(shell pkg-config $$pkg --cflags)"; \
|
|
||||||
libs="\$$(shell pkg-config $$pkg --libs)"; \
|
|
||||||
moc="\$$(shell pkg-config $$pkg --variable=prefix)/bin/moc"; \
|
|
||||||
dir="$$(pkg-config $$pkg --variable=prefix)"; \
|
|
||||||
else \
|
|
||||||
for d in $$QTDIR /usr/share/qt* /usr/lib/qt*; do \
|
|
||||||
if [ -f $$d/include/qconfig.h ]; then dir=$$d; break; fi; \
|
|
||||||
done; \
|
|
||||||
if [ -z "$$dir" ]; then \
|
|
||||||
echo "*"; \
|
|
||||||
echo "* Unable to find the QT3 installation. Please make sure that"; \
|
|
||||||
echo "* the QT3 development package is correctly installed and"; \
|
|
||||||
echo "* either install pkg-config or set the QTDIR environment"; \
|
|
||||||
echo "* variable to the correct location."; \
|
|
||||||
echo "*"; \
|
|
||||||
false; \
|
|
||||||
fi; \
|
|
||||||
libpath=$$dir/lib; lib=qt; osdir=""; \
|
|
||||||
$(HOSTCXX) -print-multi-os-directory > /dev/null 2>&1 && \
|
|
||||||
osdir=x$$($(HOSTCXX) -print-multi-os-directory); \
|
|
||||||
test -d $$libpath/$$osdir && libpath=$$libpath/$$osdir; \
|
|
||||||
test -f $$libpath/libqt-mt.so && lib=qt-mt; \
|
|
||||||
cflags="-I$$dir/include"; \
|
|
||||||
libs="-L$$libpath -Wl,-rpath,$$libpath -l$$lib"; \
|
|
||||||
moc="$$dir/bin/moc"; \
|
|
||||||
fi; \
|
|
||||||
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 "*"; \
|
|
||||||
moc="/usr/bin/moc"; \
|
|
||||||
fi; \
|
|
||||||
echo "KC_QT_CFLAGS=$$cflags" > $@; \
|
|
||||||
echo "KC_QT_LIBS=$$libs" >> $@; \
|
|
||||||
echo "KC_QT_MOC=$$moc" >> $@
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(obj)/gconf.o: $(obj)/.tmp_gtkcheck
|
|
||||||
|
|
||||||
ifeq ($(gconf-target),1)
|
|
||||||
-include $(obj)/.tmp_gtkcheck
|
|
||||||
|
|
||||||
# GTK needs some extra effort, too...
|
|
||||||
$(obj)/.tmp_gtkcheck:
|
|
||||||
@if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then \
|
|
||||||
if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then \
|
|
||||||
touch $@; \
|
|
||||||
else \
|
|
||||||
echo "*"; \
|
|
||||||
echo "* GTK+ is present but version >= 2.0.0 is required."; \
|
|
||||||
echo "*"; \
|
|
||||||
false; \
|
|
||||||
fi \
|
|
||||||
else \
|
|
||||||
echo "*"; \
|
|
||||||
echo "* Unable to find the GTK+ installation. Please make sure that"; \
|
|
||||||
echo "* the GTK+ 2.0 development package is correctly installed..."; \
|
|
||||||
echo "* You need gtk+-2.0, glib-2.0 and libglade-2.0."; \
|
|
||||||
echo "*"; \
|
|
||||||
false; \
|
|
||||||
fi
|
|
||||||
endif
|
|
||||||
|
|
||||||
$(obj)/zconf.tab.o: $(obj)/lex.zconf.c $(obj)/zconf.hash.c
|
|
||||||
|
|
||||||
$(obj)/kconfig_load.o: $(obj)/lkc_defs.h
|
|
||||||
|
|
||||||
$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
|
|
||||||
|
|
||||||
$(obj)/gconf.o: $(obj)/lkc_defs.h
|
|
||||||
|
|
||||||
$(obj)/%.moc: $(src)/%.h
|
|
||||||
$(KC_QT_MOC) -i $< -o $@
|
|
||||||
|
|
||||||
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
|
|
||||||
sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
|
|
||||||
|
|
||||||
# Extract gconf menu items for I18N support
|
|
||||||
$(obj)/gconf.glade.h: $(obj)/gconf.glade
|
|
||||||
intltool-extract --type=gettext/glade $(obj)/gconf.glade
|
|
||||||
|
|
||||||
###
|
|
||||||
# The following requires flex/bison/gperf
|
|
||||||
# By default we use the _shipped versions, uncomment the following line if
|
|
||||||
# you are modifying the flex/bison src.
|
|
||||||
# LKC_GENPARSER := 1
|
|
||||||
|
|
||||||
ifdef LKC_GENPARSER
|
|
||||||
|
|
||||||
$(obj)/zconf.tab.c: $(src)/zconf.y
|
|
||||||
$(obj)/lex.zconf.c: $(src)/zconf.l
|
|
||||||
$(obj)/zconf.hash.c: $(src)/zconf.gperf
|
|
||||||
|
|
||||||
%.tab.c: %.y
|
|
||||||
bison -l -b $* -p $(notdir $*) $<
|
|
||||||
cp $@ $@_shipped
|
|
||||||
|
|
||||||
lex.%.c: %.l
|
|
||||||
flex -L -P$(notdir $*) -o$@ $<
|
|
||||||
cp $@ $@_shipped
|
|
||||||
|
|
||||||
%.hash.c: %.gperf
|
|
||||||
gperf < $< > $@
|
|
||||||
cp $@ $@_shipped
|
|
||||||
|
|
||||||
endif
|
|
@ -1,16 +1,12 @@
|
|||||||
This is a copy of the kconfig code in the kernel (currently 2.6.24.4) tweaked
|
This is a copy of the kconfig code in the kernel (currently 2.6.36-rc1) tweaked
|
||||||
to suit Buildroot.
|
to suit Buildroot.
|
||||||
|
|
||||||
To update:
|
To update:
|
||||||
cp -r /usr/src/linux/scripts/kconfig package/config.new
|
cp -r /usr/src/linux/scripts/kconfig package/config.new
|
||||||
cd package/config.new
|
cd package/config.new
|
||||||
cp /usr/src/linux/Documentation/kbuild/kconfig-language.txt .
|
cp -a ../config/patches ../config/README.buildroot2 .
|
||||||
patch -p1 < ../config/kconfig-to-buildroot2.patch
|
quilt push -a
|
||||||
mv Makefile Makefile.kconfig
|
# Fix any conflict
|
||||||
cp ../config/README.buildroot2 .
|
|
||||||
cp ../config/foo.h .
|
|
||||||
cp ../config/Makefile .
|
|
||||||
cp ../config/kconfig-to-buildroot2.patch .
|
|
||||||
cd ..
|
cd ..
|
||||||
rm -rf config
|
rm -rf config
|
||||||
mv config.new config
|
mv config.new config
|
||||||
@ -19,4 +15,6 @@ Then verify the toplevel targets work:
|
|||||||
config
|
config
|
||||||
defconfig
|
defconfig
|
||||||
menuconfig
|
menuconfig
|
||||||
|
xconfig
|
||||||
|
gconfig
|
||||||
oldconfig
|
oldconfig
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <getopt.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
@ -19,16 +20,21 @@
|
|||||||
static void conf(struct menu *menu);
|
static void conf(struct menu *menu);
|
||||||
static void check_conf(struct menu *menu);
|
static void check_conf(struct menu *menu);
|
||||||
|
|
||||||
enum {
|
enum input_mode {
|
||||||
ask_all,
|
oldaskconfig,
|
||||||
ask_new,
|
silentoldconfig,
|
||||||
ask_silent,
|
oldconfig,
|
||||||
set_default,
|
allnoconfig,
|
||||||
set_yes,
|
allyesconfig,
|
||||||
set_mod,
|
allmodconfig,
|
||||||
set_no,
|
alldefconfig,
|
||||||
set_random
|
randconfig,
|
||||||
} input_mode = ask_all;
|
defconfig,
|
||||||
|
savedefconfig,
|
||||||
|
listnewconfig,
|
||||||
|
oldnoconfig,
|
||||||
|
} input_mode = oldaskconfig;
|
||||||
|
|
||||||
char *defconfig_file;
|
char *defconfig_file;
|
||||||
|
|
||||||
static int indent = 1;
|
static int indent = 1;
|
||||||
@ -38,14 +44,14 @@ static int conf_cnt;
|
|||||||
static char line[128];
|
static char line[128];
|
||||||
static struct menu *rootEntry;
|
static struct menu *rootEntry;
|
||||||
|
|
||||||
static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
|
static void print_help(struct menu *menu)
|
||||||
|
|
||||||
static const char *get_help(struct menu *menu)
|
|
||||||
{
|
{
|
||||||
if (menu_has_help(menu))
|
struct gstr help = str_new();
|
||||||
return _(menu_get_help(menu));
|
|
||||||
else
|
menu_get_ext_help(menu, &help);
|
||||||
return nohelp_text;
|
|
||||||
|
printf("\n%s\n", str_get(&help));
|
||||||
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void strip(char *str)
|
static void strip(char *str)
|
||||||
@ -93,16 +99,16 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case ask_new:
|
case oldconfig:
|
||||||
case ask_silent:
|
case silentoldconfig:
|
||||||
if (sym_has_value(sym)) {
|
if (sym_has_value(sym)) {
|
||||||
printf("%s\n", def);
|
printf("%s\n", def);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
check_stdin();
|
check_stdin();
|
||||||
case ask_all:
|
case oldaskconfig:
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fgets(line, 128, stdin);
|
xfgets(line, 128, stdin);
|
||||||
return 1;
|
return 1;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -121,7 +127,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int conf_string(struct menu *menu)
|
static int conf_string(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
const char *def;
|
const char *def;
|
||||||
@ -140,7 +146,7 @@ int conf_string(struct menu *menu)
|
|||||||
case '?':
|
case '?':
|
||||||
/* print help */
|
/* print help */
|
||||||
if (line[1] == '\n') {
|
if (line[1] == '\n') {
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
def = NULL;
|
def = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -156,14 +162,12 @@ int conf_string(struct menu *menu)
|
|||||||
static int conf_sym(struct menu *menu)
|
static int conf_sym(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
int type;
|
|
||||||
tristate oldval, newval;
|
tristate oldval, newval;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
|
printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
|
||||||
if (sym->name)
|
if (sym->name)
|
||||||
printf("(%s) ", sym->name);
|
printf("(%s) ", sym->name);
|
||||||
type = sym_get_type(sym);
|
|
||||||
putchar('[');
|
putchar('[');
|
||||||
oldval = sym_get_tristate_value(sym);
|
oldval = sym_get_tristate_value(sym);
|
||||||
switch (oldval) {
|
switch (oldval) {
|
||||||
@ -220,7 +224,7 @@ static int conf_sym(struct menu *menu)
|
|||||||
if (sym_set_tristate_value(sym, newval))
|
if (sym_set_tristate_value(sym, newval))
|
||||||
return 0;
|
return 0;
|
||||||
help:
|
help:
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,11 +232,9 @@ static int conf_choice(struct menu *menu)
|
|||||||
{
|
{
|
||||||
struct symbol *sym, *def_sym;
|
struct symbol *sym, *def_sym;
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
int type;
|
|
||||||
bool is_new;
|
bool is_new;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
type = sym_get_type(sym);
|
|
||||||
is_new = !sym_has_value(sym);
|
is_new = !sym_has_value(sym);
|
||||||
if (sym_is_changable(sym)) {
|
if (sym_is_changable(sym)) {
|
||||||
conf_sym(menu);
|
conf_sym(menu);
|
||||||
@ -294,20 +296,20 @@ static int conf_choice(struct menu *menu)
|
|||||||
printf("?");
|
printf("?");
|
||||||
printf("]: ");
|
printf("]: ");
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case ask_new:
|
case oldconfig:
|
||||||
case ask_silent:
|
case silentoldconfig:
|
||||||
if (!is_new) {
|
if (!is_new) {
|
||||||
cnt = def;
|
cnt = def;
|
||||||
printf("%d\n", cnt);
|
printf("%d\n", cnt);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
check_stdin();
|
check_stdin();
|
||||||
case ask_all:
|
case oldaskconfig:
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fgets(line, 128, stdin);
|
xfgets(line, 128, stdin);
|
||||||
strip(line);
|
strip(line);
|
||||||
if (line[0] == '?') {
|
if (line[0] == '?') {
|
||||||
printf("\n%s\n", get_help(menu));
|
print_help(menu);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!line[0])
|
if (!line[0])
|
||||||
@ -331,7 +333,7 @@ static int conf_choice(struct menu *menu)
|
|||||||
if (!child)
|
if (!child)
|
||||||
continue;
|
continue;
|
||||||
if (line[strlen(line) - 1] == '?') {
|
if (line[strlen(line) - 1] == '?') {
|
||||||
printf("\n%s\n", get_help(child));
|
print_help(child);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sym_set_choice_value(sym, child->sym);
|
sym_set_choice_value(sym, child->sym);
|
||||||
@ -360,7 +362,10 @@ static void conf(struct menu *menu)
|
|||||||
|
|
||||||
switch (prop->type) {
|
switch (prop->type) {
|
||||||
case P_MENU:
|
case P_MENU:
|
||||||
if (input_mode == ask_silent && rootEntry != menu) {
|
if ((input_mode == silentoldconfig ||
|
||||||
|
input_mode == listnewconfig ||
|
||||||
|
input_mode == oldnoconfig) &&
|
||||||
|
rootEntry != menu) {
|
||||||
check_conf(menu);
|
check_conf(menu);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -418,17 +423,39 @@ static void check_conf(struct menu *menu)
|
|||||||
if (sym && !sym_has_value(sym)) {
|
if (sym && !sym_has_value(sym)) {
|
||||||
if (sym_is_changable(sym) ||
|
if (sym_is_changable(sym) ||
|
||||||
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
|
(sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
|
||||||
|
if (input_mode == listnewconfig) {
|
||||||
|
if (sym->name && !sym_is_choice_value(sym)) {
|
||||||
|
printf("CONFIG_%s\n", sym->name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!conf_cnt++)
|
if (!conf_cnt++)
|
||||||
printf(_("*\n* Restart config...\n*\n"));
|
printf(_("*\n* Restart config...\n*\n"));
|
||||||
rootEntry = menu_get_parent_menu(menu);
|
rootEntry = menu_get_parent_menu(menu);
|
||||||
conf(rootEntry);
|
conf(rootEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (child = menu->list; child; child = child->next)
|
for (child = menu->list; child; child = child->next)
|
||||||
check_conf(child);
|
check_conf(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct option long_opts[] = {
|
||||||
|
{"oldaskconfig", no_argument, NULL, oldaskconfig},
|
||||||
|
{"oldconfig", no_argument, NULL, oldconfig},
|
||||||
|
{"silentoldconfig", no_argument, NULL, silentoldconfig},
|
||||||
|
{"defconfig", optional_argument, NULL, defconfig},
|
||||||
|
{"savedefconfig", required_argument, NULL, savedefconfig},
|
||||||
|
{"allnoconfig", no_argument, NULL, allnoconfig},
|
||||||
|
{"allyesconfig", no_argument, NULL, allyesconfig},
|
||||||
|
{"allmodconfig", no_argument, NULL, allmodconfig},
|
||||||
|
{"alldefconfig", no_argument, NULL, alldefconfig},
|
||||||
|
{"randconfig", no_argument, NULL, randconfig},
|
||||||
|
{"listnewconfig", no_argument, NULL, listnewconfig},
|
||||||
|
{"oldnoconfig", no_argument, NULL, oldnoconfig},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
int opt;
|
int opt;
|
||||||
@ -439,32 +466,17 @@ int main(int ac, char **av)
|
|||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
while ((opt = getopt(ac, av, "osdD:nmyrh")) != -1) {
|
while ((opt = getopt_long_only(ac, av, "", long_opts, NULL)) != -1) {
|
||||||
|
input_mode = (enum input_mode)opt;
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'o':
|
case silentoldconfig:
|
||||||
input_mode = ask_silent;
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
input_mode = ask_silent;
|
|
||||||
sync_kconfig = 1;
|
sync_kconfig = 1;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case defconfig:
|
||||||
input_mode = set_default;
|
case savedefconfig:
|
||||||
break;
|
|
||||||
case 'D':
|
|
||||||
input_mode = set_default;
|
|
||||||
defconfig_file = optarg;
|
defconfig_file = optarg;
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case randconfig:
|
||||||
input_mode = set_no;
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
input_mode = set_mod;
|
|
||||||
break;
|
|
||||||
case 'y':
|
|
||||||
input_mode = set_yes;
|
|
||||||
break;
|
|
||||||
case 'r':
|
|
||||||
{
|
{
|
||||||
struct timeval now;
|
struct timeval now;
|
||||||
unsigned int seed;
|
unsigned int seed;
|
||||||
@ -477,17 +489,12 @@ int main(int ac, char **av)
|
|||||||
|
|
||||||
seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
|
seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
|
||||||
srand(seed);
|
srand(seed);
|
||||||
|
|
||||||
input_mode = set_random;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'h':
|
case '?':
|
||||||
printf(_("See README for usage info\n"));
|
|
||||||
exit(0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, _("See README for usage info\n"));
|
fprintf(stderr, _("See README for usage info\n"));
|
||||||
exit(1);
|
exit(1);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ac == optind) {
|
if (ac == optind) {
|
||||||
@ -500,7 +507,7 @@ int main(int ac, char **av)
|
|||||||
name = conf_get_configname();
|
name = conf_get_configname();
|
||||||
if (stat(name, &tmpstat)) {
|
if (stat(name, &tmpstat)) {
|
||||||
fprintf(stderr, _("***\n"
|
fprintf(stderr, _("***\n"
|
||||||
"*** You have not yet configured Buildroot!\n"
|
"*** You have not yet configured your Buildroot!\n"
|
||||||
"*** (missing .config file \"%s\")\n"
|
"*** (missing .config file \"%s\")\n"
|
||||||
"***\n"
|
"***\n"
|
||||||
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
||||||
@ -511,7 +518,7 @@ int main(int ac, char **av)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_default:
|
case defconfig:
|
||||||
if (!defconfig_file)
|
if (!defconfig_file)
|
||||||
defconfig_file = conf_get_default_confname();
|
defconfig_file = conf_get_default_confname();
|
||||||
if (conf_read(defconfig_file)) {
|
if (conf_read(defconfig_file)) {
|
||||||
@ -521,25 +528,32 @@ int main(int ac, char **av)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ask_silent:
|
case savedefconfig:
|
||||||
case ask_all:
|
|
||||||
case ask_new:
|
|
||||||
conf_read(NULL);
|
conf_read(NULL);
|
||||||
break;
|
break;
|
||||||
case set_no:
|
case silentoldconfig:
|
||||||
case set_mod:
|
case oldaskconfig:
|
||||||
case set_yes:
|
case oldconfig:
|
||||||
case set_random:
|
case listnewconfig:
|
||||||
|
case oldnoconfig:
|
||||||
|
conf_read(NULL);
|
||||||
|
break;
|
||||||
|
case allnoconfig:
|
||||||
|
case allyesconfig:
|
||||||
|
case allmodconfig:
|
||||||
|
case alldefconfig:
|
||||||
|
case randconfig:
|
||||||
name = getenv("KCONFIG_ALLCONFIG");
|
name = getenv("KCONFIG_ALLCONFIG");
|
||||||
if (name && !stat(name, &tmpstat)) {
|
if (name && !stat(name, &tmpstat)) {
|
||||||
conf_read_simple(name, S_DEF_USER);
|
conf_read_simple(name, S_DEF_USER);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_no: name = "allno.config"; break;
|
case allnoconfig: name = "allno.config"; break;
|
||||||
case set_mod: name = "allmod.config"; break;
|
case allyesconfig: name = "allyes.config"; break;
|
||||||
case set_yes: name = "allyes.config"; break;
|
case allmodconfig: name = "allmod.config"; break;
|
||||||
case set_random: name = "allrandom.config"; break;
|
case alldefconfig: name = "alldef.config"; break;
|
||||||
|
case randconfig: name = "allrandom.config"; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
if (!stat(name, &tmpstat))
|
if (!stat(name, &tmpstat))
|
||||||
@ -564,33 +578,42 @@ int main(int ac, char **av)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (input_mode) {
|
switch (input_mode) {
|
||||||
case set_no:
|
case allnoconfig:
|
||||||
conf_set_all_new_symbols(def_no);
|
conf_set_all_new_symbols(def_no);
|
||||||
break;
|
break;
|
||||||
case set_yes:
|
case allyesconfig:
|
||||||
conf_set_all_new_symbols(def_yes);
|
conf_set_all_new_symbols(def_yes);
|
||||||
break;
|
break;
|
||||||
case set_mod:
|
case allmodconfig:
|
||||||
conf_set_all_new_symbols(def_mod);
|
conf_set_all_new_symbols(def_mod);
|
||||||
break;
|
break;
|
||||||
case set_random:
|
case alldefconfig:
|
||||||
conf_set_all_new_symbols(def_random);
|
|
||||||
break;
|
|
||||||
case set_default:
|
|
||||||
conf_set_all_new_symbols(def_default);
|
conf_set_all_new_symbols(def_default);
|
||||||
break;
|
break;
|
||||||
case ask_new:
|
case randconfig:
|
||||||
case ask_all:
|
conf_set_all_new_symbols(def_random);
|
||||||
|
break;
|
||||||
|
case defconfig:
|
||||||
|
conf_set_all_new_symbols(def_default);
|
||||||
|
break;
|
||||||
|
case savedefconfig:
|
||||||
|
break;
|
||||||
|
case oldaskconfig:
|
||||||
rootEntry = &rootmenu;
|
rootEntry = &rootmenu;
|
||||||
conf(&rootmenu);
|
conf(&rootmenu);
|
||||||
input_mode = ask_silent;
|
input_mode = silentoldconfig;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case ask_silent:
|
case oldconfig:
|
||||||
|
case listnewconfig:
|
||||||
|
case oldnoconfig:
|
||||||
|
case silentoldconfig:
|
||||||
/* Update until a loop caused no more changes */
|
/* Update until a loop caused no more changes */
|
||||||
do {
|
do {
|
||||||
conf_cnt = 0;
|
conf_cnt = 0;
|
||||||
check_conf(&rootmenu);
|
check_conf(&rootmenu);
|
||||||
} while (conf_cnt);
|
} while (conf_cnt &&
|
||||||
|
(input_mode != listnewconfig &&
|
||||||
|
input_mode != oldnoconfig));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -606,15 +629,28 @@ int main(int ac, char **av)
|
|||||||
fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (input_mode == savedefconfig) {
|
||||||
|
if (conf_write_defconfig(defconfig_file)) {
|
||||||
|
fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
|
||||||
|
defconfig_file);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (input_mode != listnewconfig) {
|
||||||
if (conf_write(NULL)) {
|
if (conf_write(NULL)) {
|
||||||
fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
if (conf_write_autoconf()) {
|
|
||||||
fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Helper function to facilitate fgets() by Jean Sacren.
|
||||||
|
*/
|
||||||
|
void xfgets(str, size, in)
|
||||||
|
char *str;
|
||||||
|
int size;
|
||||||
|
FILE *in;
|
||||||
|
{
|
||||||
|
if (fgets(str, size, in) == NULL)
|
||||||
|
fprintf(stderr, "\nError in reading or end of file.\n");
|
||||||
|
}
|
||||||
|
@ -169,8 +169,11 @@ int conf_read_simple(const char *name, int def)
|
|||||||
if (in)
|
if (in)
|
||||||
goto load;
|
goto load;
|
||||||
sym_add_change_count(1);
|
sym_add_change_count(1);
|
||||||
if (!sym_defconfig_list)
|
if (!sym_defconfig_list) {
|
||||||
|
if (modules_sym)
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
for_all_defaults(sym_defconfig_list, prop) {
|
for_all_defaults(sym_defconfig_list, prop) {
|
||||||
if (expr_calc_value(prop->visible.expr) == no ||
|
if (expr_calc_value(prop->visible.expr) == no ||
|
||||||
@ -391,15 +394,148 @@ int conf_read(const char *name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Write a S_STRING */
|
||||||
|
static void conf_write_string(bool headerfile, const char *name,
|
||||||
|
const char *str, FILE *out)
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
if (headerfile)
|
||||||
|
fprintf(out, "#define %s \"", name);
|
||||||
|
else
|
||||||
|
fprintf(out, "%s=\"", name);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
l = strcspn(str, "\"\\");
|
||||||
|
if (l) {
|
||||||
|
xfwrite(str, l, 1, out);
|
||||||
|
str += l;
|
||||||
|
}
|
||||||
|
if (!*str)
|
||||||
|
break;
|
||||||
|
fprintf(out, "\\%c", *str++);
|
||||||
|
}
|
||||||
|
fputs("\"\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_write_symbol(struct symbol *sym, enum symbol_type type,
|
||||||
|
FILE *out, bool write_no)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
if (write_no)
|
||||||
|
fprintf(out, "# %s is not set\n", sym->name);
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
fprintf(out, "%s=m\n", sym->name);
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
fprintf(out, "%s=y\n", sym->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
conf_write_string(false, sym->name, sym_get_string_value(sym), out);
|
||||||
|
break;
|
||||||
|
case S_HEX:
|
||||||
|
case S_INT:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
fprintf(out, "%s=%s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
case S_OTHER:
|
||||||
|
case S_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write out a minimal config.
|
||||||
|
* All values that has default values are skipped as this is redundant.
|
||||||
|
*/
|
||||||
|
int conf_write_defconfig(const char *filename)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct menu *menu;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
out = fopen(filename, "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
/* Traverse all menus to find all relevant symbols */
|
||||||
|
menu = rootmenu.list;
|
||||||
|
|
||||||
|
while (menu != NULL)
|
||||||
|
{
|
||||||
|
sym = menu->sym;
|
||||||
|
if (sym == NULL) {
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
goto next_menu;
|
||||||
|
} else if (!sym_is_choice(sym)) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
if (!(sym->flags & SYMBOL_WRITE))
|
||||||
|
goto next_menu;
|
||||||
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
|
/* If we cannot change the symbol - skip */
|
||||||
|
if (!sym_is_changable(sym))
|
||||||
|
goto next_menu;
|
||||||
|
/* If symbol equals to default value - skip */
|
||||||
|
if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
|
||||||
|
goto next_menu;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If symbol is a choice value and equals to the
|
||||||
|
* default for a choice - skip.
|
||||||
|
* But only if value is bool and equal to "y" .
|
||||||
|
*/
|
||||||
|
if (sym_is_choice_value(sym)) {
|
||||||
|
struct symbol *cs;
|
||||||
|
struct symbol *ds;
|
||||||
|
|
||||||
|
cs = prop_get_symbol(sym_get_choice_prop(sym));
|
||||||
|
ds = sym_choice_default(cs);
|
||||||
|
if (sym == ds) {
|
||||||
|
if ((sym->type == S_BOOLEAN) &&
|
||||||
|
sym_get_tristate_value(sym) == yes)
|
||||||
|
goto next_menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf_write_symbol(sym, sym->type, out, true);
|
||||||
|
}
|
||||||
|
next_menu:
|
||||||
|
if (menu->list != NULL) {
|
||||||
|
menu = menu->list;
|
||||||
|
}
|
||||||
|
else if (menu->next != NULL) {
|
||||||
|
menu = menu->next;
|
||||||
|
} else {
|
||||||
|
while ((menu = menu->parent)) {
|
||||||
|
if (menu->next != NULL) {
|
||||||
|
menu = menu->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(out);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int conf_write(const char *name)
|
int conf_write(const char *name)
|
||||||
{
|
{
|
||||||
FILE *out;
|
FILE *out;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
const char *basename;
|
const char *basename;
|
||||||
char dirname[128], tmpname[128], newname[128];
|
|
||||||
int type, l;
|
|
||||||
const char *str;
|
const char *str;
|
||||||
|
char dirname[128], tmpname[128], newname[128];
|
||||||
|
enum symbol_type type;
|
||||||
time_t now;
|
time_t now;
|
||||||
int use_timestamp = 1;
|
int use_timestamp = 1;
|
||||||
char *env;
|
char *env;
|
||||||
@ -480,47 +616,8 @@ int conf_write(const char *name)
|
|||||||
if (modules_sym->curr.tri == no)
|
if (modules_sym->curr.tri == no)
|
||||||
type = S_BOOLEAN;
|
type = S_BOOLEAN;
|
||||||
}
|
}
|
||||||
switch (type) {
|
/* Write config symbol to file */
|
||||||
case S_BOOLEAN:
|
conf_write_symbol(sym, type, out, true);
|
||||||
case S_TRISTATE:
|
|
||||||
switch (sym_get_tristate_value(sym)) {
|
|
||||||
case no:
|
|
||||||
fprintf(out, "# %s is not set\n", sym->name);
|
|
||||||
break;
|
|
||||||
case mod:
|
|
||||||
fprintf(out, "%s=m\n", sym->name);
|
|
||||||
break;
|
|
||||||
case yes:
|
|
||||||
fprintf(out, "%s=y\n", sym->name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case S_STRING:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
fprintf(out, "%s=\"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
fwrite(str, l, 1, out);
|
|
||||||
str += l;
|
|
||||||
}
|
|
||||||
if (!*str)
|
|
||||||
break;
|
|
||||||
fprintf(out, "\\%c", *str++);
|
|
||||||
}
|
|
||||||
fputs("\"\n", out);
|
|
||||||
break;
|
|
||||||
case S_HEX:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case S_INT:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
next:
|
next:
|
||||||
@ -556,7 +653,7 @@ int conf_write(const char *name)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int conf_split_config(void)
|
static int conf_split_config(void)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
char path[128];
|
char path[128];
|
||||||
@ -688,9 +785,9 @@ int conf_write_autoconf(void)
|
|||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
const char *str;
|
const char *str;
|
||||||
const char *name;
|
const char *name;
|
||||||
FILE *out, *out_h;
|
FILE *out, *tristate, *out_h;
|
||||||
time_t now;
|
time_t now;
|
||||||
int i, l;
|
int i;
|
||||||
char dir[PATH_MAX+1], buf[PATH_MAX+1];
|
char dir[PATH_MAX+1], buf[PATH_MAX+1];
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
@ -714,10 +811,18 @@ int conf_write_autoconf(void)
|
|||||||
if (!out)
|
if (!out)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
sprintf(buf, "%s.tmpconfig_tristate", dir);
|
||||||
|
tristate = fopen(buf, "w");
|
||||||
|
if (!tristate) {
|
||||||
|
fclose(out);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
sprintf(buf, "%s.tmpconfig.h", dir);
|
sprintf(buf, "%s.tmpconfig.h", dir);
|
||||||
out_h = fopen(buf, "w");
|
out_h = fopen(buf, "w");
|
||||||
if (!out_h) {
|
if (!out_h) {
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
fclose(tristate);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -729,6 +834,9 @@ int conf_write_autoconf(void)
|
|||||||
"# %s"
|
"# %s"
|
||||||
"#\n",
|
"#\n",
|
||||||
ctime(&now));
|
ctime(&now));
|
||||||
|
fprintf(tristate, "#\n"
|
||||||
|
"# Automatically generated - do not edit\n"
|
||||||
|
"\n");
|
||||||
fprintf(out_h, "/*\n"
|
fprintf(out_h, "/*\n"
|
||||||
" * Automatically generated C config: don't edit\n"
|
" * Automatically generated C config: don't edit\n"
|
||||||
" * %s"
|
" * %s"
|
||||||
@ -739,6 +847,11 @@ int conf_write_autoconf(void)
|
|||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
|
if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* write symbol to config file */
|
||||||
|
conf_write_symbol(sym, sym->type, out, false);
|
||||||
|
|
||||||
|
/* update autoconf and tristate files */
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
case S_TRISTATE:
|
case S_TRISTATE:
|
||||||
@ -746,45 +859,28 @@ int conf_write_autoconf(void)
|
|||||||
case no:
|
case no:
|
||||||
break;
|
break;
|
||||||
case mod:
|
case mod:
|
||||||
fprintf(out, "%s=m\n", sym->name);
|
fprintf(tristate, "%s=M\n", sym->name);
|
||||||
fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
||||||
break;
|
break;
|
||||||
case yes:
|
case yes:
|
||||||
fprintf(out, "%s=y\n", sym->name);
|
if (sym->type == S_TRISTATE)
|
||||||
|
fprintf(tristate, "%s=Y\n",
|
||||||
|
sym->name);
|
||||||
fprintf(out_h, "#define %s 1\n", sym->name);
|
fprintf(out_h, "#define %s 1\n", sym->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case S_STRING:
|
case S_STRING:
|
||||||
str = sym_get_string_value(sym);
|
conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
|
||||||
fprintf(out, "%s=\"", sym->name);
|
|
||||||
fprintf(out_h, "#define %s \"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
fwrite(str, l, 1, out);
|
|
||||||
fwrite(str, l, 1, out_h);
|
|
||||||
str += l;
|
|
||||||
}
|
|
||||||
if (!*str)
|
|
||||||
break;
|
|
||||||
fprintf(out, "\\%c", *str);
|
|
||||||
fprintf(out_h, "\\%c", *str);
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
fputs("\"\n", out);
|
|
||||||
fputs("\"\n", out_h);
|
|
||||||
break;
|
break;
|
||||||
case S_HEX:
|
case S_HEX:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case S_INT:
|
case S_INT:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
fprintf(out_h, "#define %s %s\n", sym->name, str);
|
fprintf(out_h, "#define %s %s\n", sym->name, str);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -792,12 +888,19 @@ int conf_write_autoconf(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(out);
|
fclose(out);
|
||||||
|
fclose(tristate);
|
||||||
fclose(out_h);
|
fclose(out_h);
|
||||||
|
|
||||||
name = getenv("KCONFIG_AUTOHEADER");
|
name = getenv("KCONFIG_AUTOHEADER");
|
||||||
if (!name)
|
if (!name)
|
||||||
name = "include/linux/autoconf.h";
|
name = "include/generated/autoconf.h";
|
||||||
sprintf(buf, "%s.tmpconfig.h", dir);
|
sprintf(buf, "%s.tmpconfig.h", dir);
|
||||||
|
if (rename(buf, name))
|
||||||
|
return 1;
|
||||||
|
name = getenv("KCONFIG_TRISTATE");
|
||||||
|
if (!name)
|
||||||
|
name = "include/config/tristate.conf";
|
||||||
|
sprintf(buf, "%s.tmpconfig_tristate", dir);
|
||||||
if (rename(buf, name))
|
if (rename(buf, name))
|
||||||
return 1;
|
return 1;
|
||||||
name = conf_get_autoconfig_name();
|
name = conf_get_autoconfig_name();
|
||||||
@ -839,13 +942,73 @@ void conf_set_changed_callback(void (*fn)(void))
|
|||||||
conf_changed_callback = fn;
|
conf_changed_callback = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void randomize_choice_values(struct symbol *csym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct expr *e;
|
||||||
|
int cnt, def;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If choice is mod then we may have more items slected
|
||||||
|
* and if no then no-one.
|
||||||
|
* In both cases stop.
|
||||||
|
*/
|
||||||
|
if (csym->curr.tri != yes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
prop = sym_get_choice_prop(csym);
|
||||||
|
|
||||||
|
/* count entries in choice block */
|
||||||
|
cnt = 0;
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
|
cnt++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find a random value and set it to yes,
|
||||||
|
* set the rest to no so we have only one set
|
||||||
|
*/
|
||||||
|
def = (rand() % cnt);
|
||||||
|
|
||||||
|
cnt = 0;
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
if (def == cnt++) {
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
csym->def[S_DEF_USER].val = sym;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
csym->flags &= ~(SYMBOL_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_all_choice_values(struct symbol *csym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
prop = sym_get_choice_prop(csym);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set all non-assinged choice values to no
|
||||||
|
*/
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
if (!sym_has_value(sym))
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
csym->flags &= ~(SYMBOL_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
{
|
{
|
||||||
struct symbol *sym, *csym;
|
struct symbol *sym, *csym;
|
||||||
struct property *prop;
|
int i, cnt, prob = 50;
|
||||||
struct expr *e;
|
|
||||||
int i, cnt, def, prob = 50;
|
|
||||||
|
|
||||||
if (mode == def_random) {
|
if (mode == def_random) {
|
||||||
char *endp, *env = getenv("KCONFIG_PROBABILITY");
|
char *endp, *env = getenv("KCONFIG_PROBABILITY");
|
||||||
@ -897,8 +1060,6 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
|
|||||||
|
|
||||||
sym_clear_all_valid();
|
sym_clear_all_valid();
|
||||||
|
|
||||||
if (mode != def_random)
|
|
||||||
return;
|
|
||||||
/*
|
/*
|
||||||
* We have different type of choice blocks.
|
* We have different type of choice blocks.
|
||||||
* If curr.tri equal to mod then we can select several
|
* If curr.tri equal to mod then we can select several
|
||||||
@ -913,35 +1074,9 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
sym_calc_value(csym);
|
sym_calc_value(csym);
|
||||||
|
if (mode == def_random)
|
||||||
if (csym->curr.tri != yes)
|
randomize_choice_values(csym);
|
||||||
continue;
|
else
|
||||||
|
set_all_choice_values(csym);
|
||||||
prop = sym_get_choice_prop(csym);
|
|
||||||
|
|
||||||
/* count entries in choice block */
|
|
||||||
cnt = 0;
|
|
||||||
expr_list_for_each_sym(prop->expr, e, sym)
|
|
||||||
cnt++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* find a random value and set it to yes,
|
|
||||||
* set the rest to no so we have only one set
|
|
||||||
*/
|
|
||||||
def = (rand() % cnt);
|
|
||||||
|
|
||||||
cnt = 0;
|
|
||||||
expr_list_for_each_sym(prop->expr, e, sym) {
|
|
||||||
if (def == cnt++) {
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
csym->def[S_DEF_USER].val = sym;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sym->def[S_DEF_USER].tri = no;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
csym->flags |= SYMBOL_DEF_USER;
|
|
||||||
/* clear VALID to get value calculated */
|
|
||||||
csym->flags &= ~(SYMBOL_VALID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -348,7 +348,7 @@ struct expr *expr_trans_bool(struct expr *e)
|
|||||||
/*
|
/*
|
||||||
* e1 || e2 -> ?
|
* e1 || e2 -> ?
|
||||||
*/
|
*/
|
||||||
struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
static struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
||||||
{
|
{
|
||||||
struct expr *tmp;
|
struct expr *tmp;
|
||||||
struct symbol *sym1, *sym2;
|
struct symbol *sym1, *sym2;
|
||||||
@ -412,7 +412,7 @@ struct expr *expr_join_or(struct expr *e1, struct expr *e2)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct expr *expr_join_and(struct expr *e1, struct expr *e2)
|
static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
|
||||||
{
|
{
|
||||||
struct expr *tmp;
|
struct expr *tmp;
|
||||||
struct symbol *sym1, *sym2;
|
struct symbol *sym1, *sym2;
|
||||||
@ -1087,7 +1087,7 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
|
|||||||
|
|
||||||
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
|
||||||
{
|
{
|
||||||
fwrite(str, strlen(str), 1, data);
|
xfwrite(str, strlen(str), 1, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expr_fprint(struct expr *e, FILE *out)
|
void expr_fprint(struct expr *e, FILE *out)
|
||||||
@ -1097,7 +1097,32 @@ void expr_fprint(struct expr *e, FILE *out)
|
|||||||
|
|
||||||
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
|
||||||
{
|
{
|
||||||
str_append((struct gstr*)data, str);
|
struct gstr *gs = (struct gstr*)data;
|
||||||
|
const char *sym_str = NULL;
|
||||||
|
|
||||||
|
if (sym)
|
||||||
|
sym_str = sym_get_string_value(sym);
|
||||||
|
|
||||||
|
if (gs->max_width) {
|
||||||
|
unsigned extra_length = strlen(str);
|
||||||
|
const char *last_cr = strrchr(gs->s, '\n');
|
||||||
|
unsigned last_line_length;
|
||||||
|
|
||||||
|
if (sym_str)
|
||||||
|
extra_length += 4 + strlen(sym_str);
|
||||||
|
|
||||||
|
if (!last_cr)
|
||||||
|
last_cr = gs->s;
|
||||||
|
|
||||||
|
last_line_length = strlen(gs->s) - (last_cr - gs->s);
|
||||||
|
|
||||||
|
if ((last_line_length + extra_length) > gs->max_width)
|
||||||
|
str_append(gs, "\\\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
str_append(gs, str);
|
||||||
|
if (sym && sym->type != S_UNKNOWN)
|
||||||
|
str_printf(gs, " [=%s]", sym_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
||||||
|
@ -83,10 +83,11 @@ struct symbol {
|
|||||||
tristate visible;
|
tristate visible;
|
||||||
int flags;
|
int flags;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
struct expr_value dir_dep;
|
||||||
struct expr_value rev_dep;
|
struct expr_value rev_dep;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
|
||||||
|
|
||||||
#define SYMBOL_CONST 0x0001 /* symbol is const */
|
#define SYMBOL_CONST 0x0001 /* symbol is const */
|
||||||
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
#define SYMBOL_CHECK 0x0008 /* used during dependency checking */
|
||||||
@ -108,8 +109,7 @@ struct symbol {
|
|||||||
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
#define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
|
||||||
|
|
||||||
#define SYMBOL_MAXLENGTH 256
|
#define SYMBOL_MAXLENGTH 256
|
||||||
#define SYMBOL_HASHSIZE 257
|
#define SYMBOL_HASHSIZE 9973
|
||||||
#define SYMBOL_HASHMASK 0xff
|
|
||||||
|
|
||||||
/* A property represent the config options that can be associated
|
/* A property represent the config options that can be associated
|
||||||
* with a config "symbol".
|
* with a config "symbol".
|
||||||
@ -132,6 +132,7 @@ enum prop_type {
|
|||||||
P_SELECT, /* select BAR */
|
P_SELECT, /* select BAR */
|
||||||
P_RANGE, /* range 7..100 (for a symbol) */
|
P_RANGE, /* range 7..100 (for a symbol) */
|
||||||
P_ENV, /* value from environment variable */
|
P_ENV, /* value from environment variable */
|
||||||
|
P_SYMBOL, /* where a symbol is defined */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct property {
|
struct property {
|
||||||
@ -164,6 +165,7 @@ struct menu {
|
|||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct property *prompt;
|
struct property *prompt;
|
||||||
struct expr *dep;
|
struct expr *dep;
|
||||||
|
struct expr *dir_dep;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
char *help;
|
char *help;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
@ -30,13 +30,16 @@ enum {
|
|||||||
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
OPT_NORMAL, OPT_ALL, OPT_PROMPT
|
||||||
|
};
|
||||||
|
|
||||||
static gint view_mode = FULL_VIEW;
|
static gint view_mode = FULL_VIEW;
|
||||||
static gboolean show_name = TRUE;
|
static gboolean show_name = TRUE;
|
||||||
static gboolean show_range = TRUE;
|
static gboolean show_range = TRUE;
|
||||||
static gboolean show_value = TRUE;
|
static gboolean show_value = TRUE;
|
||||||
static gboolean show_all = FALSE;
|
|
||||||
static gboolean show_debug = FALSE;
|
|
||||||
static gboolean resizeable = FALSE;
|
static gboolean resizeable = FALSE;
|
||||||
|
static int opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
GtkWidget *main_wnd = NULL;
|
GtkWidget *main_wnd = NULL;
|
||||||
GtkWidget *tree1_w = NULL; // left frame
|
GtkWidget *tree1_w = NULL; // left frame
|
||||||
@ -76,36 +79,7 @@ static void conf_changed(void);
|
|||||||
|
|
||||||
/* Helping/Debugging Functions */
|
/* Helping/Debugging Functions */
|
||||||
|
|
||||||
|
const char *dbg_sym_flags(int val)
|
||||||
const char *dbg_print_stype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == S_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == S_BOOLEAN)
|
|
||||||
strcpy(buf, "boolean");
|
|
||||||
if (val == S_TRISTATE)
|
|
||||||
strcpy(buf, "tristate");
|
|
||||||
if (val == S_INT)
|
|
||||||
strcpy(buf, "int");
|
|
||||||
if (val == S_HEX)
|
|
||||||
strcpy(buf, "hex");
|
|
||||||
if (val == S_STRING)
|
|
||||||
strcpy(buf, "string");
|
|
||||||
if (val == S_OTHER)
|
|
||||||
strcpy(buf, "other");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dbg_print_flags(int val)
|
|
||||||
{
|
{
|
||||||
static char buf[256];
|
static char buf[256];
|
||||||
|
|
||||||
@ -131,40 +105,10 @@ const char *dbg_print_flags(int val)
|
|||||||
strcat(buf, "auto/");
|
strcat(buf, "auto/");
|
||||||
|
|
||||||
buf[strlen(buf) - 1] = '\0';
|
buf[strlen(buf) - 1] = '\0';
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *dbg_print_ptype(int val)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
|
|
||||||
bzero(buf, 256);
|
|
||||||
|
|
||||||
if (val == P_UNKNOWN)
|
|
||||||
strcpy(buf, "unknown");
|
|
||||||
if (val == P_PROMPT)
|
|
||||||
strcpy(buf, "prompt");
|
|
||||||
if (val == P_COMMENT)
|
|
||||||
strcpy(buf, "comment");
|
|
||||||
if (val == P_MENU)
|
|
||||||
strcpy(buf, "menu");
|
|
||||||
if (val == P_DEFAULT)
|
|
||||||
strcpy(buf, "default");
|
|
||||||
if (val == P_CHOICE)
|
|
||||||
strcpy(buf, "choice");
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("%s", buf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
void replace_button_icon(GladeXML * xml, GdkDrawable * window,
|
||||||
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
GtkStyle * style, gchar * btn_name, gchar ** xpm)
|
||||||
{
|
{
|
||||||
@ -456,19 +400,9 @@ static void text_insert_help(struct menu *menu)
|
|||||||
GtkTextBuffer *buffer;
|
GtkTextBuffer *buffer;
|
||||||
GtkTextIter start, end;
|
GtkTextIter start, end;
|
||||||
const char *prompt = _(menu_get_prompt(menu));
|
const char *prompt = _(menu_get_prompt(menu));
|
||||||
gchar *name;
|
struct gstr help = str_new();
|
||||||
const char *help;
|
|
||||||
|
|
||||||
help = menu_get_help(menu);
|
menu_get_ext_help(menu, &help);
|
||||||
|
|
||||||
/* Gettextize if the help text not empty */
|
|
||||||
if ((help != 0) && (help[0] != 0))
|
|
||||||
help = _(help);
|
|
||||||
|
|
||||||
if (menu->sym && menu->sym->name)
|
|
||||||
name = g_strdup_printf(menu->sym->name);
|
|
||||||
else
|
|
||||||
name = g_strdup("");
|
|
||||||
|
|
||||||
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
|
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
|
||||||
gtk_text_buffer_get_bounds(buffer, &start, &end);
|
gtk_text_buffer_get_bounds(buffer, &start, &end);
|
||||||
@ -478,14 +412,11 @@ static void text_insert_help(struct menu *menu)
|
|||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
|
gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
|
||||||
NULL);
|
NULL);
|
||||||
gtk_text_buffer_insert_at_cursor(buffer, " ", 1);
|
|
||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, name, -1, tag1,
|
|
||||||
NULL);
|
|
||||||
gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
|
gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
|
||||||
gtk_text_buffer_get_end_iter(buffer, &end);
|
gtk_text_buffer_get_end_iter(buffer, &end);
|
||||||
gtk_text_buffer_insert_with_tags(buffer, &end, help, -1, tag2,
|
gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
|
||||||
NULL);
|
NULL);
|
||||||
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -710,20 +641,29 @@ void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_all = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_NORMAL;
|
||||||
|
|
||||||
gtk_tree_store_clear(tree2);
|
gtk_tree_store_clear(tree2);
|
||||||
display_tree(&rootmenu); // instead of update_tree to speed-up
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data)
|
on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
{
|
{
|
||||||
show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active;
|
opt_mode = OPT_ALL;
|
||||||
update_tree(&rootmenu, NULL);
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
|
||||||
|
{
|
||||||
|
opt_mode = OPT_PROMPT;
|
||||||
|
gtk_tree_store_clear(tree2);
|
||||||
|
display_tree(&rootmenu); /* instead of update_tree to speed-up */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1174,9 +1114,12 @@ static gchar **fill_row(struct menu *menu)
|
|||||||
|
|
||||||
row[COL_OPTION] =
|
row[COL_OPTION] =
|
||||||
g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
|
g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
|
||||||
sym && sym_has_value(sym) ? "(NEW)" : "");
|
sym && !sym_has_value(sym) ? "(NEW)" : "");
|
||||||
|
|
||||||
if (show_all && !menu_is_visible(menu))
|
if (opt_mode == OPT_ALL && !menu_is_visible(menu))
|
||||||
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
|
else if (opt_mode == OPT_PROMPT &&
|
||||||
|
menu_has_prompt(menu) && !menu_is_visible(menu))
|
||||||
row[COL_COLOR] = g_strdup("DarkGray");
|
row[COL_COLOR] = g_strdup("DarkGray");
|
||||||
else
|
else
|
||||||
row[COL_COLOR] = g_strdup("Black");
|
row[COL_COLOR] = g_strdup("Black");
|
||||||
@ -1399,16 +1342,20 @@ static void update_tree(struct menu *src, GtkTreeIter * dst)
|
|||||||
menu2 ? menu_get_prompt(menu2) : "nil");
|
menu2 ? menu_get_prompt(menu2) : "nil");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!menu_is_visible(child1) && !show_all) { // remove node
|
if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) ||
|
||||||
|
(opt_mode == OPT_ALL && !menu_get_prompt(child1))) {
|
||||||
|
|
||||||
|
/* remove node */
|
||||||
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
if (gtktree_iter_find_node(dst, menu1) != NULL) {
|
||||||
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
memcpy(&tmp, child2, sizeof(GtkTreeIter));
|
||||||
valid = gtk_tree_model_iter_next(model2,
|
valid = gtk_tree_model_iter_next(model2,
|
||||||
child2);
|
child2);
|
||||||
gtk_tree_store_remove(tree2, &tmp);
|
gtk_tree_store_remove(tree2, &tmp);
|
||||||
if (!valid)
|
if (!valid)
|
||||||
return; // next parent
|
return; /* next parent */
|
||||||
else
|
else
|
||||||
goto reparse; // next child
|
goto reparse; /* next child */
|
||||||
} else
|
} else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1477,17 +1424,19 @@ static void display_tree(struct menu *menu)
|
|||||||
&& (tree == tree2))
|
&& (tree == tree2))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (menu_is_visible(child) || show_all)
|
if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
|
||||||
|
(opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
|
||||||
|
(opt_mode == OPT_ALL && menu_get_prompt(child)))
|
||||||
place_node(child, fill_row(child));
|
place_node(child, fill_row(child));
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
|
||||||
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
|
||||||
dbg_print_ptype(ptype);
|
printf("%s", prop_get_type_name(ptype));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
if (sym) {
|
if (sym) {
|
||||||
dbg_print_stype(sym->type);
|
printf("%s", sym_type_name(sym->type));
|
||||||
printf(" | ");
|
printf(" | ");
|
||||||
dbg_print_flags(sym->flags);
|
printf("%s", dbg_sym_flags(sym->flags));
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else
|
} else
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -190,26 +190,40 @@
|
|||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_all_options1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="tooltip" translatable="yes">Show normal options</property>
|
||||||
|
<property name="label" translatable="yes">Show normal options</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
<property name="active">True</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode1_activate"/>
|
||||||
|
</widget>
|
||||||
|
</child>
|
||||||
|
|
||||||
|
<child>
|
||||||
|
<widget class="GtkRadioMenuItem" id="set_option_mode2">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show all options</property>
|
<property name="tooltip" translatable="yes">Show all options</property>
|
||||||
<property name="label" translatable="yes">Show all _options</property>
|
<property name="label" translatable="yes">Show all _options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_all_options1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode2_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
<child>
|
<child>
|
||||||
<widget class="GtkCheckMenuItem" id="show_debug_info1">
|
<widget class="GtkRadioMenuItem" id="set_option_mode3">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="tooltip" translatable="yes">Show masked options</property>
|
<property name="tooltip" translatable="yes">Show all options with prompts</property>
|
||||||
<property name="label" translatable="yes">Show _debug info</property>
|
<property name="label" translatable="yes">Show all prompt options</property>
|
||||||
<property name="use_underline">True</property>
|
<property name="use_underline">True</property>
|
||||||
<property name="active">False</property>
|
<property name="active">False</property>
|
||||||
<signal name="activate" handler="on_show_debug_info1_activate"/>
|
<property name="group">set_option_mode1</property>
|
||||||
|
<signal name="activate" handler="on_set_option_mode3_activate"/>
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
</widget>
|
</widget>
|
||||||
</child>
|
</child>
|
||||||
</widget>
|
</widget>
|
||||||
@ -547,7 +561,7 @@
|
|||||||
<property name="headers_visible">True</property>
|
<property name="headers_visible">True</property>
|
||||||
<property name="rules_hint">False</property>
|
<property name="rules_hint">False</property>
|
||||||
<property name="reorderable">False</property>
|
<property name="reorderable">False</property>
|
||||||
<property name="enable_search">True</property>
|
<property name="enable_search">False</property>
|
||||||
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/>
|
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/>
|
||||||
<signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/>
|
<signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/>
|
||||||
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/>
|
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/>
|
||||||
@ -582,7 +596,7 @@
|
|||||||
<property name="headers_visible">True</property>
|
<property name="headers_visible">True</property>
|
||||||
<property name="rules_hint">False</property>
|
<property name="rules_hint">False</property>
|
||||||
<property name="reorderable">False</property>
|
<property name="reorderable">False</property>
|
||||||
<property name="enable_search">True</property>
|
<property name="enable_search">False</property>
|
||||||
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/>
|
<signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/>
|
||||||
<signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/>
|
<signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/>
|
||||||
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/>
|
<signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/>
|
||||||
|
@ -1,379 +0,0 @@
|
|||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
The configuration database is a collection of configuration options
|
|
||||||
organized in a tree structure:
|
|
||||||
|
|
||||||
+- Code maturity level options
|
|
||||||
| +- Prompt for development and/or incomplete code/drivers
|
|
||||||
+- General setup
|
|
||||||
| +- Networking support
|
|
||||||
| +- System V IPC
|
|
||||||
| +- BSD Process Accounting
|
|
||||||
| +- Sysctl support
|
|
||||||
+- Loadable module support
|
|
||||||
| +- Enable loadable module support
|
|
||||||
| +- Set version information on all module symbols
|
|
||||||
| +- Kernel module loader
|
|
||||||
+- ...
|
|
||||||
|
|
||||||
Every entry has its own dependencies. These dependencies are used
|
|
||||||
to determine the visibility of an entry. Any child entry is only
|
|
||||||
visible if its parent entry is also visible.
|
|
||||||
|
|
||||||
Menu entries
|
|
||||||
------------
|
|
||||||
|
|
||||||
Most entries define a config option; all other entries help to organize
|
|
||||||
them. A single configuration option is defined like this:
|
|
||||||
|
|
||||||
config MODVERSIONS
|
|
||||||
bool "Set version information on all module symbols"
|
|
||||||
depends on MODULES
|
|
||||||
help
|
|
||||||
Usually, modules have to be recompiled whenever you switch to a new
|
|
||||||
kernel. ...
|
|
||||||
|
|
||||||
Every line starts with a key word and can be followed by multiple
|
|
||||||
arguments. "config" starts a new config entry. The following lines
|
|
||||||
define attributes for this config option. Attributes can be the type of
|
|
||||||
the config option, input prompt, dependencies, help text and default
|
|
||||||
values. A config option can be defined multiple times with the same
|
|
||||||
name, but every definition can have only a single input prompt and the
|
|
||||||
type must not conflict.
|
|
||||||
|
|
||||||
Menu attributes
|
|
||||||
---------------
|
|
||||||
|
|
||||||
A menu entry can have a number of attributes. Not all of them are
|
|
||||||
applicable everywhere (see syntax).
|
|
||||||
|
|
||||||
- type definition: "bool"/"tristate"/"string"/"hex"/"int"
|
|
||||||
Every config option must have a type. There are only two basic types:
|
|
||||||
tristate and string; the other types are based on these two. The type
|
|
||||||
definition optionally accepts an input prompt, so these two examples
|
|
||||||
are equivalent:
|
|
||||||
|
|
||||||
bool "Networking support"
|
|
||||||
and
|
|
||||||
bool
|
|
||||||
prompt "Networking support"
|
|
||||||
|
|
||||||
- input prompt: "prompt" <prompt> ["if" <expr>]
|
|
||||||
Every menu entry can have at most one prompt, which is used to display
|
|
||||||
to the user. Optionally dependencies only for this prompt can be added
|
|
||||||
with "if".
|
|
||||||
|
|
||||||
- default value: "default" <expr> ["if" <expr>]
|
|
||||||
A config option can have any number of default values. If multiple
|
|
||||||
default values are visible, only the first defined one is active.
|
|
||||||
Default values are not limited to the menu entry where they are
|
|
||||||
defined. This means the default can be defined somewhere else or be
|
|
||||||
overridden by an earlier definition.
|
|
||||||
The default value is only assigned to the config symbol if no other
|
|
||||||
value was set by the user (via the input prompt above). If an input
|
|
||||||
prompt is visible the default value is presented to the user and can
|
|
||||||
be overridden by him.
|
|
||||||
Optionally, dependencies only for this default value can be added with
|
|
||||||
"if".
|
|
||||||
|
|
||||||
- type definition + default value:
|
|
||||||
"def_bool"/"def_tristate" <expr> ["if" <expr>]
|
|
||||||
This is a shorthand notation for a type definition plus a value.
|
|
||||||
Optionally dependencies for this default value can be added with "if".
|
|
||||||
|
|
||||||
- dependencies: "depends on" <expr>
|
|
||||||
This defines a dependency for this menu entry. If multiple
|
|
||||||
dependencies are defined, they are connected with '&&'. Dependencies
|
|
||||||
are applied to all other options within this menu entry (which also
|
|
||||||
accept an "if" expression), so these two examples are equivalent:
|
|
||||||
|
|
||||||
bool "foo" if BAR
|
|
||||||
default y if BAR
|
|
||||||
and
|
|
||||||
depends on BAR
|
|
||||||
bool "foo"
|
|
||||||
default y
|
|
||||||
|
|
||||||
- reverse dependencies: "select" <symbol> ["if" <expr>]
|
|
||||||
While normal dependencies reduce the upper limit of a symbol (see
|
|
||||||
below), reverse dependencies can be used to force a lower limit of
|
|
||||||
another symbol. The value of the current menu symbol is used as the
|
|
||||||
minimal value <symbol> can be set to. If <symbol> is selected multiple
|
|
||||||
times, the limit is set to the largest selection.
|
|
||||||
Reverse dependencies can only be used with boolean or tristate
|
|
||||||
symbols.
|
|
||||||
Note:
|
|
||||||
select should be used with care. select will force
|
|
||||||
a symbol to a value without visiting the dependencies.
|
|
||||||
By abusing select you are able to select a symbol FOO even
|
|
||||||
if FOO depends on BAR that is not set.
|
|
||||||
In general use select only for non-visible symbols
|
|
||||||
(no prompts anywhere) and for symbols with no dependencies.
|
|
||||||
That will limit the usefulness but on the other hand avoid
|
|
||||||
the illegal configurations all over.
|
|
||||||
kconfig should one day warn about such things.
|
|
||||||
|
|
||||||
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
|
||||||
This allows to limit the range of possible input values for int
|
|
||||||
and hex symbols. The user can only input a value which is larger than
|
|
||||||
or equal to the first symbol and smaller than or equal to the second
|
|
||||||
symbol.
|
|
||||||
|
|
||||||
- help text: "help" or "---help---"
|
|
||||||
This defines a help text. The end of the help text is determined by
|
|
||||||
the indentation level, this means it ends at the first line which has
|
|
||||||
a smaller indentation than the first line of the help text.
|
|
||||||
"---help---" and "help" do not differ in behaviour, "---help---" is
|
|
||||||
used to help visually separate configuration logic from help within
|
|
||||||
the file as an aid to developers.
|
|
||||||
|
|
||||||
- misc options: "option" <symbol>[=<value>]
|
|
||||||
Various less common options can be defined via this option syntax,
|
|
||||||
which can modify the behaviour of the menu entry and its config
|
|
||||||
symbol. These options are currently possible:
|
|
||||||
|
|
||||||
- "defconfig_list"
|
|
||||||
This declares a list of default entries which can be used when
|
|
||||||
looking for the default configuration (which is used when the main
|
|
||||||
.config doesn't exists yet.)
|
|
||||||
|
|
||||||
- "modules"
|
|
||||||
This declares the symbol to be used as the MODULES symbol, which
|
|
||||||
enables the third modular state for all config symbols.
|
|
||||||
|
|
||||||
- "env"=<value>
|
|
||||||
This imports the environment variable into Kconfig. It behaves like
|
|
||||||
a default, except that the value comes from the environment, this
|
|
||||||
also means that the behaviour when mixing it with normal defaults is
|
|
||||||
undefined at this point. The symbol is currently not exported back
|
|
||||||
to the build environment (if this is desired, it can be done via
|
|
||||||
another symbol).
|
|
||||||
|
|
||||||
Menu dependencies
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
Dependencies define the visibility of a menu entry and can also reduce
|
|
||||||
the input range of tristate symbols. The tristate logic used in the
|
|
||||||
expressions uses one more state than normal boolean logic to express the
|
|
||||||
module state. Dependency expressions have the following syntax:
|
|
||||||
|
|
||||||
<expr> ::= <symbol> (1)
|
|
||||||
<symbol> '=' <symbol> (2)
|
|
||||||
<symbol> '!=' <symbol> (3)
|
|
||||||
'(' <expr> ')' (4)
|
|
||||||
'!' <expr> (5)
|
|
||||||
<expr> '&&' <expr> (6)
|
|
||||||
<expr> '||' <expr> (7)
|
|
||||||
|
|
||||||
Expressions are listed in decreasing order of precedence.
|
|
||||||
|
|
||||||
(1) Convert the symbol into an expression. Boolean and tristate symbols
|
|
||||||
are simply converted into the respective expression values. All
|
|
||||||
other symbol types result in 'n'.
|
|
||||||
(2) If the values of both symbols are equal, it returns 'y',
|
|
||||||
otherwise 'n'.
|
|
||||||
(3) If the values of both symbols are equal, it returns 'n',
|
|
||||||
otherwise 'y'.
|
|
||||||
(4) Returns the value of the expression. Used to override precedence.
|
|
||||||
(5) Returns the result of (2-/expr/).
|
|
||||||
(6) Returns the result of min(/expr/, /expr/).
|
|
||||||
(7) Returns the result of max(/expr/, /expr/).
|
|
||||||
|
|
||||||
An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
|
|
||||||
respectively for calculations). A menu entry becomes visible when it's
|
|
||||||
expression evaluates to 'm' or 'y'.
|
|
||||||
|
|
||||||
There are two types of symbols: constant and non-constant symbols.
|
|
||||||
Non-constant symbols are the most common ones and are defined with the
|
|
||||||
'config' statement. Non-constant symbols consist entirely of alphanumeric
|
|
||||||
characters or underscores.
|
|
||||||
Constant symbols are only part of expressions. Constant symbols are
|
|
||||||
always surrounded by single or double quotes. Within the quote, any
|
|
||||||
other character is allowed and the quotes can be escaped using '\'.
|
|
||||||
|
|
||||||
Menu structure
|
|
||||||
--------------
|
|
||||||
|
|
||||||
The position of a menu entry in the tree is determined in two ways. First
|
|
||||||
it can be specified explicitly:
|
|
||||||
|
|
||||||
menu "Network device support"
|
|
||||||
depends on NET
|
|
||||||
|
|
||||||
config NETDEVICES
|
|
||||||
...
|
|
||||||
|
|
||||||
endmenu
|
|
||||||
|
|
||||||
All entries within the "menu" ... "endmenu" block become a submenu of
|
|
||||||
"Network device support". All subentries inherit the dependencies from
|
|
||||||
the menu entry, e.g. this means the dependency "NET" is added to the
|
|
||||||
dependency list of the config option NETDEVICES.
|
|
||||||
|
|
||||||
The other way to generate the menu structure is done by analyzing the
|
|
||||||
dependencies. If a menu entry somehow depends on the previous entry, it
|
|
||||||
can be made a submenu of it. First, the previous (parent) symbol must
|
|
||||||
be part of the dependency list and then one of these two conditions
|
|
||||||
must be true:
|
|
||||||
- the child entry must become invisible, if the parent is set to 'n'
|
|
||||||
- the child entry must only be visible, if the parent is visible
|
|
||||||
|
|
||||||
config MODULES
|
|
||||||
bool "Enable loadable module support"
|
|
||||||
|
|
||||||
config MODVERSIONS
|
|
||||||
bool "Set version information on all module symbols"
|
|
||||||
depends on MODULES
|
|
||||||
|
|
||||||
comment "module support disabled"
|
|
||||||
depends on !MODULES
|
|
||||||
|
|
||||||
MODVERSIONS directly depends on MODULES, this means it's only visible if
|
|
||||||
MODULES is different from 'n'. The comment on the other hand is always
|
|
||||||
visible when MODULES is visible (the (empty) dependency of MODULES is
|
|
||||||
also part of the comment dependencies).
|
|
||||||
|
|
||||||
|
|
||||||
Kconfig syntax
|
|
||||||
--------------
|
|
||||||
|
|
||||||
The configuration file describes a series of menu entries, where every
|
|
||||||
line starts with a keyword (except help texts). The following keywords
|
|
||||||
end a menu entry:
|
|
||||||
- config
|
|
||||||
- menuconfig
|
|
||||||
- choice/endchoice
|
|
||||||
- comment
|
|
||||||
- menu/endmenu
|
|
||||||
- if/endif
|
|
||||||
- source
|
|
||||||
The first five also start the definition of a menu entry.
|
|
||||||
|
|
||||||
config:
|
|
||||||
|
|
||||||
"config" <symbol>
|
|
||||||
<config options>
|
|
||||||
|
|
||||||
This defines a config symbol <symbol> and accepts any of above
|
|
||||||
attributes as options.
|
|
||||||
|
|
||||||
menuconfig:
|
|
||||||
"menuconfig" <symbol>
|
|
||||||
<config options>
|
|
||||||
|
|
||||||
This is similar to the simple config entry above, but it also gives a
|
|
||||||
hint to front ends, that all suboptions should be displayed as a
|
|
||||||
separate list of options.
|
|
||||||
|
|
||||||
choices:
|
|
||||||
|
|
||||||
"choice"
|
|
||||||
<choice options>
|
|
||||||
<choice block>
|
|
||||||
"endchoice"
|
|
||||||
|
|
||||||
This defines a choice group and accepts any of the above attributes as
|
|
||||||
options. A choice can only be of type bool or tristate, while a boolean
|
|
||||||
choice only allows a single config entry to be selected, a tristate
|
|
||||||
choice also allows any number of config entries to be set to 'm'. This
|
|
||||||
can be used if multiple drivers for a single hardware exists and only a
|
|
||||||
single driver can be compiled/loaded into the kernel, but all drivers
|
|
||||||
can be compiled as modules.
|
|
||||||
A choice accepts another option "optional", which allows to set the
|
|
||||||
choice to 'n' and no entry needs to be selected.
|
|
||||||
|
|
||||||
comment:
|
|
||||||
|
|
||||||
"comment" <prompt>
|
|
||||||
<comment options>
|
|
||||||
|
|
||||||
This defines a comment which is displayed to the user during the
|
|
||||||
configuration process and is also echoed to the output files. The only
|
|
||||||
possible options are dependencies.
|
|
||||||
|
|
||||||
menu:
|
|
||||||
|
|
||||||
"menu" <prompt>
|
|
||||||
<menu options>
|
|
||||||
<menu block>
|
|
||||||
"endmenu"
|
|
||||||
|
|
||||||
This defines a menu block, see "Menu structure" above for more
|
|
||||||
information. The only possible options are dependencies.
|
|
||||||
|
|
||||||
if:
|
|
||||||
|
|
||||||
"if" <expr>
|
|
||||||
<if block>
|
|
||||||
"endif"
|
|
||||||
|
|
||||||
This defines an if block. The dependency expression <expr> is appended
|
|
||||||
to all enclosed menu entries.
|
|
||||||
|
|
||||||
source:
|
|
||||||
|
|
||||||
"source" <prompt>
|
|
||||||
|
|
||||||
This reads the specified configuration file. This file is always parsed.
|
|
||||||
|
|
||||||
mainmenu:
|
|
||||||
|
|
||||||
"mainmenu" <prompt>
|
|
||||||
|
|
||||||
This sets the config program's title bar if the config program chooses
|
|
||||||
to use it.
|
|
||||||
|
|
||||||
|
|
||||||
Kconfig hints
|
|
||||||
-------------
|
|
||||||
This is a collection of Kconfig tips, most of which aren't obvious at
|
|
||||||
first glance and most of which have become idioms in several Kconfig
|
|
||||||
files.
|
|
||||||
|
|
||||||
Adding common features and make the usage configurable
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
It is a common idiom to implement a feature/functionality that are
|
|
||||||
relevant for some architectures but not all.
|
|
||||||
The recommended way to do so is to use a config variable named HAVE_*
|
|
||||||
that is defined in a common Kconfig file and selected by the relevant
|
|
||||||
architectures.
|
|
||||||
An example is the generic IOMAP functionality.
|
|
||||||
|
|
||||||
We would in lib/Kconfig see:
|
|
||||||
|
|
||||||
# Generic IOMAP is used to ...
|
|
||||||
config HAVE_GENERIC_IOMAP
|
|
||||||
|
|
||||||
config GENERIC_IOMAP
|
|
||||||
depends on HAVE_GENERIC_IOMAP && FOO
|
|
||||||
|
|
||||||
And in lib/Makefile we would see:
|
|
||||||
obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
|
|
||||||
|
|
||||||
For each architecture using the generic IOMAP functionality we would see:
|
|
||||||
|
|
||||||
config X86
|
|
||||||
select ...
|
|
||||||
select HAVE_GENERIC_IOMAP
|
|
||||||
select ...
|
|
||||||
|
|
||||||
Note: we use the existing config option and avoid creating a new
|
|
||||||
config variable to select HAVE_GENERIC_IOMAP.
|
|
||||||
|
|
||||||
Note: the use of the internal config variable HAVE_GENERIC_IOMAP, it is
|
|
||||||
introduced to overcome the limitation of select which will force a
|
|
||||||
config option to 'y' no matter the dependencies.
|
|
||||||
The dependencies are moved to the symbol GENERIC_IOMAP and we avoid the
|
|
||||||
situation where select forces a symbol equals to 'y'.
|
|
||||||
|
|
||||||
Build as module only
|
|
||||||
~~~~~~~~~~~~~~~~~~~~
|
|
||||||
To restrict a component build to module-only, qualify its config symbol
|
|
||||||
with "depends on m". E.g.:
|
|
||||||
|
|
||||||
config FOO
|
|
||||||
depends on BAR && m
|
|
||||||
|
|
||||||
limits FOO to module (=m) or disabled (=n).
|
|
||||||
|
|
@ -1,917 +0,0 @@
|
|||||||
---
|
|
||||||
Makefile | 7 +++
|
|
||||||
README.buildroot2 | 22 ++++++++++
|
|
||||||
conf.c | 17 ++++----
|
|
||||||
confdata.c | 101 ++++++++++++++++++++++++++------------------------
|
|
||||||
expr.c | 42 ++++++++++----------
|
|
||||||
gconf.c | 4 -
|
|
||||||
gconf.glade | 2
|
|
||||||
mconf.c | 39 +++++++++----------
|
|
||||||
qconf.cc | 5 +-
|
|
||||||
util.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
||||||
zconf.tab.c_shipped | 2
|
|
||||||
zconf.y | 2
|
|
||||||
12 files changed, 244 insertions(+), 104 deletions(-)
|
|
||||||
|
|
||||||
Index: config/Makefile
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/Makefile
|
|
||||||
+++ config/Makefile
|
|
||||||
@@ -124,10 +124,21 @@
|
|
||||||
ifeq ($(MAKECMDGOALS),menuconfig)
|
|
||||||
hostprogs-y += mconf
|
|
||||||
endif
|
|
||||||
+ifeq ($(findstring mconf,$(MAKECMDGOALS)),mconf)
|
|
||||||
+ hostprogs-y += mconf
|
|
||||||
+endif
|
|
||||||
|
|
||||||
ifeq ($(MAKECMDGOALS),xconfig)
|
|
||||||
qconf-target := 1
|
|
||||||
endif
|
|
||||||
+ifeq ($(findstring qconf,$(MAKECMDGOALS)),qconf)
|
|
||||||
+ qconf-target := 1
|
|
||||||
+endif
|
|
||||||
+
|
|
||||||
ifeq ($(MAKECMDGOALS),gconfig)
|
|
||||||
gconf-target := 1
|
|
||||||
endif
|
|
||||||
+ifeq ($(findstring gconf,$(MAKECMDGOALS)),gconf)
|
|
||||||
+ gconf-target := 1
|
|
||||||
+endif
|
|
||||||
+
|
|
||||||
Index: config/README.buildroot2
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ config/README.buildroot2
|
|
||||||
@@ -0,0 +1,22 @@
|
|
||||||
+This is a copy of the kconfig code in the kernel (currently 2.6.24.4) tweaked
|
|
||||||
+to suit Buildroot.
|
|
||||||
+
|
|
||||||
+To update:
|
|
||||||
+ cp -r /usr/src/linux/scripts/kconfig package/config.new
|
|
||||||
+ cd package/config.new
|
|
||||||
+ cp /usr/src/linux/Documentation/kbuild/kconfig-language.txt .
|
|
||||||
+ patch -p1 < ../config/kconfig-to-buildroot2.patch
|
|
||||||
+ mv Makefile Makefile.kconfig
|
|
||||||
+ cp ../config/README.buildroot2 .
|
|
||||||
+ cp ../config/foo.h .
|
|
||||||
+ cp ../config/Makefile .
|
|
||||||
+ cp ../config/kconfig-to-buildroot2.patch .
|
|
||||||
+ cd ..
|
|
||||||
+ rm -rf config
|
|
||||||
+ mv config.new config
|
|
||||||
+
|
|
||||||
+Then verify the toplevel targets work:
|
|
||||||
+ config
|
|
||||||
+ defconfig
|
|
||||||
+ menuconfig
|
|
||||||
+ oldconfig
|
|
||||||
Index: config/conf.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/conf.c
|
|
||||||
+++ config/conf.c
|
|
||||||
@@ -496,13 +496,12 @@
|
|
||||||
}
|
|
||||||
name = av[optind];
|
|
||||||
conf_parse(name);
|
|
||||||
- //zconfdump(stdout);
|
|
||||||
if (sync_kconfig) {
|
|
||||||
name = conf_get_configname();
|
|
||||||
if (stat(name, &tmpstat)) {
|
|
||||||
fprintf(stderr, _("***\n"
|
|
||||||
- "*** You have not yet configured your kernel!\n"
|
|
||||||
- "*** (missing kernel config file \"%s\")\n"
|
|
||||||
+ "*** You have not yet configured Buildroot!\n"
|
|
||||||
+ "*** (missing .config file \"%s\")\n"
|
|
||||||
"***\n"
|
|
||||||
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
|
||||||
"*** \"make menuconfig\" or \"make xconfig\").\n"
|
|
||||||
@@ -557,7 +556,7 @@
|
|
||||||
name = getenv("KCONFIG_NOSILENTUPDATE");
|
|
||||||
if (name && *name) {
|
|
||||||
fprintf(stderr,
|
|
||||||
- _("\n*** Kernel configuration requires explicit update.\n\n"));
|
|
||||||
+ _("\n*** Buildroot configuration requires explicit update.\n\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -600,18 +599,22 @@
|
|
||||||
* All other commands are only used to generate a config.
|
|
||||||
*/
|
|
||||||
if (conf_get_changed() && conf_write(NULL)) {
|
|
||||||
- fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
|
||||||
+ fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
if (conf_write_autoconf()) {
|
|
||||||
- fprintf(stderr, _("\n*** Error during update of the kernel configuration.\n\n"));
|
|
||||||
+ fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (conf_write(NULL)) {
|
|
||||||
- fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
|
||||||
+ fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
+ if (conf_write_autoconf()) {
|
|
||||||
+ fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
|
||||||
+ return 1;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
Index: config/confdata.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/confdata.c
|
|
||||||
+++ config/confdata.c
|
|
||||||
@@ -11,6 +11,7 @@
|
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
+#include <libgen.h>
|
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
|
||||||
#include "lkc.h"
|
|
||||||
@@ -21,7 +22,7 @@
|
|
||||||
static const char *conf_filename;
|
|
||||||
static int conf_lineno, conf_warnings, conf_unsaved;
|
|
||||||
|
|
||||||
-const char conf_defname[] = "arch/$ARCH/defconfig";
|
|
||||||
+const char conf_defname[] = ".defconfig";
|
|
||||||
|
|
||||||
static void conf_warning(const char *fmt, ...)
|
|
||||||
{
|
|
||||||
@@ -36,16 +37,14 @@
|
|
||||||
|
|
||||||
const char *conf_get_configname(void)
|
|
||||||
{
|
|
||||||
- char *name = getenv("KCONFIG_CONFIG");
|
|
||||||
+ char *name = getenv("BUILDROOT_CONFIG");
|
|
||||||
|
|
||||||
return name ? name : ".config";
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *conf_get_autoconfig_name(void)
|
|
||||||
{
|
|
||||||
- char *name = getenv("KCONFIG_AUTOCONFIG");
|
|
||||||
-
|
|
||||||
- return name ? name : "include/config/auto.conf";
|
|
||||||
+ return getenv("KCONFIG_AUTOCONFIG");
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *conf_expand_value(const char *in)
|
|
||||||
@@ -219,22 +218,22 @@
|
|
||||||
sym = NULL;
|
|
||||||
switch (line[0]) {
|
|
||||||
case '#':
|
|
||||||
- if (memcmp(line + 2, "CONFIG_", 7))
|
|
||||||
+ if (line[1]!=' ')
|
|
||||||
continue;
|
|
||||||
- p = strchr(line + 9, ' ');
|
|
||||||
+ p = strchr(line + 2, ' ');
|
|
||||||
if (!p)
|
|
||||||
continue;
|
|
||||||
*p++ = 0;
|
|
||||||
if (strncmp(p, "is not set", 10))
|
|
||||||
continue;
|
|
||||||
if (def == S_DEF_USER) {
|
|
||||||
- sym = sym_find(line + 9);
|
|
||||||
+ sym = sym_find(line + 2);
|
|
||||||
if (!sym) {
|
|
||||||
sym_add_change_count(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
- sym = sym_lookup(line + 9, 0);
|
|
||||||
+ sym = sym_lookup(line + 2, 0);
|
|
||||||
if (sym->type == S_UNKNOWN)
|
|
||||||
sym->type = S_BOOLEAN;
|
|
||||||
}
|
|
||||||
@@ -251,12 +250,8 @@
|
|
||||||
;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
- case 'C':
|
|
||||||
- if (memcmp(line, "CONFIG_", 7)) {
|
|
||||||
- conf_warning("unexpected data");
|
|
||||||
- continue;
|
|
||||||
- }
|
|
||||||
- p = strchr(line + 7, '=');
|
|
||||||
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':
|
|
||||||
+ p = strchr(line, '=');
|
|
||||||
if (!p)
|
|
||||||
continue;
|
|
||||||
*p++ = 0;
|
|
||||||
@@ -267,13 +262,13 @@
|
|
||||||
*p2 = 0;
|
|
||||||
}
|
|
||||||
if (def == S_DEF_USER) {
|
|
||||||
- sym = sym_find(line + 7);
|
|
||||||
+ sym = sym_find(line);
|
|
||||||
if (!sym) {
|
|
||||||
sym_add_change_count(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
- sym = sym_lookup(line + 7, 0);
|
|
||||||
+ sym = sym_lookup(line, 0);
|
|
||||||
if (sym->type == S_UNKNOWN)
|
|
||||||
sym->type = S_OTHER;
|
|
||||||
}
|
|
||||||
@@ -443,7 +438,7 @@
|
|
||||||
if (!out)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
- sym = sym_lookup("KERNELVERSION", 0);
|
|
||||||
+ sym = sym_lookup("BR2_VERSION", 0);
|
|
||||||
sym_calc_value(sym);
|
|
||||||
time(&now);
|
|
||||||
env = getenv("KCONFIG_NOTIMESTAMP");
|
|
||||||
@@ -452,10 +447,8 @@
|
|
||||||
|
|
||||||
fprintf(out, _("#\n"
|
|
||||||
"# Automatically generated make config: don't edit\n"
|
|
||||||
- "# Linux kernel version: %s\n"
|
|
||||||
"%s%s"
|
|
||||||
"#\n"),
|
|
||||||
- sym_get_string_value(sym),
|
|
||||||
use_timestamp ? "# " : "",
|
|
||||||
use_timestamp ? ctime(&now) : "");
|
|
||||||
|
|
||||||
@@ -489,19 +482,19 @@
|
|
||||||
case S_TRISTATE:
|
|
||||||
switch (sym_get_tristate_value(sym)) {
|
|
||||||
case no:
|
|
||||||
- fprintf(out, "# CONFIG_%s is not set\n", sym->name);
|
|
||||||
+ fprintf(out, "# %s is not set\n", sym->name);
|
|
||||||
break;
|
|
||||||
case mod:
|
|
||||||
- fprintf(out, "CONFIG_%s=m\n", sym->name);
|
|
||||||
+ fprintf(out, "%s=m\n", sym->name);
|
|
||||||
break;
|
|
||||||
case yes:
|
|
||||||
- fprintf(out, "CONFIG_%s=y\n", sym->name);
|
|
||||||
+ fprintf(out, "%s=y\n", sym->name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case S_STRING:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
- fprintf(out, "CONFIG_%s=\"", sym->name);
|
|
||||||
+ fprintf(out, "%s=\"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
@@ -517,12 +510,12 @@
|
|
||||||
case S_HEX:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
|
||||||
- fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
+ fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case S_INT:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
- fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
+ fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -564,6 +557,7 @@
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
char path[128];
|
|
||||||
+ char *opwd, *dir, *_name;
|
|
||||||
char *s, *d, c;
|
|
||||||
struct symbol *sym;
|
|
||||||
struct stat sb;
|
|
||||||
@@ -572,8 +566,20 @@
|
|
||||||
name = conf_get_autoconfig_name();
|
|
||||||
conf_read_simple(name, S_DEF_AUTO);
|
|
||||||
|
|
||||||
- if (chdir("include/config"))
|
|
||||||
+ opwd = malloc(256);
|
|
||||||
+ _name = strdup(name);
|
|
||||||
+ if (opwd == NULL || _name == NULL)
|
|
||||||
return 1;
|
|
||||||
+ opwd = getcwd(opwd, 256);
|
|
||||||
+ dir = dirname(_name);
|
|
||||||
+ if (dir == NULL) {
|
|
||||||
+ res = 1;
|
|
||||||
+ goto err;
|
|
||||||
+ }
|
|
||||||
+ if (chdir(dir)) {
|
|
||||||
+ res = 1;
|
|
||||||
+ goto err;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
res = 0;
|
|
||||||
for_all_symbols(i, sym) {
|
|
||||||
@@ -666,9 +672,11 @@
|
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
- if (chdir("../.."))
|
|
||||||
- return 1;
|
|
||||||
-
|
|
||||||
+ if (chdir(opwd))
|
|
||||||
+ res = 1;
|
|
||||||
+err:
|
|
||||||
+ free(opwd);
|
|
||||||
+ free(_name);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -683,7 +691,7 @@
|
|
||||||
|
|
||||||
sym_clear_all_valid();
|
|
||||||
|
|
||||||
- file_write_dep("include/config/auto.conf.cmd");
|
|
||||||
+ file_write_dep(".config.cmd");
|
|
||||||
|
|
||||||
if (conf_split_config())
|
|
||||||
return 1;
|
|
||||||
@@ -698,22 +706,19 @@
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- sym = sym_lookup("KERNELVERSION", 0);
|
|
||||||
+ sym = sym_lookup("BR2_VERSION", 0);
|
|
||||||
sym_calc_value(sym);
|
|
||||||
time(&now);
|
|
||||||
fprintf(out, "#\n"
|
|
||||||
"# Automatically generated make config: don't edit\n"
|
|
||||||
- "# Linux kernel version: %s\n"
|
|
||||||
"# %s"
|
|
||||||
"#\n",
|
|
||||||
- sym_get_string_value(sym), ctime(&now));
|
|
||||||
+ ctime(&now));
|
|
||||||
fprintf(out_h, "/*\n"
|
|
||||||
" * Automatically generated C config: don't edit\n"
|
|
||||||
- " * Linux kernel version: %s\n"
|
|
||||||
" * %s"
|
|
||||||
- " */\n"
|
|
||||||
- "#define AUTOCONF_INCLUDED\n",
|
|
||||||
- sym_get_string_value(sym), ctime(&now));
|
|
||||||
+ " */\n",
|
|
||||||
+ ctime(&now));
|
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
|
||||||
sym_calc_value(sym);
|
|
||||||
@@ -726,19 +731,19 @@
|
|
||||||
case no:
|
|
||||||
break;
|
|
||||||
case mod:
|
|
||||||
- fprintf(out, "CONFIG_%s=m\n", sym->name);
|
|
||||||
- fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
|
|
||||||
+ fprintf(out, "%s=m\n", sym->name);
|
|
||||||
+ fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
|
||||||
break;
|
|
||||||
case yes:
|
|
||||||
- fprintf(out, "CONFIG_%s=y\n", sym->name);
|
|
||||||
- fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
|
|
||||||
+ fprintf(out, "%s=y\n", sym->name);
|
|
||||||
+ fprintf(out_h, "#define %s 1\n", sym->name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case S_STRING:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
- fprintf(out, "CONFIG_%s=\"", sym->name);
|
|
||||||
- fprintf(out_h, "#define CONFIG_%s \"", sym->name);
|
|
||||||
+ fprintf(out, "%s=\"", sym->name);
|
|
||||||
+ fprintf(out_h, "#define %s \"", sym->name);
|
|
||||||
while (1) {
|
|
||||||
l = strcspn(str, "\"\\");
|
|
||||||
if (l) {
|
|
||||||
@@ -758,14 +763,14 @@
|
|
||||||
case S_HEX:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
|
||||||
- fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
- fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
|
|
||||||
+ fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
+ fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case S_INT:
|
|
||||||
str = sym_get_string_value(sym);
|
|
||||||
- fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
|
||||||
- fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
|
|
||||||
+ fprintf(out, "%s=%s\n", sym->name, str);
|
|
||||||
+ fprintf(out_h, "#define %s %s\n", sym->name, str);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
Index: config/expr.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/expr.c
|
|
||||||
+++ config/expr.c
|
|
||||||
@@ -331,7 +331,7 @@
|
|
||||||
e->right.expr = expr_trans_bool(e->right.expr);
|
|
||||||
break;
|
|
||||||
case E_UNEQUAL:
|
|
||||||
- // FOO!=n -> FOO
|
|
||||||
+ /* FOO!=n -> FOO */
|
|
||||||
if (e->left.sym->type == S_TRISTATE) {
|
|
||||||
if (e->right.sym == &symbol_no) {
|
|
||||||
e->type = E_SYMBOL;
|
|
||||||
@@ -380,19 +380,19 @@
|
|
||||||
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
|
||||||
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
|
|
||||||
(e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
|
|
||||||
- // (a='y') || (a='m') -> (a!='n')
|
|
||||||
+ /* (a='y') || (a='m') -> (a!='n') */
|
|
||||||
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
|
|
||||||
}
|
|
||||||
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
|
||||||
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
|
|
||||||
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
|
|
||||||
- // (a='y') || (a='n') -> (a!='m')
|
|
||||||
+ /* (a='y') || (a='n') -> (a!='m') */
|
|
||||||
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
|
|
||||||
}
|
|
||||||
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
|
||||||
((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
|
|
||||||
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
|
|
||||||
- // (a='m') || (a='n') -> (a!='y')
|
|
||||||
+ /* (a='m') || (a='n') -> (a!='y') */
|
|
||||||
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -443,29 +443,29 @@
|
|
||||||
|
|
||||||
if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
|
|
||||||
(e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
|
|
||||||
- // (a) && (a='y') -> (a='y')
|
|
||||||
+ /* (a) && (a='y') -> (a='y') */
|
|
||||||
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
|
||||||
|
|
||||||
if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
|
|
||||||
(e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
|
|
||||||
- // (a) && (a!='n') -> (a)
|
|
||||||
+ /* (a) && (a!='n') -> (a) */
|
|
||||||
return expr_alloc_symbol(sym1);
|
|
||||||
|
|
||||||
if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
|
|
||||||
(e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
|
|
||||||
- // (a) && (a!='m') -> (a='y')
|
|
||||||
+ /* (a) && (a!='m') -> (a='y') */
|
|
||||||
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
|
||||||
|
|
||||||
if (sym1->type == S_TRISTATE) {
|
|
||||||
if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
|
|
||||||
- // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
|
|
||||||
+ /* (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' */
|
|
||||||
sym2 = e1->right.sym;
|
|
||||||
if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
|
|
||||||
return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
|
|
||||||
: expr_alloc_symbol(&symbol_no);
|
|
||||||
}
|
|
||||||
if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
|
|
||||||
- // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
|
|
||||||
+ /* (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' */
|
|
||||||
sym2 = e2->right.sym;
|
|
||||||
if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
|
|
||||||
return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
|
|
||||||
@@ -474,19 +474,19 @@
|
|
||||||
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
|
||||||
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
|
|
||||||
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
|
|
||||||
- // (a!='y') && (a!='n') -> (a='m')
|
|
||||||
+ /* (a!='y') && (a!='n') -> (a='m') */
|
|
||||||
return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
|
|
||||||
|
|
||||||
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
|
||||||
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
|
|
||||||
(e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
|
|
||||||
- // (a!='y') && (a!='m') -> (a='n')
|
|
||||||
+ /* (a!='y') && (a!='m') -> (a='n') */
|
|
||||||
return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
|
|
||||||
|
|
||||||
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
|
||||||
((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
|
|
||||||
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
|
|
||||||
- // (a!='m') && (a!='n') -> (a='m')
|
|
||||||
+ /* (a!='m') && (a!='n') -> (a='m') */
|
|
||||||
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
|
||||||
|
|
||||||
if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
|
|
||||||
@@ -579,7 +579,7 @@
|
|
||||||
switch (e1->type) {
|
|
||||||
case E_OR:
|
|
||||||
expr_eliminate_dups2(e1->type, &e1, &e1);
|
|
||||||
- // (FOO || BAR) && (!FOO && !BAR) -> n
|
|
||||||
+ /* (FOO || BAR) && (!FOO && !BAR) -> n */
|
|
||||||
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
|
||||||
tmp2 = expr_copy(e2);
|
|
||||||
tmp = expr_extract_eq_and(&tmp1, &tmp2);
|
|
||||||
@@ -594,7 +594,7 @@
|
|
||||||
break;
|
|
||||||
case E_AND:
|
|
||||||
expr_eliminate_dups2(e1->type, &e1, &e1);
|
|
||||||
- // (FOO && BAR) || (!FOO || !BAR) -> y
|
|
||||||
+ /* (FOO && BAR) || (!FOO || !BAR) -> y */
|
|
||||||
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
|
||||||
tmp2 = expr_copy(e2);
|
|
||||||
tmp = expr_extract_eq_or(&tmp1, &tmp2);
|
|
||||||
@@ -703,7 +703,7 @@
|
|
||||||
case E_NOT:
|
|
||||||
switch (e->left.expr->type) {
|
|
||||||
case E_NOT:
|
|
||||||
- // !!a -> a
|
|
||||||
+ /* !!a -> a */
|
|
||||||
tmp = e->left.expr->left.expr;
|
|
||||||
free(e->left.expr);
|
|
||||||
free(e);
|
|
||||||
@@ -712,14 +712,14 @@
|
|
||||||
break;
|
|
||||||
case E_EQUAL:
|
|
||||||
case E_UNEQUAL:
|
|
||||||
- // !a='x' -> a!='x'
|
|
||||||
+ /* !a='x' -> a!='x' */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
free(e);
|
|
||||||
e = tmp;
|
|
||||||
e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
|
|
||||||
break;
|
|
||||||
case E_OR:
|
|
||||||
- // !(a || b) -> !a && !b
|
|
||||||
+ /* !(a || b) -> !a && !b */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
e->type = E_AND;
|
|
||||||
e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
|
|
||||||
@@ -728,7 +728,7 @@
|
|
||||||
e = expr_transform(e);
|
|
||||||
break;
|
|
||||||
case E_AND:
|
|
||||||
- // !(a && b) -> !a || !b
|
|
||||||
+ /* !(a && b) -> !a || !b */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
e->type = E_OR;
|
|
||||||
e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
|
|
||||||
@@ -738,7 +738,7 @@
|
|
||||||
break;
|
|
||||||
case E_SYMBOL:
|
|
||||||
if (e->left.expr->left.sym == &symbol_yes) {
|
|
||||||
- // !'y' -> 'n'
|
|
||||||
+ /* !'y' -> 'n' */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
free(e);
|
|
||||||
e = tmp;
|
|
||||||
@@ -747,7 +747,7 @@
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (e->left.expr->left.sym == &symbol_mod) {
|
|
||||||
- // !'m' -> 'm'
|
|
||||||
+ /* !'m' -> 'm' */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
free(e);
|
|
||||||
e = tmp;
|
|
||||||
@@ -756,7 +756,7 @@
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (e->left.expr->left.sym == &symbol_no) {
|
|
||||||
- // !'n' -> 'y'
|
|
||||||
+ /* !'n' -> 'y' */
|
|
||||||
tmp = e->left.expr;
|
|
||||||
free(e);
|
|
||||||
e = tmp;
|
|
||||||
Index: config/gconf.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/gconf.c
|
|
||||||
+++ config/gconf.c
|
|
||||||
@@ -266,8 +266,8 @@
|
|
||||||
/*"style", PANGO_STYLE_OBLIQUE, */
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
- sprintf(title, _("Linux Kernel v%s Configuration"),
|
|
||||||
- getenv("KERNELVERSION"));
|
|
||||||
+ sprintf(title, _("Buildroot v%s Configuration"),
|
|
||||||
+ getenv("BR2_VERSION"));
|
|
||||||
gtk_window_set_title(GTK_WINDOW(main_wnd), title);
|
|
||||||
|
|
||||||
gtk_widget_show(main_wnd);
|
|
||||||
Index: config/gconf.glade
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/gconf.glade
|
|
||||||
+++ config/gconf.glade
|
|
||||||
@@ -5,7 +5,7 @@
|
|
||||||
|
|
||||||
<widget class="GtkWindow" id="window1">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
- <property name="title" translatable="yes">Gtk Kernel Configurator</property>
|
|
||||||
+ <property name="title" translatable="yes">Gtk Buildroot Configurator</property>
|
|
||||||
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
|
||||||
<property name="window_position">GTK_WIN_POS_NONE</property>
|
|
||||||
<property name="modal">False</property>
|
|
||||||
Index: config/mconf.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/mconf.c
|
|
||||||
+++ config/mconf.c
|
|
||||||
@@ -25,10 +25,9 @@
|
|
||||||
static const char mconf_readme[] = N_(
|
|
||||||
"Overview\n"
|
|
||||||
"--------\n"
|
|
||||||
-"Some kernel features may be built directly into the kernel.\n"
|
|
||||||
-"Some may be made into loadable runtime modules. Some features\n"
|
|
||||||
+"Some features may be built directly into Buildroot. Some features\n"
|
|
||||||
"may be completely removed altogether. There are also certain\n"
|
|
||||||
-"kernel parameters which are not really features, but must be\n"
|
|
||||||
+"parameters which are not really features, but must be\n"
|
|
||||||
"entered in as decimal or hexadecimal numbers or possibly text.\n"
|
|
||||||
"\n"
|
|
||||||
"Menu items beginning with following braces represent features that\n"
|
|
||||||
@@ -115,7 +114,7 @@
|
|
||||||
"-----------------------------\n"
|
|
||||||
"Menuconfig supports the use of alternate configuration files for\n"
|
|
||||||
"those who, for various reasons, find it necessary to switch\n"
|
|
||||||
-"between different kernel configurations.\n"
|
|
||||||
+"between different configurations.\n"
|
|
||||||
"\n"
|
|
||||||
"At the end of the main menu you will find two options. One is\n"
|
|
||||||
"for saving the current configuration to a file of your choosing.\n"
|
|
||||||
@@ -148,7 +147,7 @@
|
|
||||||
"\n"
|
|
||||||
"Optional personality available\n"
|
|
||||||
"------------------------------\n"
|
|
||||||
-"If you prefer to have all of the kernel options listed in a single\n"
|
|
||||||
+"If you prefer to have all of the options listed in a single\n"
|
|
||||||
"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
|
|
||||||
"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
|
|
||||||
"\n"
|
|
||||||
@@ -178,9 +177,9 @@
|
|
||||||
"Arrow keys navigate the menu. "
|
|
||||||
"<Enter> selects submenus --->. "
|
|
||||||
"Highlighted letters are hotkeys. "
|
|
||||||
- "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
|
|
||||||
+ "Pressing <Y> selectes a feature, while <N> will exclude a feature. "
|
|
||||||
"Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
|
|
||||||
- "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
|
|
||||||
+ "Legend: [*] feature is selected [ ] feature is excluded"),
|
|
||||||
radiolist_instructions[] = N_(
|
|
||||||
"Use the arrow keys to navigate this window or "
|
|
||||||
"press the hotkey of the item you wish to select "
|
|
||||||
@@ -200,18 +199,18 @@
|
|
||||||
"This feature depends on another which has been configured as a module.\n"
|
|
||||||
"As a result, this feature will be built as a module."),
|
|
||||||
nohelp_text[] = N_(
|
|
||||||
- "There is no help available for this kernel option.\n"),
|
|
||||||
+ "There is no help available for this option.\n"),
|
|
||||||
load_config_text[] = N_(
|
|
||||||
"Enter the name of the configuration file you wish to load. "
|
|
||||||
"Accept the name shown to restore the configuration you "
|
|
||||||
"last retrieved. Leave blank to abort."),
|
|
||||||
load_config_help[] = N_(
|
|
||||||
"\n"
|
|
||||||
- "For various reasons, one may wish to keep several different kernel\n"
|
|
||||||
+ "For various reasons, one may wish to keep several different Buildroot\n"
|
|
||||||
"configurations available on a single machine.\n"
|
|
||||||
"\n"
|
|
||||||
"If you have saved a previous configuration in a file other than the\n"
|
|
||||||
- "kernel's default, entering the name of the file here will allow you\n"
|
|
||||||
+ "Buildroot's default, entering the name of the file here will allow you\n"
|
|
||||||
"to modify that configuration.\n"
|
|
||||||
"\n"
|
|
||||||
"If you are uncertain, then you have probably never used alternate\n"
|
|
||||||
@@ -221,7 +220,7 @@
|
|
||||||
"as an alternate. Leave blank to abort."),
|
|
||||||
save_config_help[] = N_(
|
|
||||||
"\n"
|
|
||||||
- "For various reasons, one may wish to keep different kernel\n"
|
|
||||||
+ "For various reasons, one may wish to keep different Buildroot\n"
|
|
||||||
"configurations available on a single machine.\n"
|
|
||||||
"\n"
|
|
||||||
"Entering a file name here will allow you to later retrieve, modify\n"
|
|
||||||
@@ -364,10 +363,10 @@
|
|
||||||
int size;
|
|
||||||
struct symbol *sym;
|
|
||||||
|
|
||||||
- sym = sym_lookup("KERNELVERSION", 0);
|
|
||||||
+ sym = sym_lookup("BR2_VERSION", 0);
|
|
||||||
sym_calc_value(sym);
|
|
||||||
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
|
||||||
- _("%s - Linux Kernel v%s Configuration"),
|
|
||||||
+ _("%s - buildroot v%s Configuration"),
|
|
||||||
config_filename, sym_get_string_value(sym));
|
|
||||||
if (size >= sizeof(menu_backtitle))
|
|
||||||
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
|
||||||
@@ -902,7 +901,7 @@
|
|
||||||
if (conf_get_changed())
|
|
||||||
res = dialog_yesno(NULL,
|
|
||||||
_("Do you wish to save your "
|
|
||||||
- "new kernel configuration?\n"
|
|
||||||
+ "new Buildroot configuration?\n"
|
|
||||||
"<ESC><ESC> to continue."),
|
|
||||||
6, 60);
|
|
||||||
else
|
|
||||||
@@ -914,23 +913,23 @@
|
|
||||||
case 0:
|
|
||||||
if (conf_write(filename)) {
|
|
||||||
fprintf(stderr, _("\n\n"
|
|
||||||
- "Error during writing of the kernel configuration.\n"
|
|
||||||
- "Your kernel configuration changes were NOT saved."
|
|
||||||
+ "Error during writing of the Buildroot configuration.\n"
|
|
||||||
+ "Your Buildroot configuration changes were NOT saved."
|
|
||||||
"\n\n"));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
case -1:
|
|
||||||
printf(_("\n\n"
|
|
||||||
- "*** End of Linux kernel configuration.\n"
|
|
||||||
- "*** Execute 'make' to build the kernel or try 'make help'."
|
|
||||||
+ "*** End of Buildroot configuration.\n"
|
|
||||||
+ "*** Execute 'make' to build Buildroot or try 'make help'."
|
|
||||||
"\n\n"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, _("\n\n"
|
|
||||||
- "Your kernel configuration changes were NOT saved."
|
|
||||||
+ "Your Buildroot configuration changes were NOT saved."
|
|
||||||
"\n\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
- return 0;
|
|
||||||
+ return conf_write_autoconf();
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: config/qconf.cc
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/qconf.cc
|
|
||||||
+++ config/qconf.cc
|
|
||||||
@@ -1277,8 +1277,7 @@
|
|
||||||
char title[256];
|
|
||||||
|
|
||||||
QDesktopWidget *d = configApp->desktop();
|
|
||||||
- snprintf(title, sizeof(title), _("Linux Kernel v%s Configuration"),
|
|
||||||
- getenv("KERNELVERSION"));
|
|
||||||
+ snprintf(title, sizeof(title), _("Buildroot Configuration"));
|
|
||||||
setCaption(title);
|
|
||||||
|
|
||||||
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
|
||||||
@@ -1612,6 +1611,7 @@
|
|
||||||
{
|
|
||||||
if (!conf_get_changed()) {
|
|
||||||
e->accept();
|
|
||||||
+ conf_write_autoconf();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
|
|
||||||
@@ -1622,6 +1622,7 @@
|
|
||||||
switch (mb.exec()) {
|
|
||||||
case QMessageBox::Yes:
|
|
||||||
conf_write(NULL);
|
|
||||||
+ conf_write_autoconf();
|
|
||||||
case QMessageBox::No:
|
|
||||||
e->accept();
|
|
||||||
break;
|
|
||||||
Index: config/util.c
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/util.c
|
|
||||||
+++ config/util.c
|
|
||||||
@@ -26,6 +26,109 @@
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static char* br2_symbol_printer(const char * const in)
|
|
||||||
+{
|
|
||||||
+ ssize_t i, j, len = strlen(in);
|
|
||||||
+ char *ret;
|
|
||||||
+ if (len < 1)
|
|
||||||
+ return NULL;
|
|
||||||
+ ret = malloc(len);
|
|
||||||
+ if (!ret) {
|
|
||||||
+ printf("Out of memory!");
|
|
||||||
+ exit(1);
|
|
||||||
+ }
|
|
||||||
+ memset(ret, 0, len);
|
|
||||||
+ i = j = 0;
|
|
||||||
+ if (strncmp("BR2_", in, 4) == 0)
|
|
||||||
+ i += 4;
|
|
||||||
+ if (strncmp("PACKAGE_", in + i, 8) == 0)
|
|
||||||
+ i += 8;
|
|
||||||
+ else if (strncmp("TARGET_", in + i, 7) == 0)
|
|
||||||
+ i += 7;
|
|
||||||
+ while (i <= len)
|
|
||||||
+ ret[j++] = tolower(in[i++]);
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* write dependencies of the infividual config-symbols */
|
|
||||||
+static int write_make_deps(const char *name)
|
|
||||||
+{
|
|
||||||
+ struct menu *menu;
|
|
||||||
+ struct symbol *sym;
|
|
||||||
+ struct property *prop, *p;
|
|
||||||
+ unsigned done;
|
|
||||||
+ const char * const name_tmp = "..make.deps.tmp";
|
|
||||||
+ FILE *out;
|
|
||||||
+ if (!name)
|
|
||||||
+ name = ".auto.deps";
|
|
||||||
+ out = fopen(name_tmp, "w");
|
|
||||||
+ if (!out)
|
|
||||||
+ return 1;
|
|
||||||
+ fprintf(out, "# ATTENTION! This does not handle 'depends', just 'select'! \n"
|
|
||||||
+ "# See package/config/util.c write_make_deps()\n#\n");
|
|
||||||
+ menu = &rootmenu;//rootmenu.list;
|
|
||||||
+ while (menu) {
|
|
||||||
+ sym = menu->sym;
|
|
||||||
+ if (!sym) {
|
|
||||||
+ if (!menu_is_visible(menu))
|
|
||||||
+ goto next;
|
|
||||||
+ } else if (!(sym->flags & SYMBOL_CHOICE)) {
|
|
||||||
+ sym_calc_value(sym);
|
|
||||||
+ if (sym->type == S_BOOLEAN
|
|
||||||
+ && sym_get_tristate_value(sym) != no) {
|
|
||||||
+ done = 0;
|
|
||||||
+ for_all_prompts(sym, prop) {
|
|
||||||
+ struct expr *e;
|
|
||||||
+//printf("\nname=%s\n", sym->name);
|
|
||||||
+ for_all_properties(sym, p, P_SELECT) {
|
|
||||||
+ e = p->expr;
|
|
||||||
+ if (e && e->left.sym->name) {
|
|
||||||
+ if (!done) {
|
|
||||||
+ fprintf(out, "%s: $(BASE_TARGETS)", br2_symbol_printer(sym->name));
|
|
||||||
+ done = 1;
|
|
||||||
+ }
|
|
||||||
+//printf("SELECTS %s\n",e->left.sym->name);
|
|
||||||
+ fprintf(out, " %s",br2_symbol_printer(e->left.sym->name));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (done)
|
|
||||||
+ fprintf(out, "\n");
|
|
||||||
+#if 0
|
|
||||||
+ e = sym->rev_dep.expr;
|
|
||||||
+ if (e && e->type == E_SYMBOL
|
|
||||||
+ && e->left.sym->name) {
|
|
||||||
+ fprintf(out, "%s: %s", br2_symbol_printer(e->left.sym->name),
|
|
||||||
+ br2_symbol_printer(sym->name));
|
|
||||||
+printf("%s is Selected BY: %s", sym->name, e->left.sym->name);
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+next:
|
|
||||||
+ if (menu->list) {
|
|
||||||
+ menu = menu->list;
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ if (menu->next)
|
|
||||||
+ menu = menu->next;
|
|
||||||
+ else while ((menu = menu->parent)) {
|
|
||||||
+ if (menu->next) {
|
|
||||||
+ menu = menu->next;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ fclose(out);
|
|
||||||
+ rename(name_tmp, name);
|
|
||||||
+ printf(_("#\n"
|
|
||||||
+ "# make dependencies written to %s\n"
|
|
||||||
+ "# ATTENTION buildroot devels!\n"
|
|
||||||
+ "# See top of this file before playing with this auto-preprequisites!\n"
|
|
||||||
+ "#\n"), name);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* write a dependency file as used by kbuild to track dependencies */
|
|
||||||
int file_write_dep(const char *name)
|
|
||||||
{
|
|
||||||
@@ -68,7 +171,7 @@
|
|
||||||
fprintf(out, "\n$(deps_config): ;\n");
|
|
||||||
fclose(out);
|
|
||||||
rename("..config.tmp", name);
|
|
||||||
- return 0;
|
|
||||||
+ return write_make_deps(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Index: config/zconf.tab.c_shipped
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/zconf.tab.c_shipped
|
|
||||||
+++ config/zconf.tab.c_shipped
|
|
||||||
@@ -2259,7 +2259,7 @@
|
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
|
||||||
modules_sym->type = S_BOOLEAN;
|
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
|
||||||
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
|
||||||
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
|
||||||
|
|
||||||
#if YYDEBUG
|
|
||||||
if (getenv("ZCONF_DEBUG"))
|
|
||||||
Index: config/zconf.y
|
|
||||||
===================================================================
|
|
||||||
--- config.orig/zconf.y
|
|
||||||
+++ config/zconf.y
|
|
||||||
@@ -476,7 +476,7 @@
|
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
|
||||||
modules_sym->type = S_BOOLEAN;
|
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
|
||||||
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
|
||||||
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
|
||||||
|
|
||||||
#if YYDEBUG
|
|
||||||
if (getenv("ZCONF_DEBUG"))
|
|
@ -166,7 +166,7 @@ static int message__add(const char *msg, char *option, char *file, int lineno)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_build_message_list(struct menu *menu)
|
static void menu_build_message_list(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ static void message__print_gettext_msgid_msgstr(struct message *self)
|
|||||||
"msgstr \"\"\n", self->msg);
|
"msgstr \"\"\n", self->msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu__xgettext(void)
|
static void menu__xgettext(void)
|
||||||
{
|
{
|
||||||
struct message *m = message__list;
|
struct message *m = message__list;
|
||||||
|
|
||||||
|
@ -160,7 +160,15 @@ typedef unsigned int flex_uint32_t;
|
|||||||
|
|
||||||
/* Size of default input buffer. */
|
/* Size of default input buffer. */
|
||||||
#ifndef YY_BUF_SIZE
|
#ifndef YY_BUF_SIZE
|
||||||
|
#ifdef __ia64__
|
||||||
|
/* On IA-64, the buffer size is 16k, not 8k.
|
||||||
|
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
|
||||||
|
* Ditto for the __ia64__ case accordingly.
|
||||||
|
*/
|
||||||
|
#define YY_BUF_SIZE 32768
|
||||||
|
#else
|
||||||
#define YY_BUF_SIZE 16384
|
#define YY_BUF_SIZE 16384
|
||||||
|
#endif /* __ia64__ */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The state buf must be large enough to hold one state per character in the main buffer.
|
/* The state buf must be large enough to hold one state per character in the main buffer.
|
||||||
@ -802,7 +810,7 @@ static int last_ts, first_ts;
|
|||||||
static void zconf_endhelp(void);
|
static void zconf_endhelp(void);
|
||||||
static void zconf_endfile(void);
|
static void zconf_endfile(void);
|
||||||
|
|
||||||
void new_string(void)
|
static void new_string(void)
|
||||||
{
|
{
|
||||||
text = malloc(START_STRSIZE);
|
text = malloc(START_STRSIZE);
|
||||||
text_asize = START_STRSIZE;
|
text_asize = START_STRSIZE;
|
||||||
@ -810,7 +818,7 @@ void new_string(void)
|
|||||||
*text = 0;
|
*text = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void append_string(const char *str, int size)
|
static void append_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
int new_size = text_size + size + 1;
|
int new_size = text_size + size + 1;
|
||||||
if (new_size > text_asize) {
|
if (new_size > text_asize) {
|
||||||
@ -824,7 +832,7 @@ void append_string(const char *str, int size)
|
|||||||
text[text_size] = 0;
|
text[text_size] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alloc_string(const char *str, int size)
|
static void alloc_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
text = malloc(size + 1);
|
text = malloc(size + 1);
|
||||||
memcpy(text, str, size);
|
memcpy(text, str, size);
|
||||||
@ -914,7 +922,12 @@ static int input (void );
|
|||||||
|
|
||||||
/* Amount of stuff to slurp up with each read. */
|
/* Amount of stuff to slurp up with each read. */
|
||||||
#ifndef YY_READ_BUF_SIZE
|
#ifndef YY_READ_BUF_SIZE
|
||||||
|
#ifdef __ia64__
|
||||||
|
/* On IA-64, the buffer size is 16k, not 8k */
|
||||||
|
#define YY_READ_BUF_SIZE 16384
|
||||||
|
#else
|
||||||
#define YY_READ_BUF_SIZE 8192
|
#define YY_READ_BUF_SIZE 8192
|
||||||
|
#endif /* __ia64__ */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Copy whatever the last rule matched to the standard output. */
|
/* Copy whatever the last rule matched to the standard output. */
|
||||||
@ -922,7 +935,7 @@ static int input (void );
|
|||||||
/* This used to be an fputs(), but since the string might contain NUL's,
|
/* This used to be an fputs(), but since the string might contain NUL's,
|
||||||
* we now use fwrite().
|
* we now use fwrite().
|
||||||
*/
|
*/
|
||||||
#define ECHO fwrite( zconftext, zconfleng, 1, zconfout )
|
#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
||||||
@ -2060,8 +2073,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
|
|||||||
|
|
||||||
/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
|
/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
|
||||||
* scan from a @e copy of @a bytes.
|
* scan from a @e copy of @a bytes.
|
||||||
* @param bytes the byte buffer to scan
|
* @param yybytes the byte buffer to scan
|
||||||
* @param len the number of bytes in the buffer pointed to by @a bytes.
|
* @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
|
||||||
*
|
*
|
||||||
* @return the newly allocated buffer state object.
|
* @return the newly allocated buffer state object.
|
||||||
*/
|
*/
|
||||||
|
@ -72,6 +72,9 @@ void zconf_nextfile(const char *name);
|
|||||||
int zconf_lineno(void);
|
int zconf_lineno(void);
|
||||||
char *zconf_curname(void);
|
char *zconf_curname(void);
|
||||||
|
|
||||||
|
/* conf.c */
|
||||||
|
void xfgets(char *str, int size, FILE *in);
|
||||||
|
|
||||||
/* confdata.c */
|
/* confdata.c */
|
||||||
const char *conf_get_configname(void);
|
const char *conf_get_configname(void);
|
||||||
const char *conf_get_autoconfig_name(void);
|
const char *conf_get_autoconfig_name(void);
|
||||||
@ -80,11 +83,18 @@ void sym_set_change_count(int count);
|
|||||||
void sym_add_change_count(int count);
|
void sym_add_change_count(int count);
|
||||||
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
void conf_set_all_new_symbols(enum conf_def_mode mode);
|
||||||
|
|
||||||
|
/* confdata.c and expr.c */
|
||||||
|
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
|
||||||
|
{
|
||||||
|
if (fwrite(str, len, count, out) < count)
|
||||||
|
fprintf(stderr, "\nError in writing or end of file.\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* kconfig_load.c */
|
/* kconfig_load.c */
|
||||||
void kconfig_load(void);
|
void kconfig_load(void);
|
||||||
|
|
||||||
/* menu.c */
|
/* menu.c */
|
||||||
void menu_init(void);
|
void _menu_init(void);
|
||||||
void menu_warn(struct menu *menu, const char *fmt, ...);
|
void menu_warn(struct menu *menu, const char *fmt, ...);
|
||||||
struct menu *menu_add_menu(void);
|
struct menu *menu_add_menu(void);
|
||||||
void menu_end_menu(void);
|
void menu_end_menu(void);
|
||||||
@ -106,6 +116,11 @@ int file_write_dep(const char *name);
|
|||||||
struct gstr {
|
struct gstr {
|
||||||
size_t len;
|
size_t len;
|
||||||
char *s;
|
char *s;
|
||||||
|
/*
|
||||||
|
* when max_width is not zero long lines in string s (if any) get
|
||||||
|
* wrapped not to exceed the max_width value
|
||||||
|
*/
|
||||||
|
int max_width;
|
||||||
};
|
};
|
||||||
struct gstr str_new(void);
|
struct gstr str_new(void);
|
||||||
struct gstr str_assign(const char *s);
|
struct gstr str_assign(const char *s);
|
||||||
@ -121,6 +136,8 @@ void sym_init(void);
|
|||||||
void sym_clear_all_valid(void);
|
void sym_clear_all_valid(void);
|
||||||
void sym_set_all_changed(void);
|
void sym_set_all_changed(void);
|
||||||
void sym_set_changed(struct symbol *sym);
|
void sym_set_changed(struct symbol *sym);
|
||||||
|
struct symbol *sym_choice_default(struct symbol *sym);
|
||||||
|
const char *sym_get_string_default(struct symbol *sym);
|
||||||
struct symbol *sym_check_deps(struct symbol *sym);
|
struct symbol *sym_check_deps(struct symbol *sym);
|
||||||
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
||||||
struct symbol *prop_get_symbol(struct property *prop);
|
struct symbol *prop_get_symbol(struct property *prop);
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
P(conf_parse,void,(const char *name));
|
P(conf_parse,void,(const char *name));
|
||||||
P(conf_read,int,(const char *name));
|
P(conf_read,int,(const char *name));
|
||||||
P(conf_read_simple,int,(const char *name, int));
|
P(conf_read_simple,int,(const char *name, int));
|
||||||
|
P(conf_write_defconfig,int,(const char *name));
|
||||||
P(conf_write,int,(const char *name));
|
P(conf_write,int,(const char *name));
|
||||||
P(conf_write_autoconf,int,(void));
|
P(conf_write_autoconf,int,(void));
|
||||||
P(conf_get_changed,bool,(void));
|
P(conf_get_changed,bool,(void));
|
||||||
@ -12,11 +13,15 @@ P(conf_set_changed_callback, void,(void (*fn)(void)));
|
|||||||
P(rootmenu,struct menu,);
|
P(rootmenu,struct menu,);
|
||||||
|
|
||||||
P(menu_is_visible, bool, (struct menu *menu));
|
P(menu_is_visible, bool, (struct menu *menu));
|
||||||
|
P(menu_has_prompt, bool, (struct menu *menu));
|
||||||
P(menu_get_prompt,const char *,(struct menu *menu));
|
P(menu_get_prompt,const char *,(struct menu *menu));
|
||||||
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
||||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
||||||
P(menu_has_help,bool,(struct menu *menu));
|
P(menu_has_help,bool,(struct menu *menu));
|
||||||
P(menu_get_help,const char *,(struct menu *menu));
|
P(menu_get_help,const char *,(struct menu *menu));
|
||||||
|
P(get_symbol_str, void, (struct gstr *r, struct symbol *sym));
|
||||||
|
P(get_relations_str, struct gstr, (struct symbol **sym_arr));
|
||||||
|
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
||||||
|
4
package/config/lxdialog/.gitignore
vendored
Normal file
4
package/config/lxdialog/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#
|
||||||
|
# Generated files
|
||||||
|
#
|
||||||
|
lxdialog
|
@ -31,6 +31,10 @@ static int list_width, check_x, item_x;
|
|||||||
static void print_item(WINDOW * win, int choice, int selected)
|
static void print_item(WINDOW * win, int choice, int selected)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
char *list_item = malloc(list_width + 1);
|
||||||
|
|
||||||
|
strncpy(list_item, item_str(), list_width - item_x);
|
||||||
|
list_item[list_width - item_x] = '\0';
|
||||||
|
|
||||||
/* Clear 'residue' of last item */
|
/* Clear 'residue' of last item */
|
||||||
wattrset(win, dlg.menubox.atr);
|
wattrset(win, dlg.menubox.atr);
|
||||||
@ -45,13 +49,14 @@ static void print_item(WINDOW * win, int choice, int selected)
|
|||||||
wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
|
wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
|
||||||
|
|
||||||
wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
|
wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
|
||||||
mvwaddch(win, choice, item_x, item_str()[0]);
|
mvwaddch(win, choice, item_x, list_item[0]);
|
||||||
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
|
||||||
waddstr(win, (char *)item_str() + 1);
|
waddstr(win, list_item + 1);
|
||||||
if (selected) {
|
if (selected) {
|
||||||
wmove(win, choice, check_x + 1);
|
wmove(win, choice, check_x + 1);
|
||||||
wrefresh(win);
|
wrefresh(win);
|
||||||
}
|
}
|
||||||
|
free(list_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -175,6 +180,7 @@ do_resize:
|
|||||||
check_x = 0;
|
check_x = 0;
|
||||||
item_foreach()
|
item_foreach()
|
||||||
check_x = MAX(check_x, strlen(item_str()) + 4);
|
check_x = MAX(check_x, strlen(item_str()) + 4);
|
||||||
|
check_x = MIN(check_x, list_width);
|
||||||
|
|
||||||
check_x = (list_width - check_x) / 2;
|
check_x = (list_width - check_x) / 2;
|
||||||
item_x = check_x + 4;
|
item_x = check_x + 4;
|
||||||
|
@ -180,7 +180,7 @@ do_resize:
|
|||||||
case KEY_LEFT:
|
case KEY_LEFT:
|
||||||
switch (button) {
|
switch (button) {
|
||||||
case -1:
|
case -1:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
@ -204,7 +204,7 @@ do_resize:
|
|||||||
print_buttons(dialog, height, width, 0);
|
print_buttons(dialog, height, width, 0);
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
button = 1; /* Indicates "Cancel" button is selected */
|
button = 1; /* Indicates "Help" button is selected */
|
||||||
print_buttons(dialog, height, width, 1);
|
print_buttons(dialog, height, width, 1);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -383,6 +383,10 @@ do_resize:
|
|||||||
case 'n':
|
case 'n':
|
||||||
case 'm':
|
case 'm':
|
||||||
case '/':
|
case '/':
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
case 'z':
|
||||||
|
case '\n':
|
||||||
/* save scroll info */
|
/* save scroll info */
|
||||||
*s_scroll = scroll;
|
*s_scroll = scroll;
|
||||||
delwin(menu);
|
delwin(menu);
|
||||||
@ -390,8 +394,10 @@ do_resize:
|
|||||||
item_set(scroll + choice);
|
item_set(scroll + choice);
|
||||||
item_set_selected(1);
|
item_set_selected(1);
|
||||||
switch (key) {
|
switch (key) {
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
return 2;
|
||||||
case 's':
|
case 's':
|
||||||
return 3;
|
|
||||||
case 'y':
|
case 'y':
|
||||||
return 3;
|
return 3;
|
||||||
case 'n':
|
case 'n':
|
||||||
@ -402,18 +408,12 @@ do_resize:
|
|||||||
return 6;
|
return 6;
|
||||||
case '/':
|
case '/':
|
||||||
return 7;
|
return 7;
|
||||||
|
case 'z':
|
||||||
|
return 8;
|
||||||
|
case '\n':
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case 'h':
|
|
||||||
case '?':
|
|
||||||
button = 2;
|
|
||||||
case '\n':
|
|
||||||
*s_scroll = scroll;
|
|
||||||
delwin(menu);
|
|
||||||
delwin(dialog);
|
|
||||||
item_set(scroll + choice);
|
|
||||||
item_set_selected(1);
|
|
||||||
return button;
|
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'x':
|
case 'x':
|
||||||
key = KEY_ESC;
|
key = KEY_ESC;
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "dialog.h"
|
#include "dialog.h"
|
||||||
|
|
||||||
struct dialog_info dlg;
|
struct dialog_info dlg;
|
||||||
|
@ -66,13 +66,15 @@ static const char mconf_readme[] = N_(
|
|||||||
" there is a delayed response which you may find annoying.\n"
|
" there is a delayed response which you may find annoying.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
||||||
" <Exit> and <Help>\n"
|
" <Exit> and <Help>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
||||||
" and Press <ENTER>.\n"
|
" and press <ENTER>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Shortcut: Press <H> or <?>.\n"
|
" Shortcut: Press <H> or <?>.\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
"o To toggle the display of hidden options, press <Z>.\n"
|
||||||
|
"\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Radiolists (Choice lists)\n"
|
"Radiolists (Choice lists)\n"
|
||||||
"-----------\n"
|
"-----------\n"
|
||||||
@ -198,8 +200,6 @@ inputbox_instructions_string[] = N_(
|
|||||||
setmod_text[] = N_(
|
setmod_text[] = N_(
|
||||||
"This feature depends on another which has been configured as a module.\n"
|
"This feature depends on another which has been configured as a module.\n"
|
||||||
"As a result, this feature will be built as a module."),
|
"As a result, this feature will be built as a module."),
|
||||||
nohelp_text[] = N_(
|
|
||||||
"There is no help available for this option.\n"),
|
|
||||||
load_config_text[] = N_(
|
load_config_text[] = N_(
|
||||||
"Enter the name of the configuration file you wish to load. "
|
"Enter the name of the configuration file you wish to load. "
|
||||||
"Accept the name shown to restore the configuration you "
|
"Accept the name shown to restore the configuration you "
|
||||||
@ -214,7 +214,7 @@ load_config_help[] = N_(
|
|||||||
"to modify that configuration.\n"
|
"to modify that configuration.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"If you are uncertain, then you have probably never used alternate\n"
|
"If you are uncertain, then you have probably never used alternate\n"
|
||||||
"configuration files. You should therefor leave this blank to abort.\n"),
|
"configuration files. You should therefore leave this blank to abort.\n"),
|
||||||
save_config_text[] = N_(
|
save_config_text[] = N_(
|
||||||
"Enter a filename to which this configuration should be saved "
|
"Enter a filename to which this configuration should be saved "
|
||||||
"as an alternate. Leave blank to abort."),
|
"as an alternate. Leave blank to abort."),
|
||||||
@ -273,6 +273,7 @@ static int indent;
|
|||||||
static struct menu *current_menu;
|
static struct menu *current_menu;
|
||||||
static int child_count;
|
static int child_count;
|
||||||
static int single_menu_mode;
|
static int single_menu_mode;
|
||||||
|
static int show_all_options;
|
||||||
|
|
||||||
static void conf(struct menu *menu);
|
static void conf(struct menu *menu);
|
||||||
static void conf_choice(struct menu *menu);
|
static void conf_choice(struct menu *menu);
|
||||||
@ -283,79 +284,6 @@ static void show_textbox(const char *title, const char *text, int r, int c);
|
|||||||
static void show_helptext(const char *title, const char *text);
|
static void show_helptext(const char *title, const char *text);
|
||||||
static void show_help(struct menu *menu);
|
static void show_help(struct menu *menu);
|
||||||
|
|
||||||
static void get_prompt_str(struct gstr *r, struct property *prop)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
struct menu *submenu[8], *menu;
|
|
||||||
|
|
||||||
str_printf(r, _("Prompt: %s\n"), _(prop->text));
|
|
||||||
str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
|
|
||||||
prop->menu->lineno);
|
|
||||||
if (!expr_is_yes(prop->visible.expr)) {
|
|
||||||
str_append(r, _(" Depends on: "));
|
|
||||||
expr_gstr_print(prop->visible.expr, r);
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
menu = prop->menu->parent;
|
|
||||||
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
|
|
||||||
submenu[i++] = menu;
|
|
||||||
if (i > 0) {
|
|
||||||
str_printf(r, _(" Location:\n"));
|
|
||||||
for (j = 4; --i >= 0; j += 2) {
|
|
||||||
menu = submenu[i];
|
|
||||||
str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
|
|
||||||
if (menu->sym) {
|
|
||||||
str_printf(r, " (%s [=%s])", menu->sym->name ?
|
|
||||||
menu->sym->name : _("<choice>"),
|
|
||||||
sym_get_string_value(menu->sym));
|
|
||||||
}
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void get_symbol_str(struct gstr *r, struct symbol *sym)
|
|
||||||
{
|
|
||||||
bool hit;
|
|
||||||
struct property *prop;
|
|
||||||
|
|
||||||
if (sym && sym->name)
|
|
||||||
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
|
|
||||||
sym_get_string_value(sym));
|
|
||||||
for_all_prompts(sym, prop)
|
|
||||||
get_prompt_str(r, prop);
|
|
||||||
hit = false;
|
|
||||||
for_all_properties(sym, prop, P_SELECT) {
|
|
||||||
if (!hit) {
|
|
||||||
str_append(r, " Selects: ");
|
|
||||||
hit = true;
|
|
||||||
} else
|
|
||||||
str_printf(r, " && ");
|
|
||||||
expr_gstr_print(prop->expr, r);
|
|
||||||
}
|
|
||||||
if (hit)
|
|
||||||
str_append(r, "\n");
|
|
||||||
if (sym->rev_dep.expr) {
|
|
||||||
str_append(r, _(" Selected by: "));
|
|
||||||
expr_gstr_print(sym->rev_dep.expr, r);
|
|
||||||
str_append(r, "\n");
|
|
||||||
}
|
|
||||||
str_append(r, "\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct gstr get_relations_str(struct symbol **sym_arr)
|
|
||||||
{
|
|
||||||
struct symbol *sym;
|
|
||||||
struct gstr res = str_new();
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
|
||||||
get_symbol_str(&res, sym);
|
|
||||||
if (!i)
|
|
||||||
str_append(&res, _("No matches found.\n"));
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char filename[PATH_MAX+1];
|
static char filename[PATH_MAX+1];
|
||||||
static void set_config_filename(const char *config_filename)
|
static void set_config_filename(const char *config_filename)
|
||||||
{
|
{
|
||||||
@ -420,8 +348,16 @@ static void build_conf(struct menu *menu)
|
|||||||
int type, tmp, doint = 2;
|
int type, tmp, doint = 2;
|
||||||
tristate val;
|
tristate val;
|
||||||
char ch;
|
char ch;
|
||||||
|
bool visible;
|
||||||
|
|
||||||
if (!menu_is_visible(menu))
|
/*
|
||||||
|
* note: menu_is_visible() has side effect that it will
|
||||||
|
* recalc the value of the symbol.
|
||||||
|
*/
|
||||||
|
visible = menu_is_visible(menu);
|
||||||
|
if (show_all_options && !menu_has_prompt(menu))
|
||||||
|
return;
|
||||||
|
else if (!show_all_options && !visible)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
@ -680,6 +616,9 @@ static void conf(struct menu *menu)
|
|||||||
case 7:
|
case 7:
|
||||||
search_conf();
|
search_conf();
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
show_all_options = !show_all_options;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -698,19 +637,10 @@ static void show_helptext(const char *title, const char *text)
|
|||||||
static void show_help(struct menu *menu)
|
static void show_help(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct gstr help = str_new();
|
struct gstr help = str_new();
|
||||||
struct symbol *sym = menu->sym;
|
|
||||||
|
|
||||||
if (menu_has_help(menu))
|
help.max_width = getmaxx(stdscr) - 10;
|
||||||
{
|
menu_get_ext_help(menu, &help);
|
||||||
if (sym->name) {
|
|
||||||
str_printf(&help, "CONFIG_%s:\n\n", sym->name);
|
|
||||||
str_append(&help, _(menu_get_help(menu)));
|
|
||||||
str_append(&help, "\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
str_append(&help, nohelp_text);
|
|
||||||
}
|
|
||||||
get_symbol_str(&help, sym);
|
|
||||||
show_helptext(_(menu_get_prompt(menu)), str_get(&help));
|
show_helptext(_(menu_get_prompt(menu)), str_get(&help));
|
||||||
str_free(&help);
|
str_free(&help);
|
||||||
}
|
}
|
||||||
@ -887,6 +817,8 @@ int main(int ac, char **av)
|
|||||||
single_menu_mode = 1;
|
single_menu_mode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initscr();
|
||||||
|
|
||||||
getyx(stdscr, saved_y, saved_x);
|
getyx(stdscr, saved_y, saved_x);
|
||||||
if (init_dialog(NULL)) {
|
if (init_dialog(NULL)) {
|
||||||
fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
|
fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
|
||||||
@ -930,6 +862,6 @@ int main(int ac, char **av)
|
|||||||
"\n\n"));
|
"\n\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return conf_write_autoconf();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
|
static const char nohelp_text[] = N_(
|
||||||
|
"There is no help available for this kernel option.\n");
|
||||||
|
|
||||||
struct menu rootmenu;
|
struct menu rootmenu;
|
||||||
static struct menu **last_entry_ptr;
|
static struct menu **last_entry_ptr;
|
||||||
|
|
||||||
@ -35,7 +38,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_init(void)
|
void _menu_init(void)
|
||||||
{
|
{
|
||||||
current_entry = current_menu = &rootmenu;
|
current_entry = current_menu = &rootmenu;
|
||||||
last_entry_ptr = &rootmenu.list;
|
last_entry_ptr = &rootmenu.list;
|
||||||
@ -55,6 +58,8 @@ void menu_add_entry(struct symbol *sym)
|
|||||||
*last_entry_ptr = menu;
|
*last_entry_ptr = menu;
|
||||||
last_entry_ptr = &menu->next;
|
last_entry_ptr = &menu->next;
|
||||||
current_entry = menu;
|
current_entry = menu;
|
||||||
|
if (sym)
|
||||||
|
menu_add_symbol(P_SYMBOL, sym, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_end_entry(void)
|
void menu_end_entry(void)
|
||||||
@ -74,7 +79,7 @@ void menu_end_menu(void)
|
|||||||
current_menu = current_menu->parent;
|
current_menu = current_menu->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct expr *menu_check_dep(struct expr *e)
|
static struct expr *menu_check_dep(struct expr *e)
|
||||||
{
|
{
|
||||||
if (!e)
|
if (!e)
|
||||||
return e;
|
return e;
|
||||||
@ -102,6 +107,7 @@ struct expr *menu_check_dep(struct expr *e)
|
|||||||
void menu_add_dep(struct expr *dep)
|
void menu_add_dep(struct expr *dep)
|
||||||
{
|
{
|
||||||
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
||||||
|
current_entry->dir_dep = current_entry->dep;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_set_type(int type)
|
void menu_set_type(int type)
|
||||||
@ -184,7 +190,7 @@ static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
|
|||||||
(sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
|
(sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_check_prop(struct symbol *sym)
|
static void sym_check_prop(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct symbol *sym2;
|
struct symbol *sym2;
|
||||||
@ -194,7 +200,7 @@ void sym_check_prop(struct symbol *sym)
|
|||||||
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
||||||
prop->expr->type != E_SYMBOL)
|
prop->expr->type != E_SYMBOL)
|
||||||
prop_warn(prop,
|
prop_warn(prop,
|
||||||
"default for config symbol '%'"
|
"default for config symbol '%s'"
|
||||||
" must be a single symbol", sym->name);
|
" must be a single symbol", sym->name);
|
||||||
break;
|
break;
|
||||||
case P_SELECT:
|
case P_SELECT:
|
||||||
@ -285,6 +291,10 @@ void menu_finalize(struct menu *parent)
|
|||||||
for (menu = parent->list; menu; menu = menu->next)
|
for (menu = parent->list; menu; menu = menu->next)
|
||||||
menu_finalize(menu);
|
menu_finalize(menu);
|
||||||
} else if (sym) {
|
} else if (sym) {
|
||||||
|
/* ignore inherited dependencies for dir_dep */
|
||||||
|
sym->dir_dep.expr = expr_transform(expr_copy(parent->dir_dep));
|
||||||
|
sym->dir_dep.expr = expr_eliminate_dups(sym->dir_dep.expr);
|
||||||
|
|
||||||
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
||||||
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
||||||
basedep = expr_eliminate_dups(expr_transform(basedep));
|
basedep = expr_eliminate_dups(expr_transform(basedep));
|
||||||
@ -387,6 +397,13 @@ void menu_finalize(struct menu *parent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool menu_has_prompt(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (!menu->prompt)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool menu_is_visible(struct menu *menu)
|
bool menu_is_visible(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct menu *child;
|
struct menu *child;
|
||||||
@ -395,6 +412,7 @@ bool menu_is_visible(struct menu *menu)
|
|||||||
|
|
||||||
if (!menu->prompt)
|
if (!menu->prompt)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sym = menu->sym;
|
sym = menu->sym;
|
||||||
if (sym) {
|
if (sym) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
@ -404,12 +422,18 @@ bool menu_is_visible(struct menu *menu)
|
|||||||
|
|
||||||
if (visible != no)
|
if (visible != no)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (child = menu->list; child; child = child->next)
|
for (child = menu->list; child; child = child->next) {
|
||||||
if (menu_is_visible(child))
|
if (menu_is_visible(child)) {
|
||||||
|
if (sym)
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,3 +475,104 @@ const char *menu_get_help(struct menu *menu)
|
|||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_prompt_str(struct gstr *r, struct property *prop)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
struct menu *submenu[8], *menu;
|
||||||
|
|
||||||
|
str_printf(r, _("Prompt: %s\n"), _(prop->text));
|
||||||
|
str_printf(r, _(" Defined at %s:%d\n"), prop->menu->file->name,
|
||||||
|
prop->menu->lineno);
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
str_append(r, _(" Depends on: "));
|
||||||
|
expr_gstr_print(prop->visible.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
menu = prop->menu->parent;
|
||||||
|
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
|
||||||
|
submenu[i++] = menu;
|
||||||
|
if (i > 0) {
|
||||||
|
str_printf(r, _(" Location:\n"));
|
||||||
|
for (j = 4; --i >= 0; j += 2) {
|
||||||
|
menu = submenu[i];
|
||||||
|
str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
|
||||||
|
if (menu->sym) {
|
||||||
|
str_printf(r, " (%s [=%s])", menu->sym->name ?
|
||||||
|
menu->sym->name : _("<choice>"),
|
||||||
|
sym_get_string_value(menu->sym));
|
||||||
|
}
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_symbol_str(struct gstr *r, struct symbol *sym)
|
||||||
|
{
|
||||||
|
bool hit;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
if (sym && sym->name) {
|
||||||
|
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
|
||||||
|
sym_get_string_value(sym));
|
||||||
|
str_printf(r, "Type : %s\n", sym_type_name(sym->type));
|
||||||
|
if (sym->type == S_INT || sym->type == S_HEX) {
|
||||||
|
prop = sym_get_range_prop(sym);
|
||||||
|
if (prop) {
|
||||||
|
str_printf(r, "Range : ");
|
||||||
|
expr_gstr_print(prop->expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for_all_prompts(sym, prop)
|
||||||
|
get_prompt_str(r, prop);
|
||||||
|
hit = false;
|
||||||
|
for_all_properties(sym, prop, P_SELECT) {
|
||||||
|
if (!hit) {
|
||||||
|
str_append(r, " Selects: ");
|
||||||
|
hit = true;
|
||||||
|
} else
|
||||||
|
str_printf(r, " && ");
|
||||||
|
expr_gstr_print(prop->expr, r);
|
||||||
|
}
|
||||||
|
if (hit)
|
||||||
|
str_append(r, "\n");
|
||||||
|
if (sym->rev_dep.expr) {
|
||||||
|
str_append(r, _(" Selected by: "));
|
||||||
|
expr_gstr_print(sym->rev_dep.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
str_append(r, "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
struct gstr get_relations_str(struct symbol **sym_arr)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct gstr res = str_new();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
||||||
|
get_symbol_str(&res, sym);
|
||||||
|
if (!i)
|
||||||
|
str_append(&res, _("No matches found.\n"));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void menu_get_ext_help(struct menu *menu, struct gstr *help)
|
||||||
|
{
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
|
||||||
|
if (menu_has_help(menu)) {
|
||||||
|
if (sym->name) {
|
||||||
|
str_printf(help, "CONFIG_%s:\n\n", sym->name);
|
||||||
|
str_append(help, _(menu_get_help(menu)));
|
||||||
|
str_append(help, "\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
str_append(help, nohelp_text);
|
||||||
|
}
|
||||||
|
if (sym)
|
||||||
|
get_symbol_str(help, sym);
|
||||||
|
}
|
||||||
|
1570
package/config/nconf.c
Normal file
1570
package/config/nconf.c
Normal file
File diff suppressed because it is too large
Load Diff
617
package/config/nconf.gui.c
Normal file
617
package/config/nconf.gui.c
Normal file
@ -0,0 +1,617 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include "nconf.h"
|
||||||
|
|
||||||
|
/* a list of all the different widgets we use */
|
||||||
|
attributes_t attributes[ATTR_MAX+1] = {0};
|
||||||
|
|
||||||
|
/* available colors:
|
||||||
|
COLOR_BLACK 0
|
||||||
|
COLOR_RED 1
|
||||||
|
COLOR_GREEN 2
|
||||||
|
COLOR_YELLOW 3
|
||||||
|
COLOR_BLUE 4
|
||||||
|
COLOR_MAGENTA 5
|
||||||
|
COLOR_CYAN 6
|
||||||
|
COLOR_WHITE 7
|
||||||
|
*/
|
||||||
|
static void set_normal_colors(void)
|
||||||
|
{
|
||||||
|
init_pair(NORMAL, -1, -1);
|
||||||
|
init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
|
||||||
|
|
||||||
|
/* FORE is for the selected item */
|
||||||
|
init_pair(MAIN_MENU_FORE, -1, -1);
|
||||||
|
/* BACK for all the rest */
|
||||||
|
init_pair(MAIN_MENU_BACK, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_GREY, -1, -1);
|
||||||
|
init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(SCROLLWIN_TEXT, -1, -1);
|
||||||
|
init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
|
||||||
|
|
||||||
|
init_pair(DIALOG_TEXT, -1, -1);
|
||||||
|
init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
|
||||||
|
init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
|
||||||
|
|
||||||
|
init_pair(INPUT_BOX, COLOR_YELLOW, -1);
|
||||||
|
init_pair(INPUT_HEADING, COLOR_GREEN, -1);
|
||||||
|
init_pair(INPUT_TEXT, -1, -1);
|
||||||
|
init_pair(INPUT_FIELD, -1, -1);
|
||||||
|
|
||||||
|
init_pair(FUNCTION_HIGHLIGHT, -1, -1);
|
||||||
|
init_pair(FUNCTION_TEXT, COLOR_BLUE, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* available attributes:
|
||||||
|
A_NORMAL Normal display (no highlight)
|
||||||
|
A_STANDOUT Best highlighting mode of the terminal.
|
||||||
|
A_UNDERLINE Underlining
|
||||||
|
A_REVERSE Reverse video
|
||||||
|
A_BLINK Blinking
|
||||||
|
A_DIM Half bright
|
||||||
|
A_BOLD Extra bright or bold
|
||||||
|
A_PROTECT Protected mode
|
||||||
|
A_INVIS Invisible or blank mode
|
||||||
|
A_ALTCHARSET Alternate character set
|
||||||
|
A_CHARTEXT Bit-mask to extract a character
|
||||||
|
COLOR_PAIR(n) Color-pair number n
|
||||||
|
*/
|
||||||
|
static void normal_color_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add color... */
|
||||||
|
#define mkattr(name, attr) do { \
|
||||||
|
attributes[name] = attr | COLOR_PAIR(name); } while (0)
|
||||||
|
mkattr(NORMAL, NORMAL);
|
||||||
|
mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(MAIN_MENU_FORE, A_REVERSE);
|
||||||
|
mkattr(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattr(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattr(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattr(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattr(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattr(DIALOG_TEXT, A_BOLD);
|
||||||
|
mkattr(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattr(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattr(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattr(INPUT_BOX, A_NORMAL);
|
||||||
|
mkattr(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattr(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattr(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattr(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void no_colors_theme(void)
|
||||||
|
{
|
||||||
|
/* automatically add highlight, no color */
|
||||||
|
#define mkattrn(name, attr) { attributes[name] = attr; }
|
||||||
|
|
||||||
|
mkattrn(NORMAL, NORMAL);
|
||||||
|
mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(MAIN_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(MAIN_MENU_BACK, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_GREY, A_NORMAL);
|
||||||
|
mkattrn(MAIN_MENU_HEADING, A_BOLD);
|
||||||
|
mkattrn(MAIN_MENU_BOX, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(SCROLLWIN_TEXT, A_NORMAL);
|
||||||
|
mkattrn(SCROLLWIN_HEADING, A_BOLD);
|
||||||
|
mkattrn(SCROLLWIN_BOX, A_BOLD);
|
||||||
|
|
||||||
|
mkattrn(DIALOG_TEXT, A_NORMAL);
|
||||||
|
mkattrn(DIALOG_BOX, A_BOLD);
|
||||||
|
mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
|
||||||
|
mkattrn(DIALOG_MENU_BACK, A_NORMAL);
|
||||||
|
|
||||||
|
mkattrn(INPUT_BOX, A_BOLD);
|
||||||
|
mkattrn(INPUT_HEADING, A_BOLD);
|
||||||
|
mkattrn(INPUT_TEXT, A_NORMAL);
|
||||||
|
mkattrn(INPUT_FIELD, A_UNDERLINE);
|
||||||
|
|
||||||
|
mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
|
||||||
|
mkattrn(FUNCTION_TEXT, A_REVERSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_colors()
|
||||||
|
{
|
||||||
|
start_color();
|
||||||
|
use_default_colors();
|
||||||
|
set_normal_colors();
|
||||||
|
if (has_colors()) {
|
||||||
|
normal_color_theme();
|
||||||
|
} else {
|
||||||
|
/* give deafults */
|
||||||
|
no_colors_theme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color)
|
||||||
|
{ int length, x, y;
|
||||||
|
float temp;
|
||||||
|
|
||||||
|
|
||||||
|
if (win == NULL)
|
||||||
|
win = stdscr;
|
||||||
|
getyx(win, y, x);
|
||||||
|
if (startx != 0)
|
||||||
|
x = startx;
|
||||||
|
if (starty != 0)
|
||||||
|
y = starty;
|
||||||
|
if (width == 0)
|
||||||
|
width = 80;
|
||||||
|
|
||||||
|
length = strlen(string);
|
||||||
|
temp = (width - length) / 2;
|
||||||
|
x = startx + (int)temp;
|
||||||
|
wattrset(win, color);
|
||||||
|
mvwprintw(win, y, x, "%s", string);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_no(const char *text)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int total = 1;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0'; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
total++;
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *get_line(const char *text, int line_no)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int lines = 0;
|
||||||
|
|
||||||
|
if (!text)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; text[i] != '\0' && lines < line_no; i++)
|
||||||
|
if (text[i] == '\n')
|
||||||
|
lines++;
|
||||||
|
return text+i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_line_length(const char *line)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
while (*line != '\0' && *line != '\n') {
|
||||||
|
line++;
|
||||||
|
res++;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print all lines to the window. */
|
||||||
|
void fill_window(WINDOW *win, const char *text)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
getmaxyx(win, y, x);
|
||||||
|
/* do not go over end of line */
|
||||||
|
total_lines = min(total_lines, y);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
char tmp[x+10];
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
strncpy(tmp, line, min(len, x));
|
||||||
|
tmp[len] = '\0';
|
||||||
|
mvwprintw(win, i, 0, "%s", tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get the message, and buttons.
|
||||||
|
* each button must be a char*
|
||||||
|
* return the selected button
|
||||||
|
*
|
||||||
|
* this dialog is used for 2 different things:
|
||||||
|
* 1) show a text box, no buttons.
|
||||||
|
* 2) show a dialog, with horizontal buttons
|
||||||
|
*/
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char *btn;
|
||||||
|
int btns_width = 0;
|
||||||
|
int msg_lines = 0;
|
||||||
|
int msg_width = 0;
|
||||||
|
int total_width;
|
||||||
|
int win_rows = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *msg_win;
|
||||||
|
WINDOW *menu_win;
|
||||||
|
MENU *menu;
|
||||||
|
ITEM *btns[btn_num+1];
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
|
||||||
|
|
||||||
|
va_start(ap, btn_num);
|
||||||
|
for (i = 0; i < btn_num; i++) {
|
||||||
|
btn = va_arg(ap, char *);
|
||||||
|
btns[i] = new_item(btn, "");
|
||||||
|
btns_width += strlen(btn)+1;
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
btns[btn_num] = NULL;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
msg_lines = get_line_no(msg);
|
||||||
|
for (i = 0; i < msg_lines; i++) {
|
||||||
|
const char *line = get_line(msg, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
if (msg_width < len)
|
||||||
|
msg_width = len;
|
||||||
|
}
|
||||||
|
|
||||||
|
total_width = max(msg_width, btns_width);
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(msg_lines+4))/2;
|
||||||
|
x = (COLS-(total_width+4))/2;
|
||||||
|
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
if (btn_num > 0)
|
||||||
|
win_rows = msg_lines+4;
|
||||||
|
else
|
||||||
|
win_rows = msg_lines+2;
|
||||||
|
|
||||||
|
win = newwin(win_rows, total_width+4, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
menu_win = derwin(win, 1, btns_width, win_rows-2,
|
||||||
|
1+(total_width+2-btns_width)/2);
|
||||||
|
menu = new_menu(btns);
|
||||||
|
msg_win = derwin(win, win_rows-2, msg_width, 1,
|
||||||
|
1+(total_width+2-msg_width)/2);
|
||||||
|
|
||||||
|
set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
|
||||||
|
set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[DIALOG_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(msg_win, attributes[DIALOG_TEXT]);
|
||||||
|
fill_window(msg_win, msg);
|
||||||
|
|
||||||
|
set_menu_win(menu, win);
|
||||||
|
set_menu_sub(menu, menu_win);
|
||||||
|
set_menu_format(menu, 1, btn_num);
|
||||||
|
menu_opts_off(menu, O_SHOWDESC);
|
||||||
|
menu_opts_off(menu, O_SHOWMATCH);
|
||||||
|
menu_opts_on(menu, O_ONEVALUE);
|
||||||
|
menu_opts_on(menu, O_NONCYCLIC);
|
||||||
|
set_menu_mark(menu, "");
|
||||||
|
post_menu(menu);
|
||||||
|
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(win))) {
|
||||||
|
switch (res) {
|
||||||
|
case KEY_LEFT:
|
||||||
|
menu_driver(menu, REQ_LEFT_ITEM);
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
menu_driver(menu, REQ_RIGHT_ITEM);
|
||||||
|
break;
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case ' ':
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10 || res == ' ') {
|
||||||
|
res = item_index(current_item(menu));
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unpost_menu(menu);
|
||||||
|
free_menu(menu);
|
||||||
|
for (i = 0; i < btn_num; i++)
|
||||||
|
free_item(btns[i]);
|
||||||
|
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len)
|
||||||
|
{
|
||||||
|
int prompt_lines = 0;
|
||||||
|
int prompt_width = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *prompt_win;
|
||||||
|
WINDOW *form_win;
|
||||||
|
PANEL *panel;
|
||||||
|
int i, x, y;
|
||||||
|
int res = -1;
|
||||||
|
int cursor_position = strlen(init);
|
||||||
|
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
prompt_lines = get_line_no(prompt);
|
||||||
|
for (i = 0; i < prompt_lines; i++) {
|
||||||
|
const char *line = get_line(prompt, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
prompt_width = max(prompt_width, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title)
|
||||||
|
prompt_width = max(prompt_width, strlen(title));
|
||||||
|
|
||||||
|
/* place dialog in middle of screen */
|
||||||
|
y = (LINES-(prompt_lines+4))/2;
|
||||||
|
x = (COLS-(prompt_width+4))/2;
|
||||||
|
|
||||||
|
strncpy(result, init, result_len);
|
||||||
|
|
||||||
|
/* create the windows */
|
||||||
|
win = newwin(prompt_lines+6, prompt_width+7, y, x);
|
||||||
|
prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
|
||||||
|
form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
|
||||||
|
keypad(form_win, TRUE);
|
||||||
|
|
||||||
|
wattrset(form_win, attributes[INPUT_FIELD]);
|
||||||
|
|
||||||
|
wattrset(win, attributes[INPUT_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[INPUT_HEADING]);
|
||||||
|
if (title)
|
||||||
|
mvwprintw(win, 0, 3, "%s", title);
|
||||||
|
|
||||||
|
/* print message */
|
||||||
|
wattrset(prompt_win, attributes[INPUT_TEXT]);
|
||||||
|
fill_window(prompt_win, prompt);
|
||||||
|
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
|
||||||
|
/* create panels */
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* show the cursor */
|
||||||
|
curs_set(1);
|
||||||
|
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
while ((res = wgetch(form_win))) {
|
||||||
|
int len = strlen(result);
|
||||||
|
switch (res) {
|
||||||
|
case 10: /* ENTER */
|
||||||
|
case 27: /* ESCAPE */
|
||||||
|
case KEY_F(F_HELP):
|
||||||
|
case KEY_F(F_EXIT):
|
||||||
|
case KEY_F(F_BACK):
|
||||||
|
break;
|
||||||
|
case 127:
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
if (cursor_position > 0) {
|
||||||
|
memmove(&result[cursor_position-1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len-cursor_position+1);
|
||||||
|
cursor_position--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_DC:
|
||||||
|
if (cursor_position >= 0 && cursor_position < len) {
|
||||||
|
memmove(&result[cursor_position],
|
||||||
|
&result[cursor_position+1],
|
||||||
|
len-cursor_position+1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
if (cursor_position < len &&
|
||||||
|
cursor_position < min(result_len, prompt_width))
|
||||||
|
cursor_position++;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (cursor_position > 0)
|
||||||
|
cursor_position--;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ((isgraph(res) || isspace(res)) &&
|
||||||
|
len-2 < result_len) {
|
||||||
|
/* insert the char at the proper position */
|
||||||
|
memmove(&result[cursor_position+1],
|
||||||
|
&result[cursor_position],
|
||||||
|
len+1);
|
||||||
|
result[cursor_position] = res;
|
||||||
|
cursor_position++;
|
||||||
|
} else {
|
||||||
|
mvprintw(0, 0, "unknow key: %d\n", res);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wmove(form_win, 0, 0);
|
||||||
|
wclrtoeol(form_win);
|
||||||
|
mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
|
||||||
|
mvwprintw(form_win, 0, 0, "%s", result);
|
||||||
|
wmove(form_win, 0, cursor_position);
|
||||||
|
touchwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
|
||||||
|
if (res == 10) {
|
||||||
|
res = 0;
|
||||||
|
break;
|
||||||
|
} else if (res == 27 || res == KEY_F(F_BACK) ||
|
||||||
|
res == KEY_F(F_EXIT)) {
|
||||||
|
res = KEY_EXIT;
|
||||||
|
break;
|
||||||
|
} else if (res == KEY_F(F_HELP)) {
|
||||||
|
res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* hide the cursor */
|
||||||
|
curs_set(0);
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(prompt_win);
|
||||||
|
delwin(form_win);
|
||||||
|
delwin(win);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* refresh all windows in the correct order */
|
||||||
|
void refresh_all_windows(WINDOW *main_window)
|
||||||
|
{
|
||||||
|
update_panels();
|
||||||
|
touchwin(main_window);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* layman's scrollable window... */
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
int total_lines = get_line_no(text);
|
||||||
|
int x, y;
|
||||||
|
int start_x = 0, start_y = 0;
|
||||||
|
int text_lines = 0, text_cols = 0;
|
||||||
|
int total_cols = 0;
|
||||||
|
int win_cols = 0;
|
||||||
|
int win_lines = 0;
|
||||||
|
int i = 0;
|
||||||
|
WINDOW *win;
|
||||||
|
WINDOW *pad;
|
||||||
|
PANEL *panel;
|
||||||
|
|
||||||
|
/* find the widest line of msg: */
|
||||||
|
total_lines = get_line_no(text);
|
||||||
|
for (i = 0; i < total_lines; i++) {
|
||||||
|
const char *line = get_line(text, i);
|
||||||
|
int len = get_line_length(line);
|
||||||
|
total_cols = max(total_cols, len+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the pad */
|
||||||
|
pad = newpad(total_lines+10, total_cols+10);
|
||||||
|
wattrset(pad, attributes[SCROLLWIN_TEXT]);
|
||||||
|
fill_window(pad, text);
|
||||||
|
|
||||||
|
win_lines = min(total_lines+4, LINES-2);
|
||||||
|
win_cols = min(total_cols+2, COLS-2);
|
||||||
|
text_lines = max(win_lines-4, 0);
|
||||||
|
text_cols = max(win_cols-2, 0);
|
||||||
|
|
||||||
|
/* place window in middle of screen */
|
||||||
|
y = (LINES-win_lines)/2;
|
||||||
|
x = (COLS-win_cols)/2;
|
||||||
|
|
||||||
|
win = newwin(win_lines, win_cols, y, x);
|
||||||
|
keypad(win, TRUE);
|
||||||
|
/* show the help in the help window, and show the help panel */
|
||||||
|
wattrset(win, attributes[SCROLLWIN_BOX]);
|
||||||
|
box(win, 0, 0);
|
||||||
|
wattrset(win, attributes[SCROLLWIN_HEADING]);
|
||||||
|
mvwprintw(win, 0, 3, " %s ", title);
|
||||||
|
panel = new_panel(win);
|
||||||
|
|
||||||
|
/* handle scrolling */
|
||||||
|
do {
|
||||||
|
|
||||||
|
copywin(pad, win, start_y, start_x, 2, 2, text_lines,
|
||||||
|
text_cols, 0);
|
||||||
|
print_in_middle(win,
|
||||||
|
text_lines+2,
|
||||||
|
0,
|
||||||
|
text_cols,
|
||||||
|
"<OK>",
|
||||||
|
attributes[DIALOG_MENU_FORE]);
|
||||||
|
wrefresh(win);
|
||||||
|
|
||||||
|
res = wgetch(win);
|
||||||
|
switch (res) {
|
||||||
|
case KEY_NPAGE:
|
||||||
|
case ' ':
|
||||||
|
start_y += text_lines-2;
|
||||||
|
break;
|
||||||
|
case KEY_PPAGE:
|
||||||
|
start_y -= text_lines+2;
|
||||||
|
break;
|
||||||
|
case KEY_HOME:
|
||||||
|
start_y = 0;
|
||||||
|
break;
|
||||||
|
case KEY_END:
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
break;
|
||||||
|
case KEY_DOWN:
|
||||||
|
case 'j':
|
||||||
|
start_y++;
|
||||||
|
break;
|
||||||
|
case KEY_UP:
|
||||||
|
case 'k':
|
||||||
|
start_y--;
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
case 'h':
|
||||||
|
start_x--;
|
||||||
|
break;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
case 'l':
|
||||||
|
start_x++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (res == 10 || res == 27 || res == 'q'
|
||||||
|
|| res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (start_y < 0)
|
||||||
|
start_y = 0;
|
||||||
|
if (start_y >= total_lines-text_lines)
|
||||||
|
start_y = total_lines-text_lines;
|
||||||
|
if (start_x < 0)
|
||||||
|
start_x = 0;
|
||||||
|
if (start_x >= total_cols-text_cols)
|
||||||
|
start_x = total_cols-text_cols;
|
||||||
|
} while (res);
|
||||||
|
|
||||||
|
del_panel(panel);
|
||||||
|
delwin(win);
|
||||||
|
refresh_all_windows(main_window);
|
||||||
|
}
|
95
package/config/nconf.h
Normal file
95
package/config/nconf.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 Nir Tzachar <nir.tzachar@gmail.com?
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Derived from menuconfig.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <curses.h>
|
||||||
|
#include <menu.h>
|
||||||
|
#include <panel.h>
|
||||||
|
#include <form.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "ncurses.h"
|
||||||
|
|
||||||
|
#define max(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a > _b ? _a : _b; })
|
||||||
|
|
||||||
|
#define min(a, b) ({\
|
||||||
|
typeof(a) _a = a;\
|
||||||
|
typeof(b) _b = b;\
|
||||||
|
_a < _b ? _a : _b; })
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NORMAL = 1,
|
||||||
|
MAIN_HEADING,
|
||||||
|
MAIN_MENU_BOX,
|
||||||
|
MAIN_MENU_FORE,
|
||||||
|
MAIN_MENU_BACK,
|
||||||
|
MAIN_MENU_GREY,
|
||||||
|
MAIN_MENU_HEADING,
|
||||||
|
SCROLLWIN_TEXT,
|
||||||
|
SCROLLWIN_HEADING,
|
||||||
|
SCROLLWIN_BOX,
|
||||||
|
DIALOG_TEXT,
|
||||||
|
DIALOG_MENU_FORE,
|
||||||
|
DIALOG_MENU_BACK,
|
||||||
|
DIALOG_BOX,
|
||||||
|
INPUT_BOX,
|
||||||
|
INPUT_HEADING,
|
||||||
|
INPUT_TEXT,
|
||||||
|
INPUT_FIELD,
|
||||||
|
FUNCTION_TEXT,
|
||||||
|
FUNCTION_HIGHLIGHT,
|
||||||
|
ATTR_MAX
|
||||||
|
} attributes_t;
|
||||||
|
extern attributes_t attributes[];
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
F_HELP = 1,
|
||||||
|
F_SYMBOL = 2,
|
||||||
|
F_INSTS = 3,
|
||||||
|
F_CONF = 4,
|
||||||
|
F_BACK = 5,
|
||||||
|
F_SAVE = 6,
|
||||||
|
F_LOAD = 7,
|
||||||
|
F_EXIT = 8
|
||||||
|
} function_key;
|
||||||
|
|
||||||
|
void set_colors(void);
|
||||||
|
|
||||||
|
/* this changes the windows attributes !!! */
|
||||||
|
void print_in_middle(WINDOW *win,
|
||||||
|
int starty,
|
||||||
|
int startx,
|
||||||
|
int width,
|
||||||
|
const char *string,
|
||||||
|
chtype color);
|
||||||
|
int get_line_length(const char *line);
|
||||||
|
int get_line_no(const char *text);
|
||||||
|
const char *get_line(const char *text, int line_no);
|
||||||
|
void fill_window(WINDOW *win, const char *text);
|
||||||
|
int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...);
|
||||||
|
int dialog_inputbox(WINDOW *main_window,
|
||||||
|
const char *title, const char *prompt,
|
||||||
|
const char *init, char *result, int result_len);
|
||||||
|
void refresh_all_windows(WINDOW *main_window);
|
||||||
|
void show_scroll_win(WINDOW *main_window,
|
||||||
|
const char *title,
|
||||||
|
const char *text);
|
298
package/config/patches/01-kconfig-kernel-to-buildroot.patch
Normal file
298
package/config/patches/01-kconfig-kernel-to-buildroot.patch
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
---
|
||||||
|
conf.c | 12 ++++++------
|
||||||
|
confdata.c | 12 ++++--------
|
||||||
|
gconf.c | 4 ++--
|
||||||
|
gconf.glade | 2 +-
|
||||||
|
mconf.c | 35 +++++++++++++++++------------------
|
||||||
|
qconf.cc | 4 ++--
|
||||||
|
zconf.tab.c_shipped | 2 +-
|
||||||
|
zconf.y | 2 +-
|
||||||
|
8 files changed, 34 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
Index: config.new/conf.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/conf.c
|
||||||
|
+++ config.new/conf.c
|
||||||
|
@@ -508,8 +508,8 @@
|
||||||
|
name = conf_get_configname();
|
||||||
|
if (stat(name, &tmpstat)) {
|
||||||
|
fprintf(stderr, _("***\n"
|
||||||
|
- "*** You have not yet configured your kernel!\n"
|
||||||
|
- "*** (missing kernel config file \"%s\")\n"
|
||||||
|
+ "*** You have not yet configured your Buildroot!\n"
|
||||||
|
+ "*** (missing .config file \"%s\")\n"
|
||||||
|
"***\n"
|
||||||
|
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
||||||
|
"*** \"make menuconfig\" or \"make xconfig\").\n"
|
||||||
|
@@ -571,7 +571,7 @@
|
||||||
|
name = getenv("KCONFIG_NOSILENTUPDATE");
|
||||||
|
if (name && *name) {
|
||||||
|
fprintf(stderr,
|
||||||
|
- _("\n*** Kernel configuration requires explicit update.\n\n"));
|
||||||
|
+ _("\n*** Buildroot configuration requires explicit update.\n\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -623,11 +623,11 @@
|
||||||
|
* All other commands are only used to generate a config.
|
||||||
|
*/
|
||||||
|
if (conf_get_changed() && conf_write(NULL)) {
|
||||||
|
- fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
||||||
|
+ fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (conf_write_autoconf()) {
|
||||||
|
- fprintf(stderr, _("\n*** Error during update of the kernel configuration.\n\n"));
|
||||||
|
+ fprintf(stderr, _("\n*** Error during update of the Buildroot configuration.\n\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else if (input_mode == savedefconfig) {
|
||||||
|
@@ -638,7 +638,7 @@
|
||||||
|
}
|
||||||
|
} else if (input_mode != listnewconfig) {
|
||||||
|
if (conf_write(NULL)) {
|
||||||
|
- fprintf(stderr, _("\n*** Error during writing of the kernel configuration.\n\n"));
|
||||||
|
+ fprintf(stderr, _("\n*** Error during writing of the Buildroot configuration.\n\n"));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Index: config.new/confdata.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/confdata.c
|
||||||
|
+++ config.new/confdata.c
|
||||||
|
@@ -579,7 +579,7 @@
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- sym = sym_lookup("KERNELVERSION", 0);
|
||||||
|
+ sym = sym_lookup("BR2_VERSION", 0);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
time(&now);
|
||||||
|
env = getenv("KCONFIG_NOTIMESTAMP");
|
||||||
|
@@ -588,10 +588,8 @@
|
||||||
|
|
||||||
|
fprintf(out, _("#\n"
|
||||||
|
"# Automatically generated make config: don't edit\n"
|
||||||
|
- "# Linux kernel version: %s\n"
|
||||||
|
"%s%s"
|
||||||
|
"#\n"),
|
||||||
|
- sym_get_string_value(sym),
|
||||||
|
use_timestamp ? "# " : "",
|
||||||
|
use_timestamp ? ctime(&now) : "");
|
||||||
|
|
||||||
|
@@ -802,25 +800,23 @@
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- sym = sym_lookup("KERNELVERSION", 0);
|
||||||
|
+ sym = sym_lookup("BR2_VERSION", 0);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
time(&now);
|
||||||
|
fprintf(out, "#\n"
|
||||||
|
"# Automatically generated make config: don't edit\n"
|
||||||
|
- "# Linux kernel version: %s\n"
|
||||||
|
"# %s"
|
||||||
|
"#\n",
|
||||||
|
- sym_get_string_value(sym), ctime(&now));
|
||||||
|
+ ctime(&now));
|
||||||
|
fprintf(tristate, "#\n"
|
||||||
|
"# Automatically generated - do not edit\n"
|
||||||
|
"\n");
|
||||||
|
fprintf(out_h, "/*\n"
|
||||||
|
" * Automatically generated C config: don't edit\n"
|
||||||
|
- " * Linux kernel version: %s\n"
|
||||||
|
" * %s"
|
||||||
|
" */\n"
|
||||||
|
"#define AUTOCONF_INCLUDED\n",
|
||||||
|
- sym_get_string_value(sym), ctime(&now));
|
||||||
|
+ ctime(&now));
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
Index: config.new/gconf.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/gconf.c
|
||||||
|
+++ config.new/gconf.c
|
||||||
|
@@ -210,8 +210,8 @@
|
||||||
|
/*"style", PANGO_STYLE_OBLIQUE, */
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
- sprintf(title, _("Linux Kernel v%s Configuration"),
|
||||||
|
- getenv("KERNELVERSION"));
|
||||||
|
+ sprintf(title, _("Buildroot v%s Configuration"),
|
||||||
|
+ getenv("BR2_VERSION"));
|
||||||
|
gtk_window_set_title(GTK_WINDOW(main_wnd), title);
|
||||||
|
|
||||||
|
gtk_widget_show(main_wnd);
|
||||||
|
Index: config.new/gconf.glade
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/gconf.glade
|
||||||
|
+++ config.new/gconf.glade
|
||||||
|
@@ -5,7 +5,7 @@
|
||||||
|
|
||||||
|
<widget class="GtkWindow" id="window1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
- <property name="title" translatable="yes">Gtk Kernel Configurator</property>
|
||||||
|
+ <property name="title" translatable="yes">Gtk Buildroot Configurator</property>
|
||||||
|
<property name="type">GTK_WINDOW_TOPLEVEL</property>
|
||||||
|
<property name="window_position">GTK_WIN_POS_NONE</property>
|
||||||
|
<property name="modal">False</property>
|
||||||
|
Index: config.new/mconf.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/mconf.c
|
||||||
|
+++ config.new/mconf.c
|
||||||
|
@@ -25,10 +25,9 @@
|
||||||
|
static const char mconf_readme[] = N_(
|
||||||
|
"Overview\n"
|
||||||
|
"--------\n"
|
||||||
|
-"Some kernel features may be built directly into the kernel.\n"
|
||||||
|
-"Some may be made into loadable runtime modules. Some features\n"
|
||||||
|
+"Some features may be built directly into Buildroot. Some features\n"
|
||||||
|
"may be completely removed altogether. There are also certain\n"
|
||||||
|
-"kernel parameters which are not really features, but must be\n"
|
||||||
|
+"parameters which are not really features, but must be\n"
|
||||||
|
"entered in as decimal or hexadecimal numbers or possibly text.\n"
|
||||||
|
"\n"
|
||||||
|
"Menu items beginning with following braces represent features that\n"
|
||||||
|
@@ -117,7 +116,7 @@
|
||||||
|
"-----------------------------\n"
|
||||||
|
"Menuconfig supports the use of alternate configuration files for\n"
|
||||||
|
"those who, for various reasons, find it necessary to switch\n"
|
||||||
|
-"between different kernel configurations.\n"
|
||||||
|
+"between different configurations.\n"
|
||||||
|
"\n"
|
||||||
|
"At the end of the main menu you will find two options. One is\n"
|
||||||
|
"for saving the current configuration to a file of your choosing.\n"
|
||||||
|
@@ -150,7 +149,7 @@
|
||||||
|
"\n"
|
||||||
|
"Optional personality available\n"
|
||||||
|
"------------------------------\n"
|
||||||
|
-"If you prefer to have all of the kernel options listed in a single\n"
|
||||||
|
+"If you prefer to have all of the options listed in a single\n"
|
||||||
|
"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
|
||||||
|
"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
|
||||||
|
"\n"
|
||||||
|
@@ -180,9 +179,9 @@
|
||||||
|
"Arrow keys navigate the menu. "
|
||||||
|
"<Enter> selects submenus --->. "
|
||||||
|
"Highlighted letters are hotkeys. "
|
||||||
|
- "Pressing <Y> includes, <N> excludes, <M> modularizes features. "
|
||||||
|
+ "Pressing <Y> selectes a feature, while <N> will exclude a feature. "
|
||||||
|
"Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
|
||||||
|
- "Legend: [*] built-in [ ] excluded <M> module < > module capable"),
|
||||||
|
+ "Legend: [*] feature is selected [ ] feature is excluded"),
|
||||||
|
radiolist_instructions[] = N_(
|
||||||
|
"Use the arrow keys to navigate this window or "
|
||||||
|
"press the hotkey of the item you wish to select "
|
||||||
|
@@ -207,11 +206,11 @@
|
||||||
|
"last retrieved. Leave blank to abort."),
|
||||||
|
load_config_help[] = N_(
|
||||||
|
"\n"
|
||||||
|
- "For various reasons, one may wish to keep several different kernel\n"
|
||||||
|
+ "For various reasons, one may wish to keep several different Buildroot\n"
|
||||||
|
"configurations available on a single machine.\n"
|
||||||
|
"\n"
|
||||||
|
"If you have saved a previous configuration in a file other than the\n"
|
||||||
|
- "kernel's default, entering the name of the file here will allow you\n"
|
||||||
|
+ "Buildroot's default, entering the name of the file here will allow you\n"
|
||||||
|
"to modify that configuration.\n"
|
||||||
|
"\n"
|
||||||
|
"If you are uncertain, then you have probably never used alternate\n"
|
||||||
|
@@ -221,7 +220,7 @@
|
||||||
|
"as an alternate. Leave blank to abort."),
|
||||||
|
save_config_help[] = N_(
|
||||||
|
"\n"
|
||||||
|
- "For various reasons, one may wish to keep different kernel\n"
|
||||||
|
+ "For various reasons, one may wish to keep different Buildroot\n"
|
||||||
|
"configurations available on a single machine.\n"
|
||||||
|
"\n"
|
||||||
|
"Entering a file name here will allow you to later retrieve, modify\n"
|
||||||
|
@@ -292,10 +291,10 @@
|
||||||
|
int size;
|
||||||
|
struct symbol *sym;
|
||||||
|
|
||||||
|
- sym = sym_lookup("KERNELVERSION", 0);
|
||||||
|
+ sym = sym_lookup("BR2_VERSION", 0);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
||||||
|
- _("%s - Linux Kernel v%s Configuration"),
|
||||||
|
+ _("%s - buildroot v%s Configuration"),
|
||||||
|
config_filename, sym_get_string_value(sym));
|
||||||
|
if (size >= sizeof(menu_backtitle))
|
||||||
|
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
||||||
|
@@ -834,7 +833,7 @@
|
||||||
|
if (conf_get_changed())
|
||||||
|
res = dialog_yesno(NULL,
|
||||||
|
_("Do you wish to save your "
|
||||||
|
- "new kernel configuration?\n"
|
||||||
|
+ "new Buildroot configuration?\n"
|
||||||
|
"<ESC><ESC> to continue."),
|
||||||
|
6, 60);
|
||||||
|
else
|
||||||
|
@@ -846,20 +845,20 @@
|
||||||
|
case 0:
|
||||||
|
if (conf_write(filename)) {
|
||||||
|
fprintf(stderr, _("\n\n"
|
||||||
|
- "Error during writing of the kernel configuration.\n"
|
||||||
|
- "Your kernel configuration changes were NOT saved."
|
||||||
|
+ "Error during writing of the Buildroot configuration.\n"
|
||||||
|
+ "Your Buildroot configuration changes were NOT saved."
|
||||||
|
"\n\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
case -1:
|
||||||
|
printf(_("\n\n"
|
||||||
|
- "*** End of Linux kernel configuration.\n"
|
||||||
|
- "*** Execute 'make' to build the kernel or try 'make help'."
|
||||||
|
+ "*** End of Buildroot configuration.\n"
|
||||||
|
+ "*** Execute 'make' to build Buildroot or try 'make help'."
|
||||||
|
"\n\n"));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, _("\n\n"
|
||||||
|
- "Your kernel configuration changes were NOT saved."
|
||||||
|
+ "Your Buildroot configuration changes were NOT saved."
|
||||||
|
"\n\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Index: config.new/qconf.cc
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/qconf.cc
|
||||||
|
+++ config.new/qconf.cc
|
||||||
|
@@ -1263,8 +1263,8 @@
|
||||||
|
char title[256];
|
||||||
|
|
||||||
|
QDesktopWidget *d = configApp->desktop();
|
||||||
|
- snprintf(title, sizeof(title), _("Linux Kernel v%s Configuration"),
|
||||||
|
- getenv("KERNELVERSION"));
|
||||||
|
+ snprintf(title, sizeof(title), _("Buildroot v%s Configuration"),
|
||||||
|
+ getenv("BR2_VERSION"));
|
||||||
|
setCaption(title);
|
||||||
|
|
||||||
|
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
||||||
|
Index: config.new/zconf.tab.c_shipped
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/zconf.tab.c_shipped
|
||||||
|
+++ config.new/zconf.tab.c_shipped
|
||||||
|
@@ -2224,7 +2224,7 @@
|
||||||
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
|
modules_sym->type = S_BOOLEAN;
|
||||||
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
|
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
||||||
|
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
||||||
|
|
||||||
|
#if YYDEBUG
|
||||||
|
if (getenv("ZCONF_DEBUG"))
|
||||||
|
Index: config.new/zconf.y
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/zconf.y
|
||||||
|
+++ config.new/zconf.y
|
||||||
|
@@ -479,7 +479,7 @@
|
||||||
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
|
modules_sym->type = S_BOOLEAN;
|
||||||
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
|
- rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
|
||||||
|
+ rootmenu.prompt = menu_add_prompt(P_MENU, "Buildroot Configuration", NULL);
|
||||||
|
|
||||||
|
#if YYDEBUG
|
||||||
|
if (getenv("ZCONF_DEBUG"))
|
178
package/config/patches/02-cpp-comments-to-c-comments.patch
Normal file
178
package/config/patches/02-cpp-comments-to-c-comments.patch
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
---
|
||||||
|
expr.c | 42 +++++++++++++++++++++---------------------
|
||||||
|
1 file changed, 21 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
Index: config.clean/expr.c
|
||||||
|
===================================================================
|
||||||
|
--- config.clean.orig/expr.c
|
||||||
|
+++ config.clean/expr.c
|
||||||
|
@@ -331,7 +331,7 @@
|
||||||
|
e->right.expr = expr_trans_bool(e->right.expr);
|
||||||
|
break;
|
||||||
|
case E_UNEQUAL:
|
||||||
|
- // FOO!=n -> FOO
|
||||||
|
+ /* FOO!=n -> FOO */
|
||||||
|
if (e->left.sym->type == S_TRISTATE) {
|
||||||
|
if (e->right.sym == &symbol_no) {
|
||||||
|
e->type = E_SYMBOL;
|
||||||
|
@@ -380,19 +380,19 @@
|
||||||
|
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
||||||
|
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
|
||||||
|
(e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
|
||||||
|
- // (a='y') || (a='m') -> (a!='n')
|
||||||
|
+ /* (a='y') || (a='m') -> (a!='n') */
|
||||||
|
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
|
||||||
|
}
|
||||||
|
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
||||||
|
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
|
||||||
|
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
|
||||||
|
- // (a='y') || (a='n') -> (a!='m')
|
||||||
|
+ /* (a='y') || (a='n') -> (a!='m') */
|
||||||
|
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
|
||||||
|
}
|
||||||
|
if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
|
||||||
|
((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
|
||||||
|
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
|
||||||
|
- // (a='m') || (a='n') -> (a!='y')
|
||||||
|
+ /* (a='m') || (a='n') -> (a!='y') */
|
||||||
|
return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -443,29 +443,29 @@
|
||||||
|
|
||||||
|
if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
|
||||||
|
(e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
|
||||||
|
- // (a) && (a='y') -> (a='y')
|
||||||
|
+ /* (a) && (a='y') -> (a='y') */
|
||||||
|
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
||||||
|
|
||||||
|
if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
|
||||||
|
(e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
|
||||||
|
- // (a) && (a!='n') -> (a)
|
||||||
|
+ /* (a) && (a!='n') -> (a) */
|
||||||
|
return expr_alloc_symbol(sym1);
|
||||||
|
|
||||||
|
if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
|
||||||
|
(e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
|
||||||
|
- // (a) && (a!='m') -> (a='y')
|
||||||
|
+ /* (a) && (a!='m') -> (a='y') */
|
||||||
|
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
||||||
|
|
||||||
|
if (sym1->type == S_TRISTATE) {
|
||||||
|
if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
|
||||||
|
- // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
|
||||||
|
+ /* (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' */
|
||||||
|
sym2 = e1->right.sym;
|
||||||
|
if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
|
||||||
|
return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
|
||||||
|
: expr_alloc_symbol(&symbol_no);
|
||||||
|
}
|
||||||
|
if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
|
||||||
|
- // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
|
||||||
|
+ /* (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' */
|
||||||
|
sym2 = e2->right.sym;
|
||||||
|
if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
|
||||||
|
return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
|
||||||
|
@@ -474,19 +474,19 @@
|
||||||
|
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
||||||
|
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
|
||||||
|
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
|
||||||
|
- // (a!='y') && (a!='n') -> (a='m')
|
||||||
|
+ /* (a!='y') && (a!='n') -> (a='m') */
|
||||||
|
return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
|
||||||
|
|
||||||
|
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
||||||
|
((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
|
||||||
|
(e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
|
||||||
|
- // (a!='y') && (a!='m') -> (a='n')
|
||||||
|
+ /* (a!='y') && (a!='m') -> (a='n') */
|
||||||
|
return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
|
||||||
|
|
||||||
|
if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
|
||||||
|
((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
|
||||||
|
(e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
|
||||||
|
- // (a!='m') && (a!='n') -> (a='m')
|
||||||
|
+ /* (a!='m') && (a!='n') -> (a='m') */
|
||||||
|
return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
|
||||||
|
|
||||||
|
if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
|
||||||
|
@@ -579,7 +579,7 @@
|
||||||
|
switch (e1->type) {
|
||||||
|
case E_OR:
|
||||||
|
expr_eliminate_dups2(e1->type, &e1, &e1);
|
||||||
|
- // (FOO || BAR) && (!FOO && !BAR) -> n
|
||||||
|
+ /* (FOO || BAR) && (!FOO && !BAR) -> n */
|
||||||
|
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
||||||
|
tmp2 = expr_copy(e2);
|
||||||
|
tmp = expr_extract_eq_and(&tmp1, &tmp2);
|
||||||
|
@@ -594,7 +594,7 @@
|
||||||
|
break;
|
||||||
|
case E_AND:
|
||||||
|
expr_eliminate_dups2(e1->type, &e1, &e1);
|
||||||
|
- // (FOO && BAR) || (!FOO || !BAR) -> y
|
||||||
|
+ /* (FOO && BAR) || (!FOO || !BAR) -> y */
|
||||||
|
tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
|
||||||
|
tmp2 = expr_copy(e2);
|
||||||
|
tmp = expr_extract_eq_or(&tmp1, &tmp2);
|
||||||
|
@@ -703,7 +703,7 @@
|
||||||
|
case E_NOT:
|
||||||
|
switch (e->left.expr->type) {
|
||||||
|
case E_NOT:
|
||||||
|
- // !!a -> a
|
||||||
|
+ /* !!a -> a */
|
||||||
|
tmp = e->left.expr->left.expr;
|
||||||
|
free(e->left.expr);
|
||||||
|
free(e);
|
||||||
|
@@ -712,14 +712,14 @@
|
||||||
|
break;
|
||||||
|
case E_EQUAL:
|
||||||
|
case E_UNEQUAL:
|
||||||
|
- // !a='x' -> a!='x'
|
||||||
|
+ /* !a='x' -> a!='x' */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
free(e);
|
||||||
|
e = tmp;
|
||||||
|
e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
|
||||||
|
break;
|
||||||
|
case E_OR:
|
||||||
|
- // !(a || b) -> !a && !b
|
||||||
|
+ /* !(a || b) -> !a && !b */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
e->type = E_AND;
|
||||||
|
e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
|
||||||
|
@@ -728,7 +728,7 @@
|
||||||
|
e = expr_transform(e);
|
||||||
|
break;
|
||||||
|
case E_AND:
|
||||||
|
- // !(a && b) -> !a || !b
|
||||||
|
+ /* !(a && b) -> !a || !b */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
e->type = E_OR;
|
||||||
|
e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
|
||||||
|
@@ -738,7 +738,7 @@
|
||||||
|
break;
|
||||||
|
case E_SYMBOL:
|
||||||
|
if (e->left.expr->left.sym == &symbol_yes) {
|
||||||
|
- // !'y' -> 'n'
|
||||||
|
+ /* !'y' -> 'n' */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
free(e);
|
||||||
|
e = tmp;
|
||||||
|
@@ -747,7 +747,7 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (e->left.expr->left.sym == &symbol_mod) {
|
||||||
|
- // !'m' -> 'm'
|
||||||
|
+ /* !'m' -> 'm' */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
free(e);
|
||||||
|
e = tmp;
|
||||||
|
@@ -756,7 +756,7 @@
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (e->left.expr->left.sym == &symbol_no) {
|
||||||
|
- // !'n' -> 'y'
|
||||||
|
+ /* !'n' -> 'y' */
|
||||||
|
tmp = e->left.expr;
|
||||||
|
free(e);
|
||||||
|
e = tmp;
|
164
package/config/patches/03-change-config-option-prefix.patch
Normal file
164
package/config/patches/03-change-config-option-prefix.patch
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
---
|
||||||
|
confdata.c | 49 +++++++++++++++++++++++--------------------------
|
||||||
|
1 file changed, 23 insertions(+), 26 deletions(-)
|
||||||
|
|
||||||
|
Index: config.new/confdata.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/confdata.c
|
||||||
|
+++ config.new/confdata.c
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
+#include <libgen.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
@@ -21,7 +22,7 @@
|
||||||
|
static const char *conf_filename;
|
||||||
|
static int conf_lineno, conf_warnings, conf_unsaved;
|
||||||
|
|
||||||
|
-const char conf_defname[] = "arch/$ARCH/defconfig";
|
||||||
|
+const char conf_defname[] = ".defconfig";
|
||||||
|
|
||||||
|
static void conf_warning(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
@@ -36,7 +37,7 @@
|
||||||
|
|
||||||
|
const char *conf_get_configname(void)
|
||||||
|
{
|
||||||
|
- char *name = getenv("KCONFIG_CONFIG");
|
||||||
|
+ char *name = getenv("BUILDROOT_CONFIG");
|
||||||
|
|
||||||
|
return name ? name : ".config";
|
||||||
|
}
|
||||||
|
@@ -222,22 +223,22 @@
|
||||||
|
sym = NULL;
|
||||||
|
switch (line[0]) {
|
||||||
|
case '#':
|
||||||
|
- if (memcmp(line + 2, "CONFIG_", 7))
|
||||||
|
+ if (line[1]!=' ')
|
||||||
|
continue;
|
||||||
|
- p = strchr(line + 9, ' ');
|
||||||
|
+ p = strchr(line + 2, ' ');
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
*p++ = 0;
|
||||||
|
if (strncmp(p, "is not set", 10))
|
||||||
|
continue;
|
||||||
|
if (def == S_DEF_USER) {
|
||||||
|
- sym = sym_find(line + 9);
|
||||||
|
+ sym = sym_find(line + 2);
|
||||||
|
if (!sym) {
|
||||||
|
sym_add_change_count(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- sym = sym_lookup(line + 9, 0);
|
||||||
|
+ sym = sym_lookup(line + 2, 0);
|
||||||
|
if (sym->type == S_UNKNOWN)
|
||||||
|
sym->type = S_BOOLEAN;
|
||||||
|
}
|
||||||
|
@@ -254,12 +255,8 @@
|
||||||
|
;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
- case 'C':
|
||||||
|
- if (memcmp(line, "CONFIG_", 7)) {
|
||||||
|
- conf_warning("unexpected data");
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- p = strchr(line + 7, '=');
|
||||||
|
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z':
|
||||||
|
+ p = strchr(line, '=');
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
*p++ = 0;
|
||||||
|
@@ -270,13 +267,13 @@
|
||||||
|
*p2 = 0;
|
||||||
|
}
|
||||||
|
if (def == S_DEF_USER) {
|
||||||
|
- sym = sym_find(line + 7);
|
||||||
|
+ sym = sym_find(line);
|
||||||
|
if (!sym) {
|
||||||
|
sym_add_change_count(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- sym = sym_lookup(line + 7, 0);
|
||||||
|
+ sym = sym_lookup(line, 0);
|
||||||
|
if (sym->type == S_UNKNOWN)
|
||||||
|
sym->type = S_OTHER;
|
||||||
|
}
|
||||||
|
@@ -405,9 +402,9 @@
|
||||||
|
{
|
||||||
|
int l;
|
||||||
|
if (headerfile)
|
||||||
|
- fprintf(out, "#define CONFIG_%s \"", name);
|
||||||
|
+ fprintf(out, "#define %s \"", name);
|
||||||
|
else
|
||||||
|
- fprintf(out, "CONFIG_%s=\"", name);
|
||||||
|
+ fprintf(out, "%s=\"", name);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
l = strcspn(str, "\"\\");
|
||||||
|
@@ -433,13 +430,13 @@
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
if (write_no)
|
||||||
|
- fprintf(out, "# CONFIG_%s is not set\n", sym->name);
|
||||||
|
+ fprintf(out, "# %s is not set\n", sym->name);
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
- fprintf(out, "CONFIG_%s=m\n", sym->name);
|
||||||
|
+ fprintf(out, "%s=m\n", sym->name);
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
- fprintf(out, "CONFIG_%s=y\n", sym->name);
|
||||||
|
+ fprintf(out, "%s=y\n", sym->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -449,7 +446,7 @@
|
||||||
|
case S_HEX:
|
||||||
|
case S_INT:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
- fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
|
||||||
|
+ fprintf(out, "%s=%s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
case S_OTHER:
|
||||||
|
case S_UNKNOWN:
|
||||||
|
@@ -834,14 +831,14 @@
|
||||||
|
case no:
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
- fprintf(tristate, "CONFIG_%s=M\n", sym->name);
|
||||||
|
- fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
|
||||||
|
+ fprintf(tristate, "%s=M\n", sym->name);
|
||||||
|
+ fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
if (sym->type == S_TRISTATE)
|
||||||
|
- fprintf(tristate, "CONFIG_%s=Y\n",
|
||||||
|
+ fprintf(tristate, "%s=Y\n",
|
||||||
|
sym->name);
|
||||||
|
- fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
|
||||||
|
+ fprintf(out_h, "#define %s 1\n", sym->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
@@ -851,12 +848,12 @@
|
||||||
|
case S_HEX:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
||||||
|
- fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
|
||||||
|
+ fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
- fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
|
||||||
|
+ fprintf(out_h, "#define %s %s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
29
package/config/patches/05-really-clean-everything.patch
Normal file
29
package/config/patches/05-really-clean-everything.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
Makefile | 14 ++++++++++----
|
||||||
|
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
Index: config.new/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/Makefile
|
||||||
|
+++ config.new/Makefile
|
||||||
|
@@ -199,10 +199,16 @@
|
||||||
|
gconf-objs := gconf.o kconfig_load.o zconf.tab.o
|
||||||
|
endif
|
||||||
|
|
||||||
|
-clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||||
|
- .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
||||||
|
-clean-files += mconf qconf gconf nconf
|
||||||
|
-clean-files += config.pot linux.pot
|
||||||
|
+clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||||
|
+ .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
|
||||||
|
+clean-files += config.pot linux.pot
|
||||||
|
+clean-files += conf $(conf-objs)
|
||||||
|
+clean-files += mconf $(mconf-objs)
|
||||||
|
+clean-files += nconf $(nconf-objs)
|
||||||
|
+clean-files += qconf qconf.o
|
||||||
|
+clean-files += gconf gconf.o
|
||||||
|
+clean-files += kconfig_load.o zconf.tab.o
|
||||||
|
+clean-files += $(kxgettext-objs)
|
||||||
|
|
||||||
|
# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
|
||||||
|
PHONY += $(obj)/dochecklxdialog
|
40
package/config/patches/06-br-build-system-integration.patch
Normal file
40
package/config/patches/06-br-build-system-integration.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
Makefile | 14 +++++++++++++-
|
||||||
|
1 file changed, 13 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
Index: config/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- config.orig/Makefile
|
||||||
|
+++ config/Makefile
|
||||||
|
@@ -177,18 +177,30 @@
|
||||||
|
ifeq ($(MAKECMDGOALS),nconfig)
|
||||||
|
hostprogs-y += nconf
|
||||||
|
endif
|
||||||
|
+ifeq ($(findstring nconf,$(MAKECMDGOALS)),nconf)
|
||||||
|
+ hostprogs-y += nconf
|
||||||
|
+endif
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),menuconfig)
|
||||||
|
hostprogs-y += mconf
|
||||||
|
endif
|
||||||
|
+ifeq ($(findstring mconf,$(MAKECMDGOALS)),mconf)
|
||||||
|
+ hostprogs-y += mconf
|
||||||
|
+endif
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),xconfig)
|
||||||
|
qconf-target := 1
|
||||||
|
endif
|
||||||
|
+ifeq ($(findstring qconf,$(MAKECMDGOALS)),qconf)
|
||||||
|
+ qconf-target := 1
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
ifeq ($(MAKECMDGOALS),gconfig)
|
||||||
|
gconf-target := 1
|
||||||
|
endif
|
||||||
|
-
|
||||||
|
+ifeq ($(findstring gconf,$(MAKECMDGOALS)),gconf)
|
||||||
|
+ gconf-target := 1
|
||||||
|
+endif
|
||||||
|
|
||||||
|
ifeq ($(qconf-target),1)
|
||||||
|
qconf-cxxobjs := qconf.o
|
139
package/config/patches/08-make-write-deps.patch
Normal file
139
package/config/patches/08-make-write-deps.patch
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
---
|
||||||
|
util.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
1 file changed, 116 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
Index: config.clean/util.c
|
||||||
|
===================================================================
|
||||||
|
--- config.clean.orig/util.c
|
||||||
|
+++ config.clean/util.c
|
||||||
|
@@ -26,6 +26,121 @@
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static char* br2_symbol_printer(const char * const in)
|
||||||
|
+{
|
||||||
|
+ ssize_t i, j, len = strlen(in);
|
||||||
|
+ char *ret;
|
||||||
|
+ if (len < 1)
|
||||||
|
+ return NULL;
|
||||||
|
+ ret = malloc(len);
|
||||||
|
+ if (!ret) {
|
||||||
|
+ printf("Out of memory!");
|
||||||
|
+ exit(1);
|
||||||
|
+ }
|
||||||
|
+ memset(ret, 0, len);
|
||||||
|
+ i = j = 0;
|
||||||
|
+ if (strncmp("BR2_", in, 4) == 0)
|
||||||
|
+ i += 4;
|
||||||
|
+ if (strncmp("PACKAGE_", in + i, 8) == 0)
|
||||||
|
+ i += 8;
|
||||||
|
+ else if (strncmp("TARGET_", in + i, 7) == 0)
|
||||||
|
+ i += 7;
|
||||||
|
+ while (i <= len)
|
||||||
|
+ ret[j++] = tolower(in[i++]);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* write dependencies of the infividual config-symbols */
|
||||||
|
+static int write_make_deps(const char *name)
|
||||||
|
+{
|
||||||
|
+ char *str;
|
||||||
|
+ char dir[PATH_MAX+1], buf[PATH_MAX+1], buf2[PATH_MAX+1];
|
||||||
|
+ struct menu *menu;
|
||||||
|
+ struct symbol *sym;
|
||||||
|
+ struct property *prop, *p;
|
||||||
|
+ unsigned done;
|
||||||
|
+ const char * const name_tmp = "..make.deps.tmp";
|
||||||
|
+ FILE *out;
|
||||||
|
+ if (!name)
|
||||||
|
+ name = ".auto.deps";
|
||||||
|
+
|
||||||
|
+ strcpy(dir, conf_get_configname());
|
||||||
|
+ str = strrchr(dir, '/');
|
||||||
|
+ if (str)
|
||||||
|
+ str[1] = 0;
|
||||||
|
+ else
|
||||||
|
+ dir[0] = 0;
|
||||||
|
+
|
||||||
|
+ sprintf(buf, "%s%s", dir, name_tmp);
|
||||||
|
+ out = fopen(buf, "w");
|
||||||
|
+ if (!out)
|
||||||
|
+ return 1;
|
||||||
|
+ fprintf(out, "# ATTENTION! This does not handle 'depends', just 'select'! \n"
|
||||||
|
+ "# See package/config/util.c write_make_deps()\n#\n");
|
||||||
|
+ menu = &rootmenu;//rootmenu.list;
|
||||||
|
+ while (menu) {
|
||||||
|
+ sym = menu->sym;
|
||||||
|
+ if (!sym) {
|
||||||
|
+ if (!menu_is_visible(menu))
|
||||||
|
+ goto next;
|
||||||
|
+ } else if (!(sym->flags & SYMBOL_CHOICE)) {
|
||||||
|
+ sym_calc_value(sym);
|
||||||
|
+ if (sym->type == S_BOOLEAN
|
||||||
|
+ && sym_get_tristate_value(sym) != no) {
|
||||||
|
+ done = 0;
|
||||||
|
+ for_all_prompts(sym, prop) {
|
||||||
|
+ struct expr *e;
|
||||||
|
+//printf("\nname=%s\n", sym->name);
|
||||||
|
+ for_all_properties(sym, p, P_SELECT) {
|
||||||
|
+ e = p->expr;
|
||||||
|
+ if (e && e->left.sym->name) {
|
||||||
|
+ if (!done) {
|
||||||
|
+ fprintf(out, "%s: $(BASE_TARGETS)", br2_symbol_printer(sym->name));
|
||||||
|
+ done = 1;
|
||||||
|
+ }
|
||||||
|
+//printf("SELECTS %s\n",e->left.sym->name);
|
||||||
|
+ fprintf(out, " %s",br2_symbol_printer(e->left.sym->name));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (done)
|
||||||
|
+ fprintf(out, "\n");
|
||||||
|
+#if 0
|
||||||
|
+ e = sym->rev_dep.expr;
|
||||||
|
+ if (e && e->type == E_SYMBOL
|
||||||
|
+ && e->left.sym->name) {
|
||||||
|
+ fprintf(out, "%s: %s", br2_symbol_printer(e->left.sym->name),
|
||||||
|
+ br2_symbol_printer(sym->name));
|
||||||
|
+printf("%s is Selected BY: %s", sym->name, e->left.sym->name);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+next:
|
||||||
|
+ if (menu->list) {
|
||||||
|
+ menu = menu->list;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (menu->next)
|
||||||
|
+ menu = menu->next;
|
||||||
|
+ else while ((menu = menu->parent)) {
|
||||||
|
+ if (menu->next) {
|
||||||
|
+ menu = menu->next;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ fclose(out);
|
||||||
|
+ sprintf(buf2, "%s%s", dir, name);
|
||||||
|
+ rename(buf, buf2);
|
||||||
|
+ printf(_("#\n"
|
||||||
|
+ "# make dependencies written to %s\n"
|
||||||
|
+ "# ATTENTION buildroot devels!\n"
|
||||||
|
+ "# See top of this file before playing with this auto-preprequisites!\n"
|
||||||
|
+ "#\n"), name);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* write a dependency file as used by kbuild to track dependencies */
|
||||||
|
int file_write_dep(const char *name)
|
||||||
|
{
|
||||||
|
@@ -68,7 +183,7 @@
|
||||||
|
fprintf(out, "\n$(deps_config): ;\n");
|
||||||
|
fclose(out);
|
||||||
|
rename("..config.tmp", name);
|
||||||
|
- return 0;
|
||||||
|
+ return write_make_deps(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
confdata.c | 22 +++++++++++++++++++---
|
||||||
|
1 file changed, 19 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
Index: config/confdata.c
|
||||||
|
===================================================================
|
||||||
|
--- config.orig/confdata.c
|
||||||
|
+++ config/confdata.c
|
||||||
|
@@ -977,7 +977,16 @@
|
||||||
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *csym;
|
||||||
|
- int i, cnt;
|
||||||
|
+ int i, cnt, prob = 50;
|
||||||
|
+
|
||||||
|
+ if (mode == def_random) {
|
||||||
|
+ char *endp, *env = getenv("KCONFIG_PROBABILITY");
|
||||||
|
+ if (env && *env) {
|
||||||
|
+ int tmp = (int)strtol(env, &endp, 10);
|
||||||
|
+ if (*endp == '\0' && tmp >= 0 && tmp <= 100)
|
||||||
|
+ prob = tmp;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym_has_value(sym))
|
||||||
|
@@ -996,8 +1005,15 @@
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
break;
|
||||||
|
case def_random:
|
||||||
|
- cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
|
||||||
|
- sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
|
||||||
|
+ cnt = (rand() % 100) - (100 - prob);
|
||||||
|
+ if (cnt < 0)
|
||||||
|
+ sym->def[S_DEF_USER].tri = no;
|
||||||
|
+ else
|
||||||
|
+ if ((sym_get_type(sym) == S_TRISTATE)
|
||||||
|
+ && (cnt > prob/2))
|
||||||
|
+ sym->def[S_DEF_USER].tri = mod;
|
||||||
|
+ else
|
||||||
|
+ sym->def[S_DEF_USER].tri = yes;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
80
package/config/patches/10-br-build-system.patch
Normal file
80
package/config/patches/10-br-build-system.patch
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
Makefile.br | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
foo.h | 12 ++++++++++++
|
||||||
|
2 files changed, 65 insertions(+)
|
||||||
|
|
||||||
|
Index: config/Makefile.br
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ config/Makefile.br
|
||||||
|
@@ -0,0 +1,53 @@
|
||||||
|
+src := .
|
||||||
|
+top_srcdir=../../
|
||||||
|
+top_builddir=../../
|
||||||
|
+srctree := .
|
||||||
|
+obj ?= .
|
||||||
|
+
|
||||||
|
+include Makefile
|
||||||
|
+#HOSTCFLAGS+=-Dinline="" -include foo.h
|
||||||
|
+-include $(obj)/.depend
|
||||||
|
+$(obj)/.depend: $(wildcard *.h *.c)
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) -MM *.c > $@ 2>/dev/null || :
|
||||||
|
+
|
||||||
|
+__hostprogs := $(sort $(hostprogs-y) $(hostprogs-m))
|
||||||
|
+host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m)))
|
||||||
|
+host-cmulti := $(foreach m,$(__hostprogs),\
|
||||||
|
+ $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
|
||||||
|
+host-cxxmulti := $(foreach m,$(__hostprogs),\
|
||||||
|
+ $(if $($(m)-cxxobjs),$(m),$(if $($(m)-objs),)))
|
||||||
|
+host-cobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-objs))))
|
||||||
|
+host-cxxobjs := $(addprefix $(obj)/,$(sort $(foreach m,$(__hostprogs),$($(m)-cxxobjs))))
|
||||||
|
+
|
||||||
|
+HOST_EXTRACFLAGS += -I$(obj)
|
||||||
|
+
|
||||||
|
+$(host-csingle): %: %.c
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $< $(HOST_LOADLIBES) -o $(obj)/$@
|
||||||
|
+
|
||||||
|
+$(host-cmulti): %: $(host-cobjs) $(host-cshlib)
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs)) $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
||||||
|
+
|
||||||
|
+$(host-cxxmulti): %: $(host-cxxobjs) $(host-cobjs) $(host-cshlib)
|
||||||
|
+ $(HOSTCXX) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$@) $(addprefix $(obj)/,$($(@F)-objs) $($(@F)-cxxobjs)) $(HOSTLOADLIBES_$(@F)) -o $(obj)/$@
|
||||||
|
+
|
||||||
|
+$(obj)/%.o: %.c
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
||||||
|
+
|
||||||
|
+$(obj)/%.o: $(obj)/%.c
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCFLAGS_$(@F)) -c $< -o $@
|
||||||
|
+
|
||||||
|
+$(obj)/%.o: %.cc
|
||||||
|
+ $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS) $(HOSTCXXFLAGS_$(@F)) -c $< -o $@
|
||||||
|
+
|
||||||
|
+$(obj)/%:: $(src)/%_shipped
|
||||||
|
+ $(Q)cat $< > $@
|
||||||
|
+
|
||||||
|
+clean:
|
||||||
|
+ $(Q)rm -f $(addprefix $(obj)/,$(clean-files))
|
||||||
|
+distclean: clean
|
||||||
|
+ $(Q)rm -f $(addprefix $(obj)/,$(lxdialog) $(conf-objs) $(mconf-objs) $(kxgettext-objs) \
|
||||||
|
+ $(hostprogs-y) $(qconf-cxxobjs) $(qconf-objs) $(gconf-objs) \
|
||||||
|
+ mconf .depend)
|
||||||
|
+
|
||||||
|
+FORCE:
|
||||||
|
+.PHONY: FORCE clean distclean
|
||||||
|
Index: config/foo.h
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ config/foo.h
|
||||||
|
@@ -0,0 +1,12 @@
|
||||||
|
+#ifndef __KCONFIG_FOO_H
|
||||||
|
+#define __KCONFIG_FOO_H
|
||||||
|
+
|
||||||
|
+#ifndef __APPLE__
|
||||||
|
+#include <features.h>
|
||||||
|
+#endif
|
||||||
|
+#include <limits.h>
|
||||||
|
+
|
||||||
|
+#ifndef PATH_MAX
|
||||||
|
+#define PATH_MAX 1024
|
||||||
|
+#endif
|
||||||
|
+#endif /* __KCONFIG_FOO_H */
|
17
package/config/patches/11-use-mktemp-for-lxdialog.patch
Normal file
17
package/config/patches/11-use-mktemp-for-lxdialog.patch
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
lxdialog/check-lxdialog.sh | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
Index: config.clean/lxdialog/check-lxdialog.sh
|
||||||
|
===================================================================
|
||||||
|
--- config.clean.orig/lxdialog/check-lxdialog.sh
|
||||||
|
+++ config.clean/lxdialog/check-lxdialog.sh
|
||||||
|
@@ -31,7 +31,7 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
# Temp file, try to clean up after us
|
||||||
|
-tmp=.lxdialog.tmp
|
||||||
|
+tmp=$(mktemp)
|
||||||
|
trap "rm -f $tmp" 0 1 2 3 15
|
||||||
|
|
||||||
|
# Check if we can link to ncurses
|
17
package/config/patches/12-fix-glade-file-path.patch
Normal file
17
package/config/patches/12-fix-glade-file-path.patch
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
gconf.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
Index: config.new/gconf.c
|
||||||
|
===================================================================
|
||||||
|
--- config.new.orig/gconf.c
|
||||||
|
+++ config.new/gconf.c
|
||||||
|
@@ -1525,7 +1525,7 @@
|
||||||
|
/* Determine GUI path */
|
||||||
|
env = getenv(SRCTREE);
|
||||||
|
if (env)
|
||||||
|
- glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL);
|
||||||
|
+ glade_file = g_strconcat(env, "/package/config/gconf.glade", NULL);
|
||||||
|
else if (av[0][0] == '/')
|
||||||
|
glade_file = g_strconcat(av[0], ".glade", NULL);
|
||||||
|
else
|
209
package/config/patches/14-support-out-of-tree-config.patch
Normal file
209
package/config/patches/14-support-out-of-tree-config.patch
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
---
|
||||||
|
conf.c | 1
|
||||||
|
confdata.c | 65 +++++++++++++++++++++++++++++++++++++++++++++----------------
|
||||||
|
util.c | 16 +++++++++++++--
|
||||||
|
3 files changed, 62 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
Index: config/conf.c
|
||||||
|
===================================================================
|
||||||
|
--- config.orig/conf.c
|
||||||
|
+++ config/conf.c
|
||||||
|
@@ -503,7 +503,6 @@
|
||||||
|
}
|
||||||
|
name = av[optind];
|
||||||
|
conf_parse(name);
|
||||||
|
- //zconfdump(stdout);
|
||||||
|
if (sync_kconfig) {
|
||||||
|
name = conf_get_configname();
|
||||||
|
if (stat(name, &tmpstat)) {
|
||||||
|
Index: config/confdata.c
|
||||||
|
===================================================================
|
||||||
|
--- config.orig/confdata.c
|
||||||
|
+++ config/confdata.c
|
||||||
|
@@ -44,9 +44,7 @@
|
||||||
|
|
||||||
|
const char *conf_get_autoconfig_name(void)
|
||||||
|
{
|
||||||
|
- char *name = getenv("KCONFIG_AUTOCONFIG");
|
||||||
|
-
|
||||||
|
- return name ? name : "include/config/auto.conf";
|
||||||
|
+ return getenv("KCONFIG_AUTOCONFIG");
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *conf_expand_value(const char *in)
|
||||||
|
@@ -542,6 +540,9 @@
|
||||||
|
int use_timestamp = 1;
|
||||||
|
char *env;
|
||||||
|
|
||||||
|
+ if (!name)
|
||||||
|
+ name = conf_get_configname();
|
||||||
|
+
|
||||||
|
dirname[0] = 0;
|
||||||
|
if (name && name[0]) {
|
||||||
|
struct stat st;
|
||||||
|
@@ -656,6 +657,7 @@
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
char path[128];
|
||||||
|
+ char *opwd, *dir, *_name;
|
||||||
|
char *s, *d, c;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct stat sb;
|
||||||
|
@@ -664,8 +666,20 @@
|
||||||
|
name = conf_get_autoconfig_name();
|
||||||
|
conf_read_simple(name, S_DEF_AUTO);
|
||||||
|
|
||||||
|
- if (chdir("include/config"))
|
||||||
|
- return 1;
|
||||||
|
+ opwd = malloc(256);
|
||||||
|
+ _name = strdup(name);
|
||||||
|
+ if (opwd == NULL || _name == NULL)
|
||||||
|
+ return 1;
|
||||||
|
+ opwd = getcwd(opwd, 256);
|
||||||
|
+ dir = dirname(_name);
|
||||||
|
+ if (dir == NULL) {
|
||||||
|
+ res = 1;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+ if (chdir(dir)) {
|
||||||
|
+ res = 1;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
res = 0;
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
@@ -758,9 +772,11 @@
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
- if (chdir("../.."))
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
+ if (chdir(opwd))
|
||||||
|
+ res = 1;
|
||||||
|
+err:
|
||||||
|
+ free(opwd);
|
||||||
|
+ free(_name);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -772,25 +788,38 @@
|
||||||
|
FILE *out, *tristate, *out_h;
|
||||||
|
time_t now;
|
||||||
|
int i;
|
||||||
|
+ char dir[PATH_MAX+1], buf[PATH_MAX+1];
|
||||||
|
+ char *s;
|
||||||
|
+
|
||||||
|
+ strcpy(dir, conf_get_configname());
|
||||||
|
+ s = strrchr(dir, '/');
|
||||||
|
+ if (s)
|
||||||
|
+ s[1] = 0;
|
||||||
|
+ else
|
||||||
|
+ dir[0] = 0;
|
||||||
|
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
- file_write_dep("include/config/auto.conf.cmd");
|
||||||
|
+ sprintf(buf, "%s.config.cmd", dir);
|
||||||
|
+ file_write_dep(buf);
|
||||||
|
|
||||||
|
if (conf_split_config())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- out = fopen(".tmpconfig", "w");
|
||||||
|
+ sprintf(buf, "%s.tmpconfig", dir);
|
||||||
|
+ out = fopen(buf, "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- tristate = fopen(".tmpconfig_tristate", "w");
|
||||||
|
+ sprintf(buf, "%s.tmpconfig_tristate", dir);
|
||||||
|
+ tristate = fopen(buf, "w");
|
||||||
|
if (!tristate) {
|
||||||
|
fclose(out);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- out_h = fopen(".tmpconfig.h", "w");
|
||||||
|
+ sprintf(buf, "%s.tmpconfig.h", dir);
|
||||||
|
+ out_h = fopen(buf, "w");
|
||||||
|
if (!out_h) {
|
||||||
|
fclose(out);
|
||||||
|
fclose(tristate);
|
||||||
|
@@ -811,8 +840,7 @@
|
||||||
|
fprintf(out_h, "/*\n"
|
||||||
|
" * Automatically generated C config: don't edit\n"
|
||||||
|
" * %s"
|
||||||
|
- " */\n"
|
||||||
|
- "#define AUTOCONF_INCLUDED\n",
|
||||||
|
+ " */\n",
|
||||||
|
ctime(&now));
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
@@ -866,19 +894,22 @@
|
||||||
|
name = getenv("KCONFIG_AUTOHEADER");
|
||||||
|
if (!name)
|
||||||
|
name = "include/generated/autoconf.h";
|
||||||
|
- if (rename(".tmpconfig.h", name))
|
||||||
|
+ sprintf(buf, "%s.tmpconfig.h", dir);
|
||||||
|
+ if (rename(buf, name))
|
||||||
|
return 1;
|
||||||
|
name = getenv("KCONFIG_TRISTATE");
|
||||||
|
if (!name)
|
||||||
|
name = "include/config/tristate.conf";
|
||||||
|
- if (rename(".tmpconfig_tristate", name))
|
||||||
|
+ sprintf(buf, "%s.tmpconfig_tristate", dir);
|
||||||
|
+ if (rename(buf, name))
|
||||||
|
return 1;
|
||||||
|
name = conf_get_autoconfig_name();
|
||||||
|
/*
|
||||||
|
* This must be the last step, kbuild has a dependency on auto.conf
|
||||||
|
* and this marks the successful completion of the previous steps.
|
||||||
|
*/
|
||||||
|
- if (rename(".tmpconfig", name))
|
||||||
|
+ sprintf(buf, "%s.tmpconfig", dir);
|
||||||
|
+ if (rename(buf, name))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
Index: config/util.c
|
||||||
|
===================================================================
|
||||||
|
--- config.orig/util.c
|
||||||
|
+++ config/util.c
|
||||||
|
@@ -144,6 +144,8 @@
|
||||||
|
/* write a dependency file as used by kbuild to track dependencies */
|
||||||
|
int file_write_dep(const char *name)
|
||||||
|
{
|
||||||
|
+ char *str;
|
||||||
|
+ char buf[PATH_MAX+1], buf2[PATH_MAX+1], dir[PATH_MAX+1];
|
||||||
|
struct symbol *sym, *env_sym;
|
||||||
|
struct expr *e;
|
||||||
|
struct file *file;
|
||||||
|
@@ -151,7 +153,16 @@
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
name = ".kconfig.d";
|
||||||
|
- out = fopen("..config.tmp", "w");
|
||||||
|
+
|
||||||
|
+ strcpy(dir, conf_get_configname());
|
||||||
|
+ str = strrchr(dir, '/');
|
||||||
|
+ if (str)
|
||||||
|
+ str[1] = 0;
|
||||||
|
+ else
|
||||||
|
+ dir[0] = 0;
|
||||||
|
+
|
||||||
|
+ sprintf(buf, "%s..config.tmp", dir);
|
||||||
|
+ out = fopen(buf, "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
fprintf(out, "deps_config := \\\n");
|
||||||
|
@@ -182,7 +193,8 @@
|
||||||
|
|
||||||
|
fprintf(out, "\n$(deps_config): ;\n");
|
||||||
|
fclose(out);
|
||||||
|
- rename("..config.tmp", name);
|
||||||
|
+ sprintf(buf2, "%s%s", dir, name);
|
||||||
|
+ rename(buf, buf2);
|
||||||
|
return write_make_deps(NULL);
|
||||||
|
}
|
||||||
|
|
11
package/config/patches/series
Normal file
11
package/config/patches/series
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
01-kconfig-kernel-to-buildroot.patch
|
||||||
|
02-cpp-comments-to-c-comments.patch
|
||||||
|
03-change-config-option-prefix.patch
|
||||||
|
05-really-clean-everything.patch
|
||||||
|
06-br-build-system-integration.patch
|
||||||
|
08-make-write-deps.patch
|
||||||
|
09-implement-kconfig-probability.patch
|
||||||
|
10-br-build-system.patch
|
||||||
|
11-use-mktemp-for-lxdialog.patch
|
||||||
|
12-fix-glade-file-path.patch
|
||||||
|
14-support-out-of-tree-config.patch
|
@ -58,11 +58,10 @@ QValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
|
|||||||
{
|
{
|
||||||
QValueList<int> result;
|
QValueList<int> result;
|
||||||
QStringList entryList = readListEntry(key, ok);
|
QStringList entryList = readListEntry(key, ok);
|
||||||
if (ok) {
|
|
||||||
QStringList::Iterator it;
|
QStringList::Iterator it;
|
||||||
|
|
||||||
for (it = entryList.begin(); it != entryList.end(); ++it)
|
for (it = entryList.begin(); it != entryList.end(); ++it)
|
||||||
result.push_back((*it).toInt());
|
result.push_back((*it).toInt());
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -149,7 +148,7 @@ void ConfigItem::updateMenu(void)
|
|||||||
case S_TRISTATE:
|
case S_TRISTATE:
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
if (!sym_is_changable(sym) && !list->showAll) {
|
if (!sym_is_changable(sym) && list->optMode == normalOpt) {
|
||||||
setPixmap(promptColIdx, 0);
|
setPixmap(promptColIdx, 0);
|
||||||
setText(noColIdx, QString::null);
|
setText(noColIdx, QString::null);
|
||||||
setText(modColIdx, QString::null);
|
setText(modColIdx, QString::null);
|
||||||
@ -320,7 +319,7 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||||||
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
|
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
|
||||||
choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
|
choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
|
||||||
menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
|
menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
|
||||||
showAll(false), showName(false), showRange(false), showData(false),
|
showName(false), showRange(false), showData(false), optMode(normalOpt),
|
||||||
rootEntry(0), headerPopup(0)
|
rootEntry(0), headerPopup(0)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -337,10 +336,10 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
configSettings->beginGroup(name);
|
configSettings->beginGroup(name);
|
||||||
showAll = configSettings->readBoolEntry("/showAll", false);
|
|
||||||
showName = configSettings->readBoolEntry("/showName", false);
|
showName = configSettings->readBoolEntry("/showName", false);
|
||||||
showRange = configSettings->readBoolEntry("/showRange", false);
|
showRange = configSettings->readBoolEntry("/showRange", false);
|
||||||
showData = configSettings->readBoolEntry("/showData", false);
|
showData = configSettings->readBoolEntry("/showData", false);
|
||||||
|
optMode = (enum optionMode)configSettings->readNumEntry("/optionMode", false);
|
||||||
configSettings->endGroup();
|
configSettings->endGroup();
|
||||||
connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
|
connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
|
||||||
}
|
}
|
||||||
@ -352,6 +351,17 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
|
|||||||
reinit();
|
reinit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ConfigList::menuSkip(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (optMode == normalOpt && menu_is_visible(menu))
|
||||||
|
return false;
|
||||||
|
if (optMode == promptOpt && menu_has_prompt(menu))
|
||||||
|
return false;
|
||||||
|
if (optMode == allOpt)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ConfigList::reinit(void)
|
void ConfigList::reinit(void)
|
||||||
{
|
{
|
||||||
removeColumn(dataColIdx);
|
removeColumn(dataColIdx);
|
||||||
@ -380,7 +390,7 @@ void ConfigList::saveSettings(void)
|
|||||||
configSettings->writeEntry("/showName", showName);
|
configSettings->writeEntry("/showName", showName);
|
||||||
configSettings->writeEntry("/showRange", showRange);
|
configSettings->writeEntry("/showRange", showRange);
|
||||||
configSettings->writeEntry("/showData", showData);
|
configSettings->writeEntry("/showData", showData);
|
||||||
configSettings->writeEntry("/showAll", showAll);
|
configSettings->writeEntry("/optionMode", (int)optMode);
|
||||||
configSettings->endGroup();
|
configSettings->endGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -606,7 +616,7 @@ void ConfigList::updateMenuList(P* parent, struct menu* menu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
visible = menu_is_visible(child);
|
visible = menu_is_visible(child);
|
||||||
if (showAll || visible) {
|
if (!menuSkip(child)) {
|
||||||
if (!child->sym && !child->list && !child->prompt)
|
if (!child->sym && !child->list && !child->prompt)
|
||||||
continue;
|
continue;
|
||||||
if (!item || item->menu != child)
|
if (!item || item->menu != child)
|
||||||
@ -836,6 +846,9 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ConfigView*ConfigView::viewList;
|
ConfigView*ConfigView::viewList;
|
||||||
|
QAction *ConfigView::showNormalAction;
|
||||||
|
QAction *ConfigView::showAllAction;
|
||||||
|
QAction *ConfigView::showPromptAction;
|
||||||
|
|
||||||
ConfigView::ConfigView(QWidget* parent, const char *name)
|
ConfigView::ConfigView(QWidget* parent, const char *name)
|
||||||
: Parent(parent, name)
|
: Parent(parent, name)
|
||||||
@ -860,13 +873,16 @@ ConfigView::~ConfigView(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigView::setShowAll(bool b)
|
void ConfigView::setOptionMode(QAction *act)
|
||||||
{
|
{
|
||||||
if (list->showAll != b) {
|
if (act == showNormalAction)
|
||||||
list->showAll = b;
|
list->optMode = normalOpt;
|
||||||
|
else if (act == showAllAction)
|
||||||
|
list->optMode = allOpt;
|
||||||
|
else
|
||||||
|
list->optMode = promptOpt;
|
||||||
|
|
||||||
list->updateListAll();
|
list->updateListAll();
|
||||||
emit showAllChanged(b);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigView::setShowName(bool b)
|
void ConfigView::setShowName(bool b)
|
||||||
@ -964,34 +980,6 @@ void ConfigInfoView::setInfo(struct menu *m)
|
|||||||
menuInfo();
|
menuInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigInfoView::setSource(const QString& name)
|
|
||||||
{
|
|
||||||
const char *p = name.latin1();
|
|
||||||
|
|
||||||
menu = NULL;
|
|
||||||
sym = NULL;
|
|
||||||
|
|
||||||
switch (p[0]) {
|
|
||||||
case 'm':
|
|
||||||
struct menu *m;
|
|
||||||
|
|
||||||
if (sscanf(p, "m%p", &m) == 1 && menu != m) {
|
|
||||||
menu = m;
|
|
||||||
menuInfo();
|
|
||||||
emit menuSelected(menu);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 's':
|
|
||||||
struct symbol *s;
|
|
||||||
|
|
||||||
if (sscanf(p, "s%p", &s) == 1 && sym != s) {
|
|
||||||
sym = s;
|
|
||||||
symbolInfo();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigInfoView::symbolInfo(void)
|
void ConfigInfoView::symbolInfo(void)
|
||||||
{
|
{
|
||||||
QString str;
|
QString str;
|
||||||
@ -1042,12 +1030,10 @@ void ConfigInfoView::menuInfo(void)
|
|||||||
if (showDebug())
|
if (showDebug())
|
||||||
debug = debug_info(sym);
|
debug = debug_info(sym);
|
||||||
|
|
||||||
help = menu_get_help(menu);
|
struct gstr help_gstr = str_new();
|
||||||
/* Gettextize if the help text not empty */
|
menu_get_ext_help(menu, &help_gstr);
|
||||||
if (help.isEmpty())
|
help = print_filter(str_get(&help_gstr));
|
||||||
help = print_filter(menu_get_help(menu));
|
str_free(&help_gstr);
|
||||||
else
|
|
||||||
help = print_filter(_(menu_get_help(menu)));
|
|
||||||
} else if (menu->prompt) {
|
} else if (menu->prompt) {
|
||||||
head += "<big><b>";
|
head += "<big><b>";
|
||||||
head += print_filter(_(menu->prompt->text));
|
head += print_filter(_(menu->prompt->text));
|
||||||
@ -1277,7 +1263,8 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||||||
char title[256];
|
char title[256];
|
||||||
|
|
||||||
QDesktopWidget *d = configApp->desktop();
|
QDesktopWidget *d = configApp->desktop();
|
||||||
snprintf(title, sizeof(title), _("Buildroot Configuration"));
|
snprintf(title, sizeof(title), _("Buildroot v%s Configuration"),
|
||||||
|
getenv("BR2_VERSION"));
|
||||||
setCaption(title);
|
setCaption(title);
|
||||||
|
|
||||||
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
width = configSettings->readNumEntry("/window width", d->width() - 64);
|
||||||
@ -1350,11 +1337,24 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||||||
connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
|
connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
|
||||||
connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
|
connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
|
||||||
showDataAction->setOn(configList->showData);
|
showDataAction->setOn(configList->showData);
|
||||||
QAction *showAllAction = new QAction(NULL, _("Show All Options"), 0, this);
|
|
||||||
showAllAction->setToggleAction(TRUE);
|
QActionGroup *optGroup = new QActionGroup(this);
|
||||||
connect(showAllAction, SIGNAL(toggled(bool)), configView, SLOT(setShowAll(bool)));
|
optGroup->setExclusive(TRUE);
|
||||||
connect(showAllAction, SIGNAL(toggled(bool)), menuView, SLOT(setShowAll(bool)));
|
connect(optGroup, SIGNAL(selected(QAction *)), configView,
|
||||||
showAllAction->setOn(configList->showAll);
|
SLOT(setOptionMode(QAction *)));
|
||||||
|
connect(optGroup, SIGNAL(selected(QAction *)), menuView,
|
||||||
|
SLOT(setOptionMode(QAction *)));
|
||||||
|
|
||||||
|
configView->showNormalAction = new QAction(NULL, _("Show Normal Options"), 0, optGroup);
|
||||||
|
configView->showAllAction = new QAction(NULL, _("Show All Options"), 0, optGroup);
|
||||||
|
configView->showPromptAction = new QAction(NULL, _("Show Prompt Options"), 0, optGroup);
|
||||||
|
configView->showNormalAction->setToggleAction(TRUE);
|
||||||
|
configView->showNormalAction->setOn(configList->optMode == normalOpt);
|
||||||
|
configView->showAllAction->setToggleAction(TRUE);
|
||||||
|
configView->showAllAction->setOn(configList->optMode == allOpt);
|
||||||
|
configView->showPromptAction->setToggleAction(TRUE);
|
||||||
|
configView->showPromptAction->setOn(configList->optMode == promptOpt);
|
||||||
|
|
||||||
QAction *showDebugAction = new QAction(NULL, _("Show Debug Info"), 0, this);
|
QAction *showDebugAction = new QAction(NULL, _("Show Debug Info"), 0, this);
|
||||||
showDebugAction->setToggleAction(TRUE);
|
showDebugAction->setToggleAction(TRUE);
|
||||||
connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
|
connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
|
||||||
@ -1397,7 +1397,8 @@ ConfigMainWindow::ConfigMainWindow(void)
|
|||||||
showRangeAction->addTo(optionMenu);
|
showRangeAction->addTo(optionMenu);
|
||||||
showDataAction->addTo(optionMenu);
|
showDataAction->addTo(optionMenu);
|
||||||
optionMenu->insertSeparator();
|
optionMenu->insertSeparator();
|
||||||
showAllAction->addTo(optionMenu);
|
optGroup->addTo(optionMenu);
|
||||||
|
optionMenu->insertSeparator();
|
||||||
showDebugAction->addTo(optionMenu);
|
showDebugAction->addTo(optionMenu);
|
||||||
|
|
||||||
// create help menu
|
// create help menu
|
||||||
@ -1492,7 +1493,7 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
|
|||||||
ConfigList* list = NULL;
|
ConfigList* list = NULL;
|
||||||
ConfigItem* item;
|
ConfigItem* item;
|
||||||
|
|
||||||
if (!menu_is_visible(menu) && !configView->showAll())
|
if (configList->menuSkip(menu))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (configList->mode) {
|
switch (configList->mode) {
|
||||||
@ -1611,7 +1612,6 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
|
|||||||
{
|
{
|
||||||
if (!conf_get_changed()) {
|
if (!conf_get_changed()) {
|
||||||
e->accept();
|
e->accept();
|
||||||
conf_write_autoconf();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
|
QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
|
||||||
@ -1622,7 +1622,6 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
|
|||||||
switch (mb.exec()) {
|
switch (mb.exec()) {
|
||||||
case QMessageBox::Yes:
|
case QMessageBox::Yes:
|
||||||
conf_write(NULL);
|
conf_write(NULL);
|
||||||
conf_write_autoconf();
|
|
||||||
case QMessageBox::No:
|
case QMessageBox::No:
|
||||||
e->accept();
|
e->accept();
|
||||||
break;
|
break;
|
||||||
|
@ -44,6 +44,9 @@ enum colIdx {
|
|||||||
enum listMode {
|
enum listMode {
|
||||||
singleMode, menuMode, symbolMode, fullMode, listMode
|
singleMode, menuMode, symbolMode, fullMode, listMode
|
||||||
};
|
};
|
||||||
|
enum optionMode {
|
||||||
|
normalOpt = 0, allOpt, promptOpt
|
||||||
|
};
|
||||||
|
|
||||||
class ConfigList : public QListView {
|
class ConfigList : public QListView {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -115,6 +118,8 @@ public:
|
|||||||
void setAllOpen(bool open);
|
void setAllOpen(bool open);
|
||||||
void setParentMenu(void);
|
void setParentMenu(void);
|
||||||
|
|
||||||
|
bool menuSkip(struct menu *);
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void updateMenuList(P*, struct menu*);
|
void updateMenuList(P*, struct menu*);
|
||||||
|
|
||||||
@ -124,8 +129,9 @@ public:
|
|||||||
QPixmap choiceYesPix, choiceNoPix;
|
QPixmap choiceYesPix, choiceNoPix;
|
||||||
QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
|
QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
|
||||||
|
|
||||||
bool showAll, showName, showRange, showData;
|
bool showName, showRange, showData;
|
||||||
enum listMode mode;
|
enum listMode mode;
|
||||||
|
enum optionMode optMode;
|
||||||
struct menu *rootEntry;
|
struct menu *rootEntry;
|
||||||
QColorGroup disabledColorGroup;
|
QColorGroup disabledColorGroup;
|
||||||
QColorGroup inactivedColorGroup;
|
QColorGroup inactivedColorGroup;
|
||||||
@ -222,17 +228,15 @@ public:
|
|||||||
static void updateList(ConfigItem* item);
|
static void updateList(ConfigItem* item);
|
||||||
static void updateListAll(void);
|
static void updateListAll(void);
|
||||||
|
|
||||||
bool showAll(void) const { return list->showAll; }
|
|
||||||
bool showName(void) const { return list->showName; }
|
bool showName(void) const { return list->showName; }
|
||||||
bool showRange(void) const { return list->showRange; }
|
bool showRange(void) const { return list->showRange; }
|
||||||
bool showData(void) const { return list->showData; }
|
bool showData(void) const { return list->showData; }
|
||||||
public slots:
|
public slots:
|
||||||
void setShowAll(bool);
|
|
||||||
void setShowName(bool);
|
void setShowName(bool);
|
||||||
void setShowRange(bool);
|
void setShowRange(bool);
|
||||||
void setShowData(bool);
|
void setShowData(bool);
|
||||||
|
void setOptionMode(QAction *);
|
||||||
signals:
|
signals:
|
||||||
void showAllChanged(bool);
|
|
||||||
void showNameChanged(bool);
|
void showNameChanged(bool);
|
||||||
void showRangeChanged(bool);
|
void showRangeChanged(bool);
|
||||||
void showDataChanged(bool);
|
void showDataChanged(bool);
|
||||||
@ -242,6 +246,10 @@ public:
|
|||||||
|
|
||||||
static ConfigView* viewList;
|
static ConfigView* viewList;
|
||||||
ConfigView* nextView;
|
ConfigView* nextView;
|
||||||
|
|
||||||
|
static QAction *showNormalAction;
|
||||||
|
static QAction *showAllAction;
|
||||||
|
static QAction *showPromptAction;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConfigInfoView : public QTextBrowser {
|
class ConfigInfoView : public QTextBrowser {
|
||||||
@ -254,7 +262,6 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void setInfo(struct menu *menu);
|
void setInfo(struct menu *menu);
|
||||||
void saveSettings(void);
|
void saveSettings(void);
|
||||||
void setSource(const QString& name);
|
|
||||||
void setShowDebug(bool);
|
void setShowDebug(bool);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
422
package/config/streamline_config.pl
Normal file
422
package/config/streamline_config.pl
Normal file
@ -0,0 +1,422 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Copywrite 2005-2009 - Steven Rostedt
|
||||||
|
# Licensed under the terms of the GNU GPL License version 2
|
||||||
|
#
|
||||||
|
# It's simple enough to figure out how this works.
|
||||||
|
# If not, then you can ask me at stripconfig@goodmis.org
|
||||||
|
#
|
||||||
|
# What it does?
|
||||||
|
#
|
||||||
|
# If you have installed a Linux kernel from a distribution
|
||||||
|
# that turns on way too many modules than you need, and
|
||||||
|
# you only want the modules you use, then this program
|
||||||
|
# is perfect for you.
|
||||||
|
#
|
||||||
|
# It gives you the ability to turn off all the modules that are
|
||||||
|
# not loaded on your system.
|
||||||
|
#
|
||||||
|
# Howto:
|
||||||
|
#
|
||||||
|
# 1. Boot up the kernel that you want to stream line the config on.
|
||||||
|
# 2. Change directory to the directory holding the source of the
|
||||||
|
# kernel that you just booted.
|
||||||
|
# 3. Copy the configuraton file to this directory as .config
|
||||||
|
# 4. Have all your devices that you need modules for connected and
|
||||||
|
# operational (make sure that their corresponding modules are loaded)
|
||||||
|
# 5. Run this script redirecting the output to some other file
|
||||||
|
# like config_strip.
|
||||||
|
# 6. Back up your old config (if you want too).
|
||||||
|
# 7. copy the config_strip file to .config
|
||||||
|
# 8. Run "make oldconfig"
|
||||||
|
#
|
||||||
|
# Now your kernel is ready to be built with only the modules that
|
||||||
|
# are loaded.
|
||||||
|
#
|
||||||
|
# Here's what I did with my Debian distribution.
|
||||||
|
#
|
||||||
|
# cd /usr/src/linux-2.6.10
|
||||||
|
# cp /boot/config-2.6.10-1-686-smp .config
|
||||||
|
# ~/bin/streamline_config > config_strip
|
||||||
|
# mv .config config_sav
|
||||||
|
# mv config_strip .config
|
||||||
|
# make oldconfig
|
||||||
|
#
|
||||||
|
my $config = ".config";
|
||||||
|
|
||||||
|
my $uname = `uname -r`;
|
||||||
|
chomp $uname;
|
||||||
|
|
||||||
|
my @searchconfigs = (
|
||||||
|
{
|
||||||
|
"file" => ".config",
|
||||||
|
"exec" => "cat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/proc/config.gz",
|
||||||
|
"exec" => "zcat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/boot/config-$uname",
|
||||||
|
"exec" => "cat",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/boot/vmlinuz-$uname",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "vmlinux",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "/lib/modules/$uname/kernel/kernel/configs.ko",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "kernel/configs.ko",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file" => "kernel/configs.o",
|
||||||
|
"exec" => "scripts/extract-ikconfig",
|
||||||
|
"test" => "scripts/extract-ikconfig",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
sub find_config {
|
||||||
|
foreach my $conf (@searchconfigs) {
|
||||||
|
my $file = $conf->{"file"};
|
||||||
|
|
||||||
|
next if ( ! -f "$file");
|
||||||
|
|
||||||
|
if (defined($conf->{"test"})) {
|
||||||
|
`$conf->{"test"} $conf->{"file"} 2>/dev/null`;
|
||||||
|
next if ($?);
|
||||||
|
}
|
||||||
|
|
||||||
|
my $exec = $conf->{"exec"};
|
||||||
|
|
||||||
|
print STDERR "using config: '$file'\n";
|
||||||
|
|
||||||
|
open(CIN, "$exec $file |") || die "Failed to run $exec $file";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
die "No config file found";
|
||||||
|
}
|
||||||
|
|
||||||
|
find_config;
|
||||||
|
|
||||||
|
# Get the build source and top level Kconfig file (passed in)
|
||||||
|
my $ksource = $ARGV[0];
|
||||||
|
my $kconfig = $ARGV[1];
|
||||||
|
my $lsmod_file = $ARGV[2];
|
||||||
|
|
||||||
|
my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
|
||||||
|
chomp @makefiles;
|
||||||
|
|
||||||
|
my %depends;
|
||||||
|
my %selects;
|
||||||
|
my %prompts;
|
||||||
|
my %objects;
|
||||||
|
my $var;
|
||||||
|
my $cont = 0;
|
||||||
|
my $iflevel = 0;
|
||||||
|
my @ifdeps;
|
||||||
|
|
||||||
|
# prevent recursion
|
||||||
|
my %read_kconfigs;
|
||||||
|
|
||||||
|
sub read_kconfig {
|
||||||
|
my ($kconfig) = @_;
|
||||||
|
|
||||||
|
my $state = "NONE";
|
||||||
|
my $config;
|
||||||
|
my @kconfigs;
|
||||||
|
|
||||||
|
open(KIN, "$ksource/$kconfig") || die "Can't open $kconfig";
|
||||||
|
while (<KIN>) {
|
||||||
|
chomp;
|
||||||
|
|
||||||
|
# collect any Kconfig sources
|
||||||
|
if (/^source\s*"(.*)"/) {
|
||||||
|
$kconfigs[$#kconfigs+1] = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# configs found
|
||||||
|
if (/^\s*config\s+(\S+)\s*$/) {
|
||||||
|
$state = "NEW";
|
||||||
|
$config = $1;
|
||||||
|
|
||||||
|
for (my $i = 0; $i < $iflevel; $i++) {
|
||||||
|
if ($i) {
|
||||||
|
$depends{$config} .= " " . $ifdeps[$i];
|
||||||
|
} else {
|
||||||
|
$depends{$config} = $ifdeps[$i];
|
||||||
|
}
|
||||||
|
$state = "DEP";
|
||||||
|
}
|
||||||
|
|
||||||
|
# collect the depends for the config
|
||||||
|
} elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
|
||||||
|
$state = "DEP";
|
||||||
|
$depends{$config} = $1;
|
||||||
|
} elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) {
|
||||||
|
$depends{$config} .= " " . $1;
|
||||||
|
|
||||||
|
# Get the configs that select this config
|
||||||
|
} elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
|
||||||
|
if (defined($selects{$1})) {
|
||||||
|
$selects{$1} .= " " . $config;
|
||||||
|
} else {
|
||||||
|
$selects{$1} = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
# configs without prompts must be selected
|
||||||
|
} elsif ($state ne "NONE" && /^\s*tristate\s\S/) {
|
||||||
|
# note if the config has a prompt
|
||||||
|
$prompt{$config} = 1;
|
||||||
|
|
||||||
|
# Check for if statements
|
||||||
|
} elsif (/^if\s+(.*\S)\s*$/) {
|
||||||
|
my $deps = $1;
|
||||||
|
# remove beginning and ending non text
|
||||||
|
$deps =~ s/^[^a-zA-Z0-9_]*//;
|
||||||
|
$deps =~ s/[^a-zA-Z0-9_]*$//;
|
||||||
|
|
||||||
|
my @deps = split /[^a-zA-Z0-9_]+/, $deps;
|
||||||
|
|
||||||
|
$ifdeps[$iflevel++] = join ':', @deps;
|
||||||
|
|
||||||
|
} elsif (/^endif/) {
|
||||||
|
|
||||||
|
$iflevel-- if ($iflevel);
|
||||||
|
|
||||||
|
# stop on "help"
|
||||||
|
} elsif (/^\s*help\s*$/) {
|
||||||
|
$state = "NONE";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(KIN);
|
||||||
|
|
||||||
|
# read in any configs that were found.
|
||||||
|
foreach $kconfig (@kconfigs) {
|
||||||
|
if (!defined($read_kconfigs{$kconfig})) {
|
||||||
|
$read_kconfigs{$kconfig} = 1;
|
||||||
|
read_kconfig($kconfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($kconfig) {
|
||||||
|
read_kconfig($kconfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read all Makefiles to map the configs to the objects
|
||||||
|
foreach my $makefile (@makefiles) {
|
||||||
|
|
||||||
|
open(MIN,$makefile) || die "Can't open $makefile";
|
||||||
|
while (<MIN>) {
|
||||||
|
my $objs;
|
||||||
|
|
||||||
|
# is this a line after a line with a backslash?
|
||||||
|
if ($cont && /(\S.*)$/) {
|
||||||
|
$objs = $1;
|
||||||
|
}
|
||||||
|
$cont = 0;
|
||||||
|
|
||||||
|
# collect objects after obj-$(CONFIG_FOO_BAR)
|
||||||
|
if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
|
||||||
|
$var = $1;
|
||||||
|
$objs = $2;
|
||||||
|
}
|
||||||
|
if (defined($objs)) {
|
||||||
|
# test if the line ends with a backslash
|
||||||
|
if ($objs =~ m,(.*)\\$,) {
|
||||||
|
$objs = $1;
|
||||||
|
$cont = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach my $obj (split /\s+/,$objs) {
|
||||||
|
$obj =~ s/-/_/g;
|
||||||
|
if ($obj =~ /(.*)\.o$/) {
|
||||||
|
# Objects may be enabled by more than one config.
|
||||||
|
# Store configs in an array.
|
||||||
|
my @arr;
|
||||||
|
|
||||||
|
if (defined($objects{$1})) {
|
||||||
|
@arr = @{$objects{$1}};
|
||||||
|
}
|
||||||
|
|
||||||
|
$arr[$#arr+1] = $var;
|
||||||
|
|
||||||
|
# The objects have a hash mapping to a reference
|
||||||
|
# of an array of configs.
|
||||||
|
$objects{$1} = \@arr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(MIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
my %modules;
|
||||||
|
|
||||||
|
if (defined($lsmod_file)) {
|
||||||
|
if ( ! -f $lsmod_file) {
|
||||||
|
die "$lsmod_file not found";
|
||||||
|
}
|
||||||
|
if ( -x $lsmod_file) {
|
||||||
|
# the file is executable, run it
|
||||||
|
open(LIN, "$lsmod_file|");
|
||||||
|
} else {
|
||||||
|
# Just read the contents
|
||||||
|
open(LIN, "$lsmod_file");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
# see what modules are loaded on this system
|
||||||
|
my $lsmod;
|
||||||
|
|
||||||
|
foreach $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
|
||||||
|
if ( -x "$dir/lsmod" ) {
|
||||||
|
$lsmod = "$dir/lsmod";
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined($lsmod)) {
|
||||||
|
# try just the path
|
||||||
|
$lsmod = "lsmod";
|
||||||
|
}
|
||||||
|
|
||||||
|
open(LIN,"$lsmod|") || die "Can not call lsmod with $lsmod";
|
||||||
|
}
|
||||||
|
|
||||||
|
while (<LIN>) {
|
||||||
|
next if (/^Module/); # Skip the first line.
|
||||||
|
if (/^(\S+)/) {
|
||||||
|
$modules{$1} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (LIN);
|
||||||
|
|
||||||
|
# add to the configs hash all configs that are needed to enable
|
||||||
|
# a loaded module.
|
||||||
|
my %configs;
|
||||||
|
foreach my $module (keys(%modules)) {
|
||||||
|
if (defined($objects{$module})) {
|
||||||
|
my @arr = @{$objects{$module}};
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
$configs{$conf} = $module;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
# Most likely, someone has a custom (binary?) module loaded.
|
||||||
|
print STDERR "$module config not found!!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my $valid = "A-Za-z_0-9";
|
||||||
|
my $repeat = 1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Note, we do not care about operands (like: &&, ||, !) we want to add any
|
||||||
|
# config that is in the depend list of another config. This script does
|
||||||
|
# not enable configs that are not already enabled. If we come across a
|
||||||
|
# config A that depends on !B, we can still add B to the list of depends
|
||||||
|
# to keep on. If A was on in the original config, B would not have been
|
||||||
|
# and B would not be turned on by this script.
|
||||||
|
#
|
||||||
|
sub parse_config_dep_select
|
||||||
|
{
|
||||||
|
my ($p) = @_;
|
||||||
|
|
||||||
|
while ($p =~ /[$valid]/) {
|
||||||
|
|
||||||
|
if ($p =~ /^[^$valid]*([$valid]+)/) {
|
||||||
|
my $conf = "CONFIG_" . $1;
|
||||||
|
|
||||||
|
$p =~ s/^[^$valid]*[$valid]+//;
|
||||||
|
|
||||||
|
if (!defined($configs{$conf})) {
|
||||||
|
# We must make sure that this config has its
|
||||||
|
# dependencies met.
|
||||||
|
$repeat = 1; # do again
|
||||||
|
$configs{$conf} = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die "this should never happen";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($repeat) {
|
||||||
|
$repeat = 0;
|
||||||
|
|
||||||
|
foreach my $config (keys %configs) {
|
||||||
|
$config =~ s/^CONFIG_//;
|
||||||
|
|
||||||
|
if (defined($depends{$config})) {
|
||||||
|
# This config has dependencies. Make sure they are also included
|
||||||
|
parse_config_dep_select $depends{$config};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defined($prompt{$config}) || !defined($selects{$config})) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
# config has no prompt and must be selected.
|
||||||
|
parse_config_dep_select $selects{$config};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
my %setconfigs;
|
||||||
|
|
||||||
|
# Finally, read the .config file and turn off any module enabled that
|
||||||
|
# we could not find a reason to keep enabled.
|
||||||
|
while(<CIN>) {
|
||||||
|
|
||||||
|
if (/CONFIG_IKCONFIG/) {
|
||||||
|
if (/# CONFIG_IKCONFIG is not set/) {
|
||||||
|
# enable IKCONFIG at least as a module
|
||||||
|
print "CONFIG_IKCONFIG=m\n";
|
||||||
|
# don't ask about PROC
|
||||||
|
print "# CONFIG_IKCONFIG_PROC is not set\n";
|
||||||
|
} else {
|
||||||
|
print;
|
||||||
|
}
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^(CONFIG.*)=(m|y)/) {
|
||||||
|
if (defined($configs{$1})) {
|
||||||
|
$setconfigs{$1} = $2;
|
||||||
|
} elsif ($2 eq "m") {
|
||||||
|
print "# $1 is not set\n";
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print;
|
||||||
|
}
|
||||||
|
close(CIN);
|
||||||
|
|
||||||
|
# Integrity check, make sure all modules that we want enabled do
|
||||||
|
# indeed have their configs set.
|
||||||
|
loop:
|
||||||
|
foreach my $module (keys(%modules)) {
|
||||||
|
if (defined($objects{$module})) {
|
||||||
|
my @arr = @{$objects{$module}};
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
if (defined($setconfigs{$conf})) {
|
||||||
|
next loop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print STDERR "module $module did not have configs";
|
||||||
|
foreach my $conf (@arr) {
|
||||||
|
print STDERR " " , $conf;
|
||||||
|
}
|
||||||
|
print STDERR "\n";
|
||||||
|
}
|
||||||
|
}
|
@ -36,7 +36,7 @@ tristate modules_val;
|
|||||||
|
|
||||||
struct expr *sym_env_list;
|
struct expr *sym_env_list;
|
||||||
|
|
||||||
void sym_add_default(struct symbol *sym, const char *def)
|
static void sym_add_default(struct symbol *sym, const char *def)
|
||||||
{
|
{
|
||||||
struct property *prop = prop_alloc(P_DEFAULT, sym);
|
struct property *prop = prop_alloc(P_DEFAULT, sym);
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ struct property *sym_get_default_prop(struct symbol *sym)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct property *sym_get_range_prop(struct symbol *sym)
|
static struct property *sym_get_range_prop(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
@ -205,6 +205,16 @@ static void sym_calc_visibility(struct symbol *sym)
|
|||||||
}
|
}
|
||||||
if (sym_is_choice_value(sym))
|
if (sym_is_choice_value(sym))
|
||||||
return;
|
return;
|
||||||
|
/* defaulting to "yes" if no explicit "depends on" are given */
|
||||||
|
tri = yes;
|
||||||
|
if (sym->dir_dep.expr)
|
||||||
|
tri = expr_calc_value(sym->dir_dep.expr);
|
||||||
|
if (tri == mod)
|
||||||
|
tri = yes;
|
||||||
|
if (sym->dir_dep.tri != tri) {
|
||||||
|
sym->dir_dep.tri = tri;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
tri = no;
|
tri = no;
|
||||||
if (sym->rev_dep.expr)
|
if (sym->rev_dep.expr)
|
||||||
tri = expr_calc_value(sym->rev_dep.expr);
|
tri = expr_calc_value(sym->rev_dep.expr);
|
||||||
@ -216,42 +226,61 @@ static void sym_calc_visibility(struct symbol *sym)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct symbol *sym_calc_choice(struct symbol *sym)
|
/*
|
||||||
|
* Find the default symbol for a choice.
|
||||||
|
* First try the default values for the choice symbol
|
||||||
|
* Next locate the first visible choice value
|
||||||
|
* Return NULL if none was found
|
||||||
|
*/
|
||||||
|
struct symbol *sym_choice_default(struct symbol *sym)
|
||||||
{
|
{
|
||||||
struct symbol *def_sym;
|
struct symbol *def_sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct expr *e;
|
struct expr *e;
|
||||||
|
|
||||||
/* is the user choice visible? */
|
|
||||||
def_sym = sym->def[S_DEF_USER].val;
|
|
||||||
if (def_sym) {
|
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
|
||||||
return def_sym;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* any of the defaults visible? */
|
/* any of the defaults visible? */
|
||||||
for_all_defaults(sym, prop) {
|
for_all_defaults(sym, prop) {
|
||||||
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
if (prop->visible.tri == no)
|
if (prop->visible.tri == no)
|
||||||
continue;
|
continue;
|
||||||
def_sym = prop_get_symbol(prop);
|
def_sym = prop_get_symbol(prop);
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
if (def_sym->visible != no)
|
||||||
return def_sym;
|
return def_sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* just get the first visible value */
|
/* just get the first visible value */
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
expr_list_for_each_sym(prop->expr, e, def_sym) {
|
expr_list_for_each_sym(prop->expr, e, def_sym)
|
||||||
sym_calc_visibility(def_sym);
|
|
||||||
if (def_sym->visible != no)
|
if (def_sym->visible != no)
|
||||||
return def_sym;
|
return def_sym;
|
||||||
|
|
||||||
|
/* failed to locate any defaults */
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct symbol *sym_calc_choice(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol *def_sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
/* first calculate all choice values' visibilities */
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
expr_list_for_each_sym(prop->expr, e, def_sym)
|
||||||
|
sym_calc_visibility(def_sym);
|
||||||
|
|
||||||
|
/* is the user choice visible? */
|
||||||
|
def_sym = sym->def[S_DEF_USER].val;
|
||||||
|
if (def_sym && def_sym->visible != no)
|
||||||
|
return def_sym;
|
||||||
|
|
||||||
|
def_sym = sym_choice_default(sym);
|
||||||
|
|
||||||
|
if (def_sym == NULL)
|
||||||
/* no choice? reset tristate value */
|
/* no choice? reset tristate value */
|
||||||
sym->curr.tri = no;
|
sym->curr.tri = no;
|
||||||
return NULL;
|
|
||||||
|
return def_sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sym_calc_value(struct symbol *sym)
|
void sym_calc_value(struct symbol *sym)
|
||||||
@ -321,6 +350,14 @@ void sym_calc_value(struct symbol *sym)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
calc_newval:
|
calc_newval:
|
||||||
|
if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
|
||||||
|
fprintf(stderr, "warning: (");
|
||||||
|
expr_fprint(sym->rev_dep.expr, stderr);
|
||||||
|
fprintf(stderr, ") selects %s which has unmet direct dependencies (",
|
||||||
|
sym->name);
|
||||||
|
expr_fprint(sym->dir_dep.expr, stderr);
|
||||||
|
fprintf(stderr, ")\n");
|
||||||
|
}
|
||||||
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
|
newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
|
||||||
}
|
}
|
||||||
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
||||||
@ -365,12 +402,13 @@ void sym_calc_value(struct symbol *sym)
|
|||||||
|
|
||||||
if (sym_is_choice(sym)) {
|
if (sym_is_choice(sym)) {
|
||||||
struct symbol *choice_sym;
|
struct symbol *choice_sym;
|
||||||
int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
|
|
||||||
|
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
expr_list_for_each_sym(prop->expr, e, choice_sym) {
|
expr_list_for_each_sym(prop->expr, e, choice_sym) {
|
||||||
choice_sym->flags |= flags;
|
if ((sym->flags & SYMBOL_WRITE) &&
|
||||||
if (flags & SYMBOL_CHANGED)
|
choice_sym->visible != no)
|
||||||
|
choice_sym->flags |= SYMBOL_WRITE;
|
||||||
|
if (sym->flags & SYMBOL_CHANGED)
|
||||||
sym_set_changed(choice_sym);
|
sym_set_changed(choice_sym);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -623,6 +661,80 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the default value associated to a symbol.
|
||||||
|
* For tristate symbol handle the modules=n case
|
||||||
|
* in which case "m" becomes "y".
|
||||||
|
* If the symbol does not have any default then fallback
|
||||||
|
* to the fixed default values.
|
||||||
|
*/
|
||||||
|
const char *sym_get_string_default(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *ds;
|
||||||
|
const char *str;
|
||||||
|
tristate val;
|
||||||
|
|
||||||
|
sym_calc_visibility(sym);
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
val = symbol_no.curr.tri;
|
||||||
|
str = symbol_empty.curr.val;
|
||||||
|
|
||||||
|
/* If symbol has a default value look it up */
|
||||||
|
prop = sym_get_default_prop(sym);
|
||||||
|
if (prop != NULL) {
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
/* The visibility imay limit the value from yes => mod */
|
||||||
|
val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* The following fails to handle the situation
|
||||||
|
* where a default value is further limited by
|
||||||
|
* the valid range.
|
||||||
|
*/
|
||||||
|
ds = prop_get_symbol(prop);
|
||||||
|
if (ds != NULL) {
|
||||||
|
sym_calc_value(ds);
|
||||||
|
str = (const char *)ds->curr.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle select statements */
|
||||||
|
val = EXPR_OR(val, sym->rev_dep.tri);
|
||||||
|
|
||||||
|
/* transpose mod to yes if modules are not enabled */
|
||||||
|
if (val == mod)
|
||||||
|
if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no)
|
||||||
|
val = yes;
|
||||||
|
|
||||||
|
/* transpose mod to yes if type is bool */
|
||||||
|
if (sym->type == S_BOOLEAN && val == mod)
|
||||||
|
val = yes;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (val) {
|
||||||
|
case no: return "n";
|
||||||
|
case mod: return "m";
|
||||||
|
case yes: return "y";
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
return str;
|
||||||
|
case S_STRING:
|
||||||
|
return str;
|
||||||
|
case S_OTHER:
|
||||||
|
case S_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
const char *sym_get_string_value(struct symbol *sym)
|
const char *sym_get_string_value(struct symbol *sym)
|
||||||
{
|
{
|
||||||
tristate val;
|
tristate val;
|
||||||
@ -651,12 +763,20 @@ bool sym_is_changable(struct symbol *sym)
|
|||||||
return sym->visible > sym->rev_dep.tri;
|
return sym->visible > sym->rev_dep.tri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned strhash(const char *s)
|
||||||
|
{
|
||||||
|
/* fnv32 hash */
|
||||||
|
unsigned hash = 2166136261U;
|
||||||
|
for (; *s; s++)
|
||||||
|
hash = (hash ^ *s) * 0x01000193;
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
struct symbol *sym_lookup(const char *name, int flags)
|
struct symbol *sym_lookup(const char *name, int flags)
|
||||||
{
|
{
|
||||||
struct symbol *symbol;
|
struct symbol *symbol;
|
||||||
const char *ptr;
|
|
||||||
char *new_name;
|
char *new_name;
|
||||||
int hash = 0;
|
int hash;
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
if (name[0] && !name[1]) {
|
if (name[0] && !name[1]) {
|
||||||
@ -666,12 +786,11 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name) &&
|
if (symbol->name &&
|
||||||
|
!strcmp(symbol->name, name) &&
|
||||||
(flags ? symbol->flags & flags
|
(flags ? symbol->flags & flags
|
||||||
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
: !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
|
||||||
return symbol;
|
return symbol;
|
||||||
@ -679,7 +798,7 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||||||
new_name = strdup(name);
|
new_name = strdup(name);
|
||||||
} else {
|
} else {
|
||||||
new_name = NULL;
|
new_name = NULL;
|
||||||
hash = 256;
|
hash = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol = malloc(sizeof(*symbol));
|
symbol = malloc(sizeof(*symbol));
|
||||||
@ -697,7 +816,6 @@ struct symbol *sym_lookup(const char *name, int flags)
|
|||||||
struct symbol *sym_find(const char *name)
|
struct symbol *sym_find(const char *name)
|
||||||
{
|
{
|
||||||
struct symbol *symbol = NULL;
|
struct symbol *symbol = NULL;
|
||||||
const char *ptr;
|
|
||||||
int hash = 0;
|
int hash = 0;
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
@ -710,12 +828,11 @@ struct symbol *sym_find(const char *name)
|
|||||||
case 'n': return &symbol_no;
|
case 'n': return &symbol_no;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (ptr = name; *ptr; ptr++)
|
hash = strhash(name) % SYMBOL_HASHSIZE;
|
||||||
hash += *ptr;
|
|
||||||
hash &= 0xff;
|
|
||||||
|
|
||||||
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
if (!strcmp(symbol->name, name) &&
|
if (symbol->name &&
|
||||||
|
!strcmp(symbol->name, name) &&
|
||||||
!(symbol->flags & SYMBOL_CONST))
|
!(symbol->flags & SYMBOL_CONST))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -750,6 +867,7 @@ struct symbol **sym_re_search(const char *pattern)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sym_calc_value(sym);
|
||||||
sym_arr[cnt++] = sym;
|
sym_arr[cnt++] = sym;
|
||||||
}
|
}
|
||||||
if (sym_arr)
|
if (sym_arr)
|
||||||
@ -759,6 +877,110 @@ struct symbol **sym_re_search(const char *pattern)
|
|||||||
return sym_arr;
|
return sym_arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When we check for recursive dependencies we use a stack to save
|
||||||
|
* current state so we can print out relevant info to user.
|
||||||
|
* The entries are located on the call stack so no need to free memory.
|
||||||
|
* Note inser() remove() must always match to properly clear the stack.
|
||||||
|
*/
|
||||||
|
static struct dep_stack {
|
||||||
|
struct dep_stack *prev, *next;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *expr;
|
||||||
|
} *check_top;
|
||||||
|
|
||||||
|
static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym)
|
||||||
|
{
|
||||||
|
memset(stack, 0, sizeof(*stack));
|
||||||
|
if (check_top)
|
||||||
|
check_top->next = stack;
|
||||||
|
stack->prev = check_top;
|
||||||
|
stack->sym = sym;
|
||||||
|
check_top = stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dep_stack_remove(void)
|
||||||
|
{
|
||||||
|
check_top = check_top->prev;
|
||||||
|
if (check_top)
|
||||||
|
check_top->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when we have detected a recursive dependency.
|
||||||
|
* check_top point to the top of the stact so we use
|
||||||
|
* the ->prev pointer to locate the bottom of the stack.
|
||||||
|
*/
|
||||||
|
static void sym_check_print_recursive(struct symbol *last_sym)
|
||||||
|
{
|
||||||
|
struct dep_stack *stack;
|
||||||
|
struct symbol *sym, *next_sym;
|
||||||
|
struct menu *menu = NULL;
|
||||||
|
struct property *prop;
|
||||||
|
struct dep_stack cv_stack;
|
||||||
|
|
||||||
|
if (sym_is_choice_value(last_sym)) {
|
||||||
|
dep_stack_insert(&cv_stack, last_sym);
|
||||||
|
last_sym = prop_get_symbol(sym_get_choice_prop(last_sym));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (stack = check_top; stack != NULL; stack = stack->prev)
|
||||||
|
if (stack->sym == last_sym)
|
||||||
|
break;
|
||||||
|
if (!stack) {
|
||||||
|
fprintf(stderr, "unexpected recursive dependency error\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; stack; stack = stack->next) {
|
||||||
|
sym = stack->sym;
|
||||||
|
next_sym = stack->next ? stack->next->sym : last_sym;
|
||||||
|
prop = stack->prop;
|
||||||
|
|
||||||
|
/* for choice values find the menu entry (used below) */
|
||||||
|
if (sym_is_choice(sym) || sym_is_choice_value(sym)) {
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
menu = prop->menu;
|
||||||
|
if (prop->menu)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stack->sym == last_sym)
|
||||||
|
fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
|
||||||
|
prop->file->name, prop->lineno);
|
||||||
|
if (stack->expr) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
prop_get_type_name(prop->type),
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (stack->prop) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (sym_is_choice(sym)) {
|
||||||
|
fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
|
||||||
|
menu->file->name, menu->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else if (sym_is_choice_value(sym)) {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
|
||||||
|
menu->file->name, menu->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
|
||||||
|
prop->file->name, prop->lineno,
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
next_sym->name ? next_sym->name : "<choice>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_top == &cv_stack)
|
||||||
|
dep_stack_remove();
|
||||||
|
}
|
||||||
|
|
||||||
static struct symbol *sym_check_expr_deps(struct expr *e)
|
static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||||
{
|
{
|
||||||
@ -795,24 +1017,33 @@ static struct symbol *sym_check_sym_deps(struct symbol *sym)
|
|||||||
{
|
{
|
||||||
struct symbol *sym2;
|
struct symbol *sym2;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
|
dep_stack_insert(&stack, sym);
|
||||||
|
|
||||||
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
|
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
|
||||||
if (sym2)
|
if (sym2)
|
||||||
return sym2;
|
goto out;
|
||||||
|
|
||||||
for (prop = sym->prop; prop; prop = prop->next) {
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
if (prop->type == P_CHOICE || prop->type == P_SELECT)
|
if (prop->type == P_CHOICE || prop->type == P_SELECT)
|
||||||
continue;
|
continue;
|
||||||
|
stack.prop = prop;
|
||||||
sym2 = sym_check_expr_deps(prop->visible.expr);
|
sym2 = sym_check_expr_deps(prop->visible.expr);
|
||||||
if (sym2)
|
if (sym2)
|
||||||
break;
|
break;
|
||||||
if (prop->type != P_DEFAULT || sym_is_choice(sym))
|
if (prop->type != P_DEFAULT || sym_is_choice(sym))
|
||||||
continue;
|
continue;
|
||||||
|
stack.expr = prop->expr;
|
||||||
sym2 = sym_check_expr_deps(prop->expr);
|
sym2 = sym_check_expr_deps(prop->expr);
|
||||||
if (sym2)
|
if (sym2)
|
||||||
break;
|
break;
|
||||||
|
stack.expr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
dep_stack_remove();
|
||||||
|
|
||||||
return sym2;
|
return sym2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,6 +1052,9 @@ static struct symbol *sym_check_choice_deps(struct symbol *choice)
|
|||||||
struct symbol *sym, *sym2;
|
struct symbol *sym, *sym2;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
struct expr *e;
|
struct expr *e;
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
|
dep_stack_insert(&stack, choice);
|
||||||
|
|
||||||
prop = sym_get_choice_prop(choice);
|
prop = sym_get_choice_prop(choice);
|
||||||
expr_list_for_each_sym(prop->expr, e, sym)
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
@ -834,11 +1068,9 @@ static struct symbol *sym_check_choice_deps(struct symbol *choice)
|
|||||||
|
|
||||||
expr_list_for_each_sym(prop->expr, e, sym) {
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
sym2 = sym_check_sym_deps(sym);
|
sym2 = sym_check_sym_deps(sym);
|
||||||
if (sym2) {
|
if (sym2)
|
||||||
fprintf(stderr, " -> %s", sym->name);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
out:
|
out:
|
||||||
expr_list_for_each_sym(prop->expr, e, sym)
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
sym->flags &= ~SYMBOL_CHECK;
|
sym->flags &= ~SYMBOL_CHECK;
|
||||||
@ -847,6 +1079,8 @@ out:
|
|||||||
prop_get_symbol(sym_get_choice_prop(sym2)) == choice)
|
prop_get_symbol(sym_get_choice_prop(sym2)) == choice)
|
||||||
sym2 = choice;
|
sym2 = choice;
|
||||||
|
|
||||||
|
dep_stack_remove();
|
||||||
|
|
||||||
return sym2;
|
return sym2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -856,18 +1090,20 @@ struct symbol *sym_check_deps(struct symbol *sym)
|
|||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
if (sym->flags & SYMBOL_CHECK) {
|
if (sym->flags & SYMBOL_CHECK) {
|
||||||
fprintf(stderr, "%s:%d:error: found recursive dependency: %s",
|
sym_check_print_recursive(sym);
|
||||||
sym->prop->file->name, sym->prop->lineno,
|
|
||||||
sym->name ? sym->name : "<choice>");
|
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
if (sym->flags & SYMBOL_CHECKED)
|
if (sym->flags & SYMBOL_CHECKED)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (sym_is_choice_value(sym)) {
|
if (sym_is_choice_value(sym)) {
|
||||||
|
struct dep_stack stack;
|
||||||
|
|
||||||
/* for choice groups start the check with main choice symbol */
|
/* for choice groups start the check with main choice symbol */
|
||||||
|
dep_stack_insert(&stack, sym);
|
||||||
prop = sym_get_choice_prop(sym);
|
prop = sym_get_choice_prop(sym);
|
||||||
sym2 = sym_check_deps(prop_get_symbol(prop));
|
sym2 = sym_check_deps(prop_get_symbol(prop));
|
||||||
|
dep_stack_remove();
|
||||||
} else if (sym_is_choice(sym)) {
|
} else if (sym_is_choice(sym)) {
|
||||||
sym2 = sym_check_choice_deps(sym);
|
sym2 = sym_check_choice_deps(sym);
|
||||||
} else {
|
} else {
|
||||||
@ -876,14 +1112,8 @@ struct symbol *sym_check_deps(struct symbol *sym)
|
|||||||
sym->flags &= ~SYMBOL_CHECK;
|
sym->flags &= ~SYMBOL_CHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sym2) {
|
if (sym2 && sym2 == sym)
|
||||||
fprintf(stderr, " -> %s", sym->name ? sym->name : "<choice>");
|
|
||||||
if (sym2 == sym) {
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
zconfnerrs++;
|
|
||||||
sym2 = NULL;
|
sym2 = NULL;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sym2;
|
return sym2;
|
||||||
}
|
}
|
||||||
@ -937,13 +1167,15 @@ const char *prop_get_type_name(enum prop_type type)
|
|||||||
return "select";
|
return "select";
|
||||||
case P_RANGE:
|
case P_RANGE:
|
||||||
return "range";
|
return "range";
|
||||||
|
case P_SYMBOL:
|
||||||
|
return "symbol";
|
||||||
case P_UNKNOWN:
|
case P_UNKNOWN:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return "unknown";
|
return "unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
void prop_add_env(const char *env)
|
static void prop_add_env(const char *env)
|
||||||
{
|
{
|
||||||
struct symbol *sym, *sym2;
|
struct symbol *sym, *sym2;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
@ -199,12 +199,13 @@ int file_write_dep(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Allocate initial growable sting */
|
/* Allocate initial growable string */
|
||||||
struct gstr str_new(void)
|
struct gstr str_new(void)
|
||||||
{
|
{
|
||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = malloc(sizeof(char) * 64);
|
gs.s = malloc(sizeof(char) * 64);
|
||||||
gs.len = 64;
|
gs.len = 64;
|
||||||
|
gs.max_width = 0;
|
||||||
strcpy(gs.s, "\0");
|
strcpy(gs.s, "\0");
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
@ -215,6 +216,7 @@ struct gstr str_assign(const char *s)
|
|||||||
struct gstr gs;
|
struct gstr gs;
|
||||||
gs.s = strdup(s);
|
gs.s = strdup(s);
|
||||||
gs.len = strlen(s) + 1;
|
gs.len = strlen(s) + 1;
|
||||||
|
gs.max_width = 0;
|
||||||
return gs;
|
return gs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
struct kconf_id;
|
struct kconf_id;
|
||||||
|
|
||||||
|
static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
|
||||||
|
|
||||||
%%
|
%%
|
||||||
mainmenu, T_MAINMENU, TF_COMMAND
|
mainmenu, T_MAINMENU, TF_COMMAND
|
||||||
menu, T_MENU, TF_COMMAND
|
menu, T_MENU, TF_COMMAND
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct kconf_id;
|
struct kconf_id;
|
||||||
|
|
||||||
|
static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
|
||||||
/* maximum key range = 47, duplicates = 0 */
|
/* maximum key range = 47, duplicates = 0 */
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
@ -39,7 +39,7 @@ static int last_ts, first_ts;
|
|||||||
static void zconf_endhelp(void);
|
static void zconf_endhelp(void);
|
||||||
static void zconf_endfile(void);
|
static void zconf_endfile(void);
|
||||||
|
|
||||||
void new_string(void)
|
static void new_string(void)
|
||||||
{
|
{
|
||||||
text = malloc(START_STRSIZE);
|
text = malloc(START_STRSIZE);
|
||||||
text_asize = START_STRSIZE;
|
text_asize = START_STRSIZE;
|
||||||
@ -47,7 +47,7 @@ void new_string(void)
|
|||||||
*text = 0;
|
*text = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void append_string(const char *str, int size)
|
static void append_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
int new_size = text_size + size + 1;
|
int new_size = text_size + size + 1;
|
||||||
if (new_size > text_asize) {
|
if (new_size > text_asize) {
|
||||||
@ -61,7 +61,7 @@ void append_string(const char *str, int size)
|
|||||||
text[text_size] = 0;
|
text[text_size] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void alloc_string(const char *str, int size)
|
static void alloc_string(const char *str, int size)
|
||||||
{
|
{
|
||||||
text = malloc(size + 1);
|
text = malloc(size + 1);
|
||||||
memcpy(text, str, size);
|
memcpy(text, str, size);
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
/* A Bison parser, made by GNU Bison 2.3. */
|
|
||||||
|
/* A Bison parser, made by GNU Bison 2.4.1. */
|
||||||
|
|
||||||
/* Skeleton implementation for Bison's Yacc-like parsers in C
|
/* Skeleton implementation for Bison's Yacc-like parsers in C
|
||||||
|
|
||||||
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
@ -16,9 +17,7 @@
|
|||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* As a special exception, you may create a larger work that contains
|
/* As a special exception, you may create a larger work that contains
|
||||||
part or all of the Bison parser skeleton and distribute that work
|
part or all of the Bison parser skeleton and distribute that work
|
||||||
@ -47,7 +46,7 @@
|
|||||||
#define YYBISON 1
|
#define YYBISON 1
|
||||||
|
|
||||||
/* Bison version. */
|
/* Bison version. */
|
||||||
#define YYBISON_VERSION "2.3"
|
#define YYBISON_VERSION "2.4.1"
|
||||||
|
|
||||||
/* Skeleton name. */
|
/* Skeleton name. */
|
||||||
#define YYSKELETON_NAME "yacc.c"
|
#define YYSKELETON_NAME "yacc.c"
|
||||||
@ -55,6 +54,12 @@
|
|||||||
/* Pure parsers. */
|
/* Pure parsers. */
|
||||||
#define YYPURE 0
|
#define YYPURE 0
|
||||||
|
|
||||||
|
/* Push parsers. */
|
||||||
|
#define YYPUSH 0
|
||||||
|
|
||||||
|
/* Pull parsers. */
|
||||||
|
#define YYPULL 1
|
||||||
|
|
||||||
/* Using locations. */
|
/* Using locations. */
|
||||||
#define YYLSP_NEEDED 0
|
#define YYLSP_NEEDED 0
|
||||||
|
|
||||||
@ -68,6 +73,67 @@
|
|||||||
#define yynerrs zconfnerrs
|
#define yynerrs zconfnerrs
|
||||||
|
|
||||||
|
|
||||||
|
/* Copy the first part of user declarations. */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
||||||
|
|
||||||
|
#define PRINTD 0x0001
|
||||||
|
#define DEBUG_PARSE 0x0002
|
||||||
|
|
||||||
|
int cdebug = PRINTD;
|
||||||
|
|
||||||
|
extern int zconflex(void);
|
||||||
|
static void zconfprint(const char *err, ...);
|
||||||
|
static void zconf_error(const char *err, ...);
|
||||||
|
static void zconferror(const char *err);
|
||||||
|
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
||||||
|
|
||||||
|
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
|
||||||
|
|
||||||
|
static struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
|
#define YYDEBUG 0
|
||||||
|
#if YYDEBUG
|
||||||
|
#define YYERROR_VERBOSE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Enabling traces. */
|
||||||
|
#ifndef YYDEBUG
|
||||||
|
# define YYDEBUG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enabling verbose error messages. */
|
||||||
|
#ifdef YYERROR_VERBOSE
|
||||||
|
# undef YYERROR_VERBOSE
|
||||||
|
# define YYERROR_VERBOSE 1
|
||||||
|
#else
|
||||||
|
# define YYERROR_VERBOSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enabling the token table. */
|
||||||
|
#ifndef YYTOKEN_TABLE
|
||||||
|
# define YYTOKEN_TABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Tokens. */
|
/* Tokens. */
|
||||||
#ifndef YYTOKENTYPE
|
#ifndef YYTOKENTYPE
|
||||||
# define YYTOKENTYPE
|
# define YYTOKENTYPE
|
||||||
@ -108,129 +174,36 @@
|
|||||||
T_NOT = 289
|
T_NOT = 289
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
/* Tokens. */
|
|
||||||
#define T_MAINMENU 258
|
|
||||||
#define T_MENU 259
|
|
||||||
#define T_ENDMENU 260
|
|
||||||
#define T_SOURCE 261
|
|
||||||
#define T_CHOICE 262
|
|
||||||
#define T_ENDCHOICE 263
|
|
||||||
#define T_COMMENT 264
|
|
||||||
#define T_CONFIG 265
|
|
||||||
#define T_MENUCONFIG 266
|
|
||||||
#define T_HELP 267
|
|
||||||
#define T_HELPTEXT 268
|
|
||||||
#define T_IF 269
|
|
||||||
#define T_ENDIF 270
|
|
||||||
#define T_DEPENDS 271
|
|
||||||
#define T_OPTIONAL 272
|
|
||||||
#define T_PROMPT 273
|
|
||||||
#define T_TYPE 274
|
|
||||||
#define T_DEFAULT 275
|
|
||||||
#define T_SELECT 276
|
|
||||||
#define T_RANGE 277
|
|
||||||
#define T_OPTION 278
|
|
||||||
#define T_ON 279
|
|
||||||
#define T_WORD 280
|
|
||||||
#define T_WORD_QUOTE 281
|
|
||||||
#define T_UNEQUAL 282
|
|
||||||
#define T_CLOSE_PAREN 283
|
|
||||||
#define T_OPEN_PAREN 284
|
|
||||||
#define T_EOL 285
|
|
||||||
#define T_OR 286
|
|
||||||
#define T_AND 287
|
|
||||||
#define T_EQUAL 288
|
|
||||||
#define T_NOT 289
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Copy the first part of user declarations. */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
|
||||||
* Released under the terms of the GNU GPL v2.0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
|
||||||
#include "lkc.h"
|
|
||||||
|
|
||||||
#include "zconf.hash.c"
|
|
||||||
|
|
||||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
|
||||||
|
|
||||||
#define PRINTD 0x0001
|
|
||||||
#define DEBUG_PARSE 0x0002
|
|
||||||
|
|
||||||
int cdebug = PRINTD;
|
|
||||||
|
|
||||||
extern int zconflex(void);
|
|
||||||
static void zconfprint(const char *err, ...);
|
|
||||||
static void zconf_error(const char *err, ...);
|
|
||||||
static void zconferror(const char *err);
|
|
||||||
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
|
||||||
|
|
||||||
struct symbol *symbol_hash[257];
|
|
||||||
|
|
||||||
static struct menu *current_menu, *current_entry;
|
|
||||||
|
|
||||||
#define YYDEBUG 0
|
|
||||||
#if YYDEBUG
|
|
||||||
#define YYERROR_VERBOSE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Enabling traces. */
|
|
||||||
#ifndef YYDEBUG
|
|
||||||
# define YYDEBUG 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Enabling verbose error messages. */
|
|
||||||
#ifdef YYERROR_VERBOSE
|
|
||||||
# undef YYERROR_VERBOSE
|
|
||||||
# define YYERROR_VERBOSE 1
|
|
||||||
#else
|
|
||||||
# define YYERROR_VERBOSE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Enabling the token table. */
|
|
||||||
#ifndef YYTOKEN_TABLE
|
|
||||||
# define YYTOKEN_TABLE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
typedef union YYSTYPE
|
typedef union YYSTYPE
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
char *string;
|
char *string;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
struct symbol *symbol;
|
struct symbol *symbol;
|
||||||
struct expr *expr;
|
struct expr *expr;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
struct kconf_id *id;
|
struct kconf_id *id;
|
||||||
}
|
|
||||||
/* Line 187 of yacc.c. */
|
|
||||||
|
|
||||||
YYSTYPE;
|
|
||||||
|
|
||||||
|
} YYSTYPE;
|
||||||
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
# define YYSTYPE_IS_DECLARED 1
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
# define YYSTYPE_IS_TRIVIAL 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Copy the second part of user declarations. */
|
/* Copy the second part of user declarations. */
|
||||||
|
|
||||||
|
|
||||||
/* Line 216 of yacc.c. */
|
/* Include zconf.hash.c here so it can see the token constants. */
|
||||||
|
#include "zconf.hash.c"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef short
|
#ifdef short
|
||||||
@ -306,14 +279,14 @@ typedef short int yytype_int16;
|
|||||||
#if (defined __STDC__ || defined __C99__FUNC__ \
|
#if (defined __STDC__ || defined __C99__FUNC__ \
|
||||||
|| defined __cplusplus || defined _MSC_VER)
|
|| defined __cplusplus || defined _MSC_VER)
|
||||||
static int
|
static int
|
||||||
YYID (int i)
|
YYID (int yyi)
|
||||||
#else
|
#else
|
||||||
static int
|
static int
|
||||||
YYID (i)
|
YYID (yyi)
|
||||||
int i;
|
int yyi;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
return i;
|
return yyi;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -394,8 +367,8 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
|
|||||||
/* A type that is properly aligned for any stack member. */
|
/* A type that is properly aligned for any stack member. */
|
||||||
union yyalloc
|
union yyalloc
|
||||||
{
|
{
|
||||||
yytype_int16 yyss;
|
yytype_int16 yyss_alloc;
|
||||||
YYSTYPE yyvs;
|
YYSTYPE yyvs_alloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The size of the maximum gap between one aligned stack and the next. */
|
/* The size of the maximum gap between one aligned stack and the next. */
|
||||||
@ -430,12 +403,12 @@ union yyalloc
|
|||||||
elements in the stack, and YYPTR gives the new location of the
|
elements in the stack, and YYPTR gives the new location of the
|
||||||
stack. Advance YYPTR to a properly aligned location for the next
|
stack. Advance YYPTR to a properly aligned location for the next
|
||||||
stack. */
|
stack. */
|
||||||
# define YYSTACK_RELOCATE(Stack) \
|
# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
YYSIZE_T yynewbytes; \
|
YYSIZE_T yynewbytes; \
|
||||||
YYCOPY (&yyptr->Stack, Stack, yysize); \
|
YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
|
||||||
Stack = &yyptr->Stack; \
|
Stack = &yyptr->Stack_alloc; \
|
||||||
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
|
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
|
||||||
yyptr += yynewbytes / sizeof (*yyptr); \
|
yyptr += yynewbytes / sizeof (*yyptr); \
|
||||||
} \
|
} \
|
||||||
@ -558,18 +531,18 @@ static const yytype_int8 yyrhs[] =
|
|||||||
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
||||||
static const yytype_uint16 yyrline[] =
|
static const yytype_uint16 yyrline[] =
|
||||||
{
|
{
|
||||||
0, 104, 104, 106, 108, 109, 110, 111, 112, 113,
|
0, 107, 107, 109, 111, 112, 113, 114, 115, 116,
|
||||||
114, 118, 122, 122, 122, 122, 122, 122, 122, 126,
|
117, 121, 125, 125, 125, 125, 125, 125, 125, 129,
|
||||||
127, 128, 129, 130, 131, 135, 136, 142, 150, 156,
|
130, 131, 132, 133, 134, 138, 139, 145, 153, 159,
|
||||||
164, 174, 176, 177, 178, 179, 180, 181, 184, 192,
|
167, 177, 179, 180, 181, 182, 183, 184, 187, 195,
|
||||||
198, 208, 214, 220, 223, 225, 236, 237, 242, 251,
|
201, 211, 217, 223, 226, 228, 239, 240, 245, 254,
|
||||||
256, 264, 267, 269, 270, 271, 272, 273, 276, 282,
|
259, 267, 270, 272, 273, 274, 275, 276, 279, 285,
|
||||||
293, 299, 309, 311, 316, 324, 332, 335, 337, 338,
|
296, 302, 312, 314, 319, 327, 335, 338, 340, 341,
|
||||||
339, 344, 351, 356, 364, 367, 369, 370, 371, 374,
|
342, 347, 354, 359, 367, 370, 372, 373, 374, 377,
|
||||||
382, 389, 396, 402, 409, 411, 412, 413, 416, 424,
|
385, 392, 399, 405, 412, 414, 415, 416, 419, 427,
|
||||||
426, 431, 432, 435, 436, 437, 441, 442, 445, 446,
|
429, 434, 435, 438, 439, 440, 444, 445, 448, 449,
|
||||||
449, 450, 451, 452, 453, 454, 455, 458, 459, 462,
|
452, 453, 454, 455, 456, 457, 458, 461, 462, 465,
|
||||||
463
|
466
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -985,17 +958,20 @@ yy_symbol_print (yyoutput, yytype, yyvaluep)
|
|||||||
#if (defined __STDC__ || defined __C99__FUNC__ \
|
#if (defined __STDC__ || defined __C99__FUNC__ \
|
||||||
|| defined __cplusplus || defined _MSC_VER)
|
|| defined __cplusplus || defined _MSC_VER)
|
||||||
static void
|
static void
|
||||||
yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
|
yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
|
||||||
#else
|
#else
|
||||||
static void
|
static void
|
||||||
yy_stack_print (bottom, top)
|
yy_stack_print (yybottom, yytop)
|
||||||
yytype_int16 *bottom;
|
yytype_int16 *yybottom;
|
||||||
yytype_int16 *top;
|
yytype_int16 *yytop;
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
YYFPRINTF (stderr, "Stack now");
|
YYFPRINTF (stderr, "Stack now");
|
||||||
for (; bottom <= top; ++bottom)
|
for (; yybottom <= yytop; yybottom++)
|
||||||
YYFPRINTF (stderr, " %d", *bottom);
|
{
|
||||||
|
int yybot = *yybottom;
|
||||||
|
YYFPRINTF (stderr, " %d", yybot);
|
||||||
|
}
|
||||||
YYFPRINTF (stderr, "\n");
|
YYFPRINTF (stderr, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1029,11 +1005,11 @@ yy_reduce_print (yyvsp, yyrule)
|
|||||||
/* The symbols being reduced. */
|
/* The symbols being reduced. */
|
||||||
for (yyi = 0; yyi < yynrhs; yyi++)
|
for (yyi = 0; yyi < yynrhs; yyi++)
|
||||||
{
|
{
|
||||||
fprintf (stderr, " $%d = ", yyi + 1);
|
YYFPRINTF (stderr, " $%d = ", yyi + 1);
|
||||||
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
|
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
|
||||||
&(yyvsp[(yyi + 1) - (yynrhs)])
|
&(yyvsp[(yyi + 1) - (yynrhs)])
|
||||||
);
|
);
|
||||||
fprintf (stderr, "\n");
|
YYFPRINTF (stderr, "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1343,10 +1319,8 @@ yydestruct (yymsg, yytype, yyvaluep)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Prevent warnings from -Wmissing-prototypes. */
|
/* Prevent warnings from -Wmissing-prototypes. */
|
||||||
|
|
||||||
#ifdef YYPARSE_PARAM
|
#ifdef YYPARSE_PARAM
|
||||||
#if defined __STDC__ || defined __cplusplus
|
#if defined __STDC__ || defined __cplusplus
|
||||||
int yyparse (void *YYPARSE_PARAM);
|
int yyparse (void *YYPARSE_PARAM);
|
||||||
@ -1362,11 +1336,10 @@ int yyparse ();
|
|||||||
#endif /* ! YYPARSE_PARAM */
|
#endif /* ! YYPARSE_PARAM */
|
||||||
|
|
||||||
|
|
||||||
|
/* The lookahead symbol. */
|
||||||
/* The look-ahead symbol. */
|
|
||||||
int yychar;
|
int yychar;
|
||||||
|
|
||||||
/* The semantic value of the look-ahead symbol. */
|
/* The semantic value of the lookahead symbol. */
|
||||||
YYSTYPE yylval;
|
YYSTYPE yylval;
|
||||||
|
|
||||||
/* Number of syntax errors so far. */
|
/* Number of syntax errors so far. */
|
||||||
@ -1374,9 +1347,9 @@ int yynerrs;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*----------.
|
/*-------------------------.
|
||||||
| yyparse. |
|
| yyparse or yypush_parse. |
|
||||||
`----------*/
|
`-------------------------*/
|
||||||
|
|
||||||
#ifdef YYPARSE_PARAM
|
#ifdef YYPARSE_PARAM
|
||||||
#if (defined __STDC__ || defined __C99__FUNC__ \
|
#if (defined __STDC__ || defined __C99__FUNC__ \
|
||||||
@ -1401,13 +1374,38 @@ yyparse ()
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
int yystate;
|
int yystate;
|
||||||
int yyn;
|
|
||||||
int yyresult;
|
|
||||||
/* Number of tokens to shift before error messages enabled. */
|
/* Number of tokens to shift before error messages enabled. */
|
||||||
int yyerrstatus;
|
int yyerrstatus;
|
||||||
/* Look-ahead token as an internal (translated) token number. */
|
|
||||||
int yytoken = 0;
|
/* The stacks and their tools:
|
||||||
|
`yyss': related to states.
|
||||||
|
`yyvs': related to semantic values.
|
||||||
|
|
||||||
|
Refer to the stacks thru separate pointers, to allow yyoverflow
|
||||||
|
to reallocate them elsewhere. */
|
||||||
|
|
||||||
|
/* The state stack. */
|
||||||
|
yytype_int16 yyssa[YYINITDEPTH];
|
||||||
|
yytype_int16 *yyss;
|
||||||
|
yytype_int16 *yyssp;
|
||||||
|
|
||||||
|
/* The semantic value stack. */
|
||||||
|
YYSTYPE yyvsa[YYINITDEPTH];
|
||||||
|
YYSTYPE *yyvs;
|
||||||
|
YYSTYPE *yyvsp;
|
||||||
|
|
||||||
|
YYSIZE_T yystacksize;
|
||||||
|
|
||||||
|
int yyn;
|
||||||
|
int yyresult;
|
||||||
|
/* Lookahead token as an internal (translated) token number. */
|
||||||
|
int yytoken;
|
||||||
|
/* The variables used to return semantic value and location from the
|
||||||
|
action routines. */
|
||||||
|
YYSTYPE yyval;
|
||||||
|
|
||||||
#if YYERROR_VERBOSE
|
#if YYERROR_VERBOSE
|
||||||
/* Buffer for error messages, and its allocated size. */
|
/* Buffer for error messages, and its allocated size. */
|
||||||
char yymsgbuf[128];
|
char yymsgbuf[128];
|
||||||
@ -1415,39 +1413,17 @@ yyparse ()
|
|||||||
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
|
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Three stacks and their tools:
|
|
||||||
`yyss': related to states,
|
|
||||||
`yyvs': related to semantic values,
|
|
||||||
`yyls': related to locations.
|
|
||||||
|
|
||||||
Refer to the stacks thru separate pointers, to allow yyoverflow
|
|
||||||
to reallocate them elsewhere. */
|
|
||||||
|
|
||||||
/* The state stack. */
|
|
||||||
yytype_int16 yyssa[YYINITDEPTH];
|
|
||||||
yytype_int16 *yyss = yyssa;
|
|
||||||
yytype_int16 *yyssp;
|
|
||||||
|
|
||||||
/* The semantic value stack. */
|
|
||||||
YYSTYPE yyvsa[YYINITDEPTH];
|
|
||||||
YYSTYPE *yyvs = yyvsa;
|
|
||||||
YYSTYPE *yyvsp;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
|
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
|
||||||
|
|
||||||
YYSIZE_T yystacksize = YYINITDEPTH;
|
|
||||||
|
|
||||||
/* The variables used to return semantic value and location from the
|
|
||||||
action routines. */
|
|
||||||
YYSTYPE yyval;
|
|
||||||
|
|
||||||
|
|
||||||
/* The number of symbols on the RHS of the reduced rule.
|
/* The number of symbols on the RHS of the reduced rule.
|
||||||
Keep to zero when no symbol should be popped. */
|
Keep to zero when no symbol should be popped. */
|
||||||
int yylen = 0;
|
int yylen = 0;
|
||||||
|
|
||||||
|
yytoken = 0;
|
||||||
|
yyss = yyssa;
|
||||||
|
yyvs = yyvsa;
|
||||||
|
yystacksize = YYINITDEPTH;
|
||||||
|
|
||||||
YYDPRINTF ((stderr, "Starting parse\n"));
|
YYDPRINTF ((stderr, "Starting parse\n"));
|
||||||
|
|
||||||
yystate = 0;
|
yystate = 0;
|
||||||
@ -1459,7 +1435,6 @@ yyparse ()
|
|||||||
Waste one element of value and location stack
|
Waste one element of value and location stack
|
||||||
so that they stay on the same level as the state stack.
|
so that they stay on the same level as the state stack.
|
||||||
The wasted elements are never initialized. */
|
The wasted elements are never initialized. */
|
||||||
|
|
||||||
yyssp = yyss;
|
yyssp = yyss;
|
||||||
yyvsp = yyvs;
|
yyvsp = yyvs;
|
||||||
|
|
||||||
@ -1489,7 +1464,6 @@ yyparse ()
|
|||||||
YYSTYPE *yyvs1 = yyvs;
|
YYSTYPE *yyvs1 = yyvs;
|
||||||
yytype_int16 *yyss1 = yyss;
|
yytype_int16 *yyss1 = yyss;
|
||||||
|
|
||||||
|
|
||||||
/* Each stack pointer address is followed by the size of the
|
/* Each stack pointer address is followed by the size of the
|
||||||
data in use in that stack, in bytes. This used to be a
|
data in use in that stack, in bytes. This used to be a
|
||||||
conditional around just the two extra args, but that might
|
conditional around just the two extra args, but that might
|
||||||
@ -1497,7 +1471,6 @@ yyparse ()
|
|||||||
yyoverflow (YY_("memory exhausted"),
|
yyoverflow (YY_("memory exhausted"),
|
||||||
&yyss1, yysize * sizeof (*yyssp),
|
&yyss1, yysize * sizeof (*yyssp),
|
||||||
&yyvs1, yysize * sizeof (*yyvsp),
|
&yyvs1, yysize * sizeof (*yyvsp),
|
||||||
|
|
||||||
&yystacksize);
|
&yystacksize);
|
||||||
|
|
||||||
yyss = yyss1;
|
yyss = yyss1;
|
||||||
@ -1520,9 +1493,8 @@ yyparse ()
|
|||||||
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
|
||||||
if (! yyptr)
|
if (! yyptr)
|
||||||
goto yyexhaustedlab;
|
goto yyexhaustedlab;
|
||||||
YYSTACK_RELOCATE (yyss);
|
YYSTACK_RELOCATE (yyss_alloc, yyss);
|
||||||
YYSTACK_RELOCATE (yyvs);
|
YYSTACK_RELOCATE (yyvs_alloc, yyvs);
|
||||||
|
|
||||||
# undef YYSTACK_RELOCATE
|
# undef YYSTACK_RELOCATE
|
||||||
if (yyss1 != yyssa)
|
if (yyss1 != yyssa)
|
||||||
YYSTACK_FREE (yyss1);
|
YYSTACK_FREE (yyss1);
|
||||||
@ -1533,7 +1505,6 @@ yyparse ()
|
|||||||
yyssp = yyss + yysize - 1;
|
yyssp = yyss + yysize - 1;
|
||||||
yyvsp = yyvs + yysize - 1;
|
yyvsp = yyvs + yysize - 1;
|
||||||
|
|
||||||
|
|
||||||
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
|
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
|
||||||
(unsigned long int) yystacksize));
|
(unsigned long int) yystacksize));
|
||||||
|
|
||||||
@ -1543,6 +1514,9 @@ yyparse ()
|
|||||||
|
|
||||||
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
|
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
|
||||||
|
|
||||||
|
if (yystate == YYFINAL)
|
||||||
|
YYACCEPT;
|
||||||
|
|
||||||
goto yybackup;
|
goto yybackup;
|
||||||
|
|
||||||
/*-----------.
|
/*-----------.
|
||||||
@ -1551,16 +1525,16 @@ yyparse ()
|
|||||||
yybackup:
|
yybackup:
|
||||||
|
|
||||||
/* Do appropriate processing given the current state. Read a
|
/* Do appropriate processing given the current state. Read a
|
||||||
look-ahead token if we need one and don't already have one. */
|
lookahead token if we need one and don't already have one. */
|
||||||
|
|
||||||
/* First try to decide what to do without reference to look-ahead token. */
|
/* First try to decide what to do without reference to lookahead token. */
|
||||||
yyn = yypact[yystate];
|
yyn = yypact[yystate];
|
||||||
if (yyn == YYPACT_NINF)
|
if (yyn == YYPACT_NINF)
|
||||||
goto yydefault;
|
goto yydefault;
|
||||||
|
|
||||||
/* Not known => get a look-ahead token if don't already have one. */
|
/* Not known => get a lookahead token if don't already have one. */
|
||||||
|
|
||||||
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
|
/* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
|
||||||
if (yychar == YYEMPTY)
|
if (yychar == YYEMPTY)
|
||||||
{
|
{
|
||||||
YYDPRINTF ((stderr, "Reading a token: "));
|
YYDPRINTF ((stderr, "Reading a token: "));
|
||||||
@ -1592,19 +1566,15 @@ yybackup:
|
|||||||
goto yyreduce;
|
goto yyreduce;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (yyn == YYFINAL)
|
|
||||||
YYACCEPT;
|
|
||||||
|
|
||||||
/* Count tokens shifted since error; after three, turn off error
|
/* Count tokens shifted since error; after three, turn off error
|
||||||
status. */
|
status. */
|
||||||
if (yyerrstatus)
|
if (yyerrstatus)
|
||||||
yyerrstatus--;
|
yyerrstatus--;
|
||||||
|
|
||||||
/* Shift the look-ahead token. */
|
/* Shift the lookahead token. */
|
||||||
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
|
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
|
||||||
|
|
||||||
/* Discard the shifted token unless it is eof. */
|
/* Discard the shifted token. */
|
||||||
if (yychar != YYEOF)
|
|
||||||
yychar = YYEMPTY;
|
yychar = YYEMPTY;
|
||||||
|
|
||||||
yystate = yyn;
|
yystate = yyn;
|
||||||
@ -2029,7 +1999,6 @@ yyreduce:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
/* Line 1267 of yacc.c. */
|
|
||||||
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@ -2041,7 +2010,6 @@ yyreduce:
|
|||||||
|
|
||||||
*++yyvsp = yyval;
|
*++yyvsp = yyval;
|
||||||
|
|
||||||
|
|
||||||
/* Now `shift' the result of the reduction. Determine what state
|
/* Now `shift' the result of the reduction. Determine what state
|
||||||
that goes to, based on the state we popped back to and the rule
|
that goes to, based on the state we popped back to and the rule
|
||||||
number reduced by. */
|
number reduced by. */
|
||||||
@ -2106,7 +2074,7 @@ yyerrlab:
|
|||||||
|
|
||||||
if (yyerrstatus == 3)
|
if (yyerrstatus == 3)
|
||||||
{
|
{
|
||||||
/* If just tried and failed to reuse look-ahead token after an
|
/* If just tried and failed to reuse lookahead token after an
|
||||||
error, discard it. */
|
error, discard it. */
|
||||||
|
|
||||||
if (yychar <= YYEOF)
|
if (yychar <= YYEOF)
|
||||||
@ -2123,7 +2091,7 @@ yyerrlab:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Else will try to reuse look-ahead token after shifting the error
|
/* Else will try to reuse lookahead token after shifting the error
|
||||||
token. */
|
token. */
|
||||||
goto yyerrlab1;
|
goto yyerrlab1;
|
||||||
|
|
||||||
@ -2180,9 +2148,6 @@ yyerrlab1:
|
|||||||
YY_STACK_PRINT (yyss, yyssp);
|
YY_STACK_PRINT (yyss, yyssp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (yyn == YYFINAL)
|
|
||||||
YYACCEPT;
|
|
||||||
|
|
||||||
*++yyvsp = yylval;
|
*++yyvsp = yylval;
|
||||||
|
|
||||||
|
|
||||||
@ -2207,7 +2172,7 @@ yyabortlab:
|
|||||||
yyresult = 1;
|
yyresult = 1;
|
||||||
goto yyreturn;
|
goto yyreturn;
|
||||||
|
|
||||||
#ifndef yyoverflow
|
#if !defined(yyoverflow) || YYERROR_VERBOSE
|
||||||
/*-------------------------------------------------.
|
/*-------------------------------------------------.
|
||||||
| yyexhaustedlab -- memory exhaustion comes here. |
|
| yyexhaustedlab -- memory exhaustion comes here. |
|
||||||
`-------------------------------------------------*/
|
`-------------------------------------------------*/
|
||||||
@ -2218,7 +2183,7 @@ yyexhaustedlab:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
yyreturn:
|
yyreturn:
|
||||||
if (yychar != YYEOF && yychar != YYEMPTY)
|
if (yychar != YYEMPTY)
|
||||||
yydestruct ("Cleanup: discarding lookahead",
|
yydestruct ("Cleanup: discarding lookahead",
|
||||||
yytoken, &yylval);
|
yytoken, &yylval);
|
||||||
/* Do not reclaim the symbols of the rule which action triggered
|
/* Do not reclaim the symbols of the rule which action triggered
|
||||||
@ -2255,7 +2220,7 @@ void conf_parse(const char *name)
|
|||||||
zconf_initscan(name);
|
zconf_initscan(name);
|
||||||
|
|
||||||
sym_init();
|
sym_init();
|
||||||
menu_init();
|
_menu_init();
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
modules_sym->type = S_BOOLEAN;
|
modules_sym->type = S_BOOLEAN;
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
@ -2284,7 +2249,7 @@ void conf_parse(const char *name)
|
|||||||
sym_set_change_count(1);
|
sym_set_change_count(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *zconf_tokenname(int token)
|
static const char *zconf_tokenname(int token)
|
||||||
{
|
{
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case T_MENU: return "menu";
|
case T_MENU: return "menu";
|
||||||
@ -2348,7 +2313,7 @@ static void zconferror(const char *err)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_quoted_string(FILE *out, const char *str)
|
static void print_quoted_string(FILE *out, const char *str)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
int len;
|
int len;
|
||||||
@ -2365,15 +2330,15 @@ void print_quoted_string(FILE *out, const char *str)
|
|||||||
putc('"', out);
|
putc('"', out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_symbol(FILE *out, struct menu *menu)
|
static void print_symbol(FILE *out, struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
if (sym_is_choice(sym))
|
if (sym_is_choice(sym))
|
||||||
fprintf(out, "choice\n");
|
fprintf(out, "\nchoice\n");
|
||||||
else
|
else
|
||||||
fprintf(out, "config %s\n", sym->name);
|
fprintf(out, "\nconfig %s\n", sym->name);
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
fputs(" boolean\n", out);
|
fputs(" boolean\n", out);
|
||||||
@ -2419,6 +2384,21 @@ void print_symbol(FILE *out, struct menu *menu)
|
|||||||
case P_CHOICE:
|
case P_CHOICE:
|
||||||
fputs(" #choice value\n", out);
|
fputs(" #choice value\n", out);
|
||||||
break;
|
break;
|
||||||
|
case P_SELECT:
|
||||||
|
fputs( " select ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_RANGE:
|
||||||
|
fputs( " range ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_MENU:
|
||||||
|
fputs( " menu ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(out, " unknown prop %d!\n", prop->type);
|
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||||
break;
|
break;
|
||||||
@ -2430,7 +2410,6 @@ void print_symbol(FILE *out, struct menu *menu)
|
|||||||
menu->help[len] = 0;
|
menu->help[len] = 0;
|
||||||
fprintf(out, " help\n%s\n", menu->help);
|
fprintf(out, " help\n%s\n", menu->help);
|
||||||
}
|
}
|
||||||
fputc('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void zconfdump(FILE *out)
|
void zconfdump(FILE *out)
|
||||||
@ -2463,7 +2442,6 @@ void zconfdump(FILE *out)
|
|||||||
expr_fprint(prop->visible.expr, out);
|
expr_fprint(prop->visible.expr, out);
|
||||||
fputc('\n', out);
|
fputc('\n', out);
|
||||||
}
|
}
|
||||||
fputs("\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu->list)
|
if (menu->list)
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
#include "zconf.hash.c"
|
|
||||||
|
|
||||||
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
|
||||||
|
|
||||||
#define PRINTD 0x0001
|
#define PRINTD 0x0001
|
||||||
@ -29,7 +27,7 @@ static void zconf_error(const char *err, ...);
|
|||||||
static void zconferror(const char *err);
|
static void zconferror(const char *err);
|
||||||
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
|
||||||
|
|
||||||
struct symbol *symbol_hash[257];
|
struct symbol *symbol_hash[SYMBOL_HASHSIZE];
|
||||||
|
|
||||||
static struct menu *current_menu, *current_entry;
|
static struct menu *current_menu, *current_entry;
|
||||||
|
|
||||||
@ -100,6 +98,11 @@ static struct menu *current_menu, *current_entry;
|
|||||||
menu_end_menu();
|
menu_end_menu();
|
||||||
} if_entry menu_entry choice_entry
|
} if_entry menu_entry choice_entry
|
||||||
|
|
||||||
|
%{
|
||||||
|
/* Include zconf.hash.c here so it can see the token constants. */
|
||||||
|
#include "zconf.hash.c"
|
||||||
|
%}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
input: stmt_list;
|
input: stmt_list;
|
||||||
|
|
||||||
@ -472,7 +475,7 @@ void conf_parse(const char *name)
|
|||||||
zconf_initscan(name);
|
zconf_initscan(name);
|
||||||
|
|
||||||
sym_init();
|
sym_init();
|
||||||
menu_init();
|
_menu_init();
|
||||||
modules_sym = sym_lookup(NULL, 0);
|
modules_sym = sym_lookup(NULL, 0);
|
||||||
modules_sym->type = S_BOOLEAN;
|
modules_sym->type = S_BOOLEAN;
|
||||||
modules_sym->flags |= SYMBOL_AUTO;
|
modules_sym->flags |= SYMBOL_AUTO;
|
||||||
@ -501,7 +504,7 @@ void conf_parse(const char *name)
|
|||||||
sym_set_change_count(1);
|
sym_set_change_count(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *zconf_tokenname(int token)
|
static const char *zconf_tokenname(int token)
|
||||||
{
|
{
|
||||||
switch (token) {
|
switch (token) {
|
||||||
case T_MENU: return "menu";
|
case T_MENU: return "menu";
|
||||||
@ -565,7 +568,7 @@ static void zconferror(const char *err)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_quoted_string(FILE *out, const char *str)
|
static void print_quoted_string(FILE *out, const char *str)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
int len;
|
int len;
|
||||||
@ -582,15 +585,15 @@ void print_quoted_string(FILE *out, const char *str)
|
|||||||
putc('"', out);
|
putc('"', out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_symbol(FILE *out, struct menu *menu)
|
static void print_symbol(FILE *out, struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
if (sym_is_choice(sym))
|
if (sym_is_choice(sym))
|
||||||
fprintf(out, "choice\n");
|
fprintf(out, "\nchoice\n");
|
||||||
else
|
else
|
||||||
fprintf(out, "config %s\n", sym->name);
|
fprintf(out, "\nconfig %s\n", sym->name);
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_BOOLEAN:
|
case S_BOOLEAN:
|
||||||
fputs(" boolean\n", out);
|
fputs(" boolean\n", out);
|
||||||
@ -636,6 +639,21 @@ void print_symbol(FILE *out, struct menu *menu)
|
|||||||
case P_CHOICE:
|
case P_CHOICE:
|
||||||
fputs(" #choice value\n", out);
|
fputs(" #choice value\n", out);
|
||||||
break;
|
break;
|
||||||
|
case P_SELECT:
|
||||||
|
fputs( " select ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_RANGE:
|
||||||
|
fputs( " range ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_MENU:
|
||||||
|
fputs( " menu ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(out, " unknown prop %d!\n", prop->type);
|
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||||
break;
|
break;
|
||||||
@ -647,7 +665,6 @@ void print_symbol(FILE *out, struct menu *menu)
|
|||||||
menu->help[len] = 0;
|
menu->help[len] = 0;
|
||||||
fprintf(out, " help\n%s\n", menu->help);
|
fprintf(out, " help\n%s\n", menu->help);
|
||||||
}
|
}
|
||||||
fputc('\n', out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void zconfdump(FILE *out)
|
void zconfdump(FILE *out)
|
||||||
@ -680,7 +697,6 @@ void zconfdump(FILE *out)
|
|||||||
expr_fprint(prop->visible.expr, out);
|
expr_fprint(prop->visible.expr, out);
|
||||||
fputc('\n', out);
|
fputc('\n', out);
|
||||||
}
|
}
|
||||||
fputs("\n", out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menu->list)
|
if (menu->list)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user