mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-27 16:43:09 +02:00
Initial revision
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@197 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
commit
2f006aa5e8
6
.cvsignore
Normal file
6
.cvsignore
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
dl
|
||||||
|
.config*
|
||||||
|
.tmpconfig.h
|
||||||
|
root_fs*
|
||||||
|
build_*
|
||||||
|
toolchain_build_*
|
113
.defconfig
Normal file
113
.defconfig
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
#
|
||||||
|
# Automatically generated make config: don't edit
|
||||||
|
#
|
||||||
|
BR2_HAVE_DOT_CONFIG=y
|
||||||
|
# BR2_arm is not set
|
||||||
|
# BR2_armeb is not set
|
||||||
|
# BR2_cris is not set
|
||||||
|
# BR2_i386 is not set
|
||||||
|
# BR2_m68k is not set
|
||||||
|
# BR2_mips is not set
|
||||||
|
BR2_mipsel=y
|
||||||
|
# BR2_powerpc is not set
|
||||||
|
# BR2_sh3 is not set
|
||||||
|
# BR2_sh3eb is not set
|
||||||
|
# BR2_sh4 is not set
|
||||||
|
# BR2_sh4eb is not set
|
||||||
|
# BR2_sparc is not set
|
||||||
|
BR2_ARCH="mipsel"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Build options
|
||||||
|
#
|
||||||
|
BR2_WGET="wget --passive-ftp"
|
||||||
|
# BR2_TAR_VERBOSITY is not set
|
||||||
|
BR2_STAGING_DIR="$(BUILD_DIR)/staging_dir"
|
||||||
|
BR2_JLEVEL=1
|
||||||
|
|
||||||
|
#
|
||||||
|
# Toolchain Options
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# uClibc Options
|
||||||
|
#
|
||||||
|
BR2_UCLIBC_VERSION_SNAPSHOT=y
|
||||||
|
BR2_USE_UCLIBC_SNAPSHOT="snapshot"
|
||||||
|
# BR2_ENABLE_LOCALE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Binutils Options
|
||||||
|
#
|
||||||
|
# BR2_BINUTILS_VERSION_2_14_90_0_6 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_14_90_0_7 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_14_90_0_8 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_90_0_1 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_90_0_1_1 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_90_0_2 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_90_0_3 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_91_0_1 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_91_0_2 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_92_0_2 is not set
|
||||||
|
# BR2_BINUTILS_VERSION_2_15_94_0_1 is not set
|
||||||
|
BR2_BINUTILS_VERSION_2_15_94_0_2=y
|
||||||
|
BR2_BINUTILS_VERSION="2.15.94.0.2"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Gcc Options
|
||||||
|
#
|
||||||
|
# BR2_GCC_VERSION_2_95 is not set
|
||||||
|
# BR2_GCC_VERSION_3_3_3 is not set
|
||||||
|
# BR2_GCC_VERSION_3_3_4 is not set
|
||||||
|
# BR2_GCC_VERSION_3_3_5 is not set
|
||||||
|
# BR2_GCC_VERSION_3_4_0 is not set
|
||||||
|
# BR2_GCC_VERSION_3_4_1 is not set
|
||||||
|
# BR2_GCC_VERSION_3_4_2 is not set
|
||||||
|
BR2_GCC_VERSION_3_4_3=y
|
||||||
|
BR2_GCC_VERSION="3.4.3"
|
||||||
|
BR2_GCC_USE_SJLJ_EXCEPTIONS="--enable-sjlj-exceptions"
|
||||||
|
BR2_EXTRA_GCC_CONFIG_OPTIONS=""
|
||||||
|
# BR2_INSTALL_LIBSTDCPP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Ccache Options
|
||||||
|
#
|
||||||
|
BR2_CCACHE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Gdb Options
|
||||||
|
#
|
||||||
|
# BR2_PACKAGE_GDB is not set
|
||||||
|
# BR2_PACKAGE_GDB_SERVER is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common Toolchain Options
|
||||||
|
#
|
||||||
|
# BR2_ENABLE_MULTILIB is not set
|
||||||
|
# BR2_LARGEFILE is not set
|
||||||
|
BR2_TARGET_OPTIMIZATION="-Os -pipe"
|
||||||
|
|
||||||
|
#
|
||||||
|
# OpenWrt Package Selection
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# The default set
|
||||||
|
#
|
||||||
|
BR2_PACKAGE_BUSYBOX=y
|
||||||
|
BR2_PACKAGE_BUSYBOX_SNAPSHOT=y
|
||||||
|
# BR2_PACKAGE_DNSMASQ is not set
|
||||||
|
# BR2_PACKAGE_LINUX is not set
|
||||||
|
# BR2_PACKAGE_IPTABLES is not set
|
||||||
|
# BR2_PACKAGE_BRIDGE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Suggested Extras
|
||||||
|
#
|
||||||
|
# BR2_PACKAGE_DROPBEAR_SSHD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Target Filesystem
|
||||||
|
#
|
||||||
|
# BR2_TARGET_ROOTFS_JFFS2 is not set
|
109
Config.in
Normal file
109
Config.in
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#
|
||||||
|
|
||||||
|
mainmenu "Buildroot2 Configuration"
|
||||||
|
|
||||||
|
config BR2_HAVE_DOT_CONFIG
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "Target Architecture"
|
||||||
|
default BR2_i386
|
||||||
|
help
|
||||||
|
Stuff
|
||||||
|
|
||||||
|
config BR2_arm
|
||||||
|
bool "arm"
|
||||||
|
|
||||||
|
config BR2_armeb
|
||||||
|
bool "armeb"
|
||||||
|
|
||||||
|
config BR2_cris
|
||||||
|
bool "cris"
|
||||||
|
|
||||||
|
config BR2_i386
|
||||||
|
bool "i386"
|
||||||
|
|
||||||
|
config BR2_m68k
|
||||||
|
bool "m68k"
|
||||||
|
|
||||||
|
config BR2_mips
|
||||||
|
bool "mips"
|
||||||
|
|
||||||
|
config BR2_mipsel
|
||||||
|
bool "mipsel"
|
||||||
|
|
||||||
|
config BR2_powerpc
|
||||||
|
bool "powerpc"
|
||||||
|
|
||||||
|
config BR2_sh3
|
||||||
|
bool "sh3"
|
||||||
|
|
||||||
|
config BR2_sh3eb
|
||||||
|
bool "sh3eb"
|
||||||
|
|
||||||
|
config BR2_sh4
|
||||||
|
bool "sh4"
|
||||||
|
|
||||||
|
config BR2_sh4eb
|
||||||
|
bool "sh4eb"
|
||||||
|
|
||||||
|
config BR2_sparc
|
||||||
|
bool "sparc"
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config BR2_ARCH
|
||||||
|
string
|
||||||
|
default "arm" if BR2_arm
|
||||||
|
default "armeb" if BR2_armeb
|
||||||
|
default "cris" if BR2_cris
|
||||||
|
default "i386" if BR2_i386
|
||||||
|
default "m68k" if BR2_m68k
|
||||||
|
default "mips" if BR2_mips
|
||||||
|
default "mipsel" if BR2_mipsel
|
||||||
|
default "powerpc" if BR2_powerpc
|
||||||
|
default "sh3" if BR2_sh3
|
||||||
|
default "sh3eb" if BR2_sh3eb
|
||||||
|
default "sh4" if BR2_sh4
|
||||||
|
default "sh4eb" if BR2_sh4eb
|
||||||
|
default "sparc" if BR2_sparc
|
||||||
|
|
||||||
|
|
||||||
|
menu "Build options"
|
||||||
|
|
||||||
|
config BR2_WGET
|
||||||
|
string "Wget command"
|
||||||
|
default "wget --passive-ftp -nd"
|
||||||
|
|
||||||
|
config BR2_TAR_VERBOSITY
|
||||||
|
bool "Tar verbose"
|
||||||
|
default n
|
||||||
|
|
||||||
|
config BR2_STAGING_DIR
|
||||||
|
string "Toolchain and header file location?"
|
||||||
|
default "$(BUILD_DIR)/staging_dir"
|
||||||
|
help
|
||||||
|
This is the location where the toolchain will be installed.
|
||||||
|
Since the toolchain will not work if it is moved from this
|
||||||
|
location, it is important for people wishing to package up
|
||||||
|
a uClibc toolchain that this be set to the location in which
|
||||||
|
the toolchain will be used.
|
||||||
|
|
||||||
|
Most people will leave this set to the default value of
|
||||||
|
"$(BUILD_DIR)/staging_dir".
|
||||||
|
|
||||||
|
config BR2_JLEVEL
|
||||||
|
int "Number of jobs to run simultaneously"
|
||||||
|
default "1"
|
||||||
|
help
|
||||||
|
Number of jobs to run simultanesouly
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
|
||||||
|
source "toolchain/Config.in"
|
||||||
|
|
||||||
|
source "package/Config.in"
|
||||||
|
|
||||||
|
source "target/Config.in"
|
||||||
|
|
191
Makefile
Normal file
191
Makefile
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
# Makefile for buildroot2
|
||||||
|
#
|
||||||
|
# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
#
|
||||||
|
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
# Just run 'make menuconfig', configure stuff, then run 'make'.
|
||||||
|
# You shouldn't need to mess with anything beyond this point...
|
||||||
|
#--------------------------------------------------------------
|
||||||
|
TOPDIR=./
|
||||||
|
CONFIG_CONFIG_IN = Config.in
|
||||||
|
CONFIG_DEFCONFIG = .defconfig
|
||||||
|
CONFIG = package/config
|
||||||
|
|
||||||
|
noconfig_targets := menuconfig config oldconfig randconfig \
|
||||||
|
defconfig allyesconfig allnoconfig release tags
|
||||||
|
|
||||||
|
# Pull in the user's configuration file
|
||||||
|
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
|
||||||
|
-include $(TOPDIR).config
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(BR2_TAR_VERBOSITY),y)
|
||||||
|
TAR_OPTIONS=-xvf
|
||||||
|
else
|
||||||
|
TAR_OPTIONS=-xf
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# The list of stuff to build for the target toolchain
|
||||||
|
# along with the packages to build for the target.
|
||||||
|
#
|
||||||
|
##############################################################
|
||||||
|
TARGETS:=linux-headers host-sed uclibc-configured binutils gcc uclibc-target-utils
|
||||||
|
include toolchain/Makefile.in
|
||||||
|
include toolchain/*/Makefile.in
|
||||||
|
include package/Makefile.in
|
||||||
|
include package/*/Makefile.in
|
||||||
|
include target/Makefile.in
|
||||||
|
include target/*/Makefile.in
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# You should probably leave this stuff alone unless you know
|
||||||
|
# what you are doing.
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
all: world
|
||||||
|
|
||||||
|
# In this section, we need .config
|
||||||
|
include .config.cmd
|
||||||
|
|
||||||
|
TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
|
||||||
|
TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS))
|
||||||
|
|
||||||
|
world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS)
|
||||||
|
|
||||||
|
.PHONY: all world clean distclean source $(TARGETS) \
|
||||||
|
$(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \
|
||||||
|
$(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR)
|
||||||
|
|
||||||
|
include toolchain/*/*.mk
|
||||||
|
include package/*/*.mk
|
||||||
|
include target/*/*.mk
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# staging and target directories do NOT list these as
|
||||||
|
# dependancies anywhere else
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
$(DL_DIR):
|
||||||
|
@mkdir -p $(DL_DIR)
|
||||||
|
|
||||||
|
$(BUILD_DIR):
|
||||||
|
@mkdir -p $(BUILD_DIR)
|
||||||
|
|
||||||
|
$(TOOL_BUILD_DIR):
|
||||||
|
@mkdir -p $(TOOL_BUILD_DIR)
|
||||||
|
|
||||||
|
$(STAGING_DIR):
|
||||||
|
@mkdir -p $(STAGING_DIR)/lib
|
||||||
|
@mkdir -p $(STAGING_DIR)/include
|
||||||
|
@mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)
|
||||||
|
@ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib
|
||||||
|
|
||||||
|
$(TARGET_DIR):
|
||||||
|
zcat target/default/skel.tar.gz | tar -C $(BUILD_DIR) -xf -
|
||||||
|
cp -a target/default/target_skeleton/* $(TARGET_DIR)/
|
||||||
|
-find $(TARGET_DIR) -type d -name CVS -exec rm -rf {} \; > /dev/null 2>&1
|
||||||
|
|
||||||
|
source: $(TARGETS_SOURCE)
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# Cleanup and misc junk
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILD_DIR) $(IMAGE).*
|
||||||
|
@$(MAKE) -C $(CONFIG) clean
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -rf $(DL_DIR) $(TOOL_BUILD_DIR) .config
|
||||||
|
|
||||||
|
sourceball:
|
||||||
|
rm -rf $(BUILD_DIR)
|
||||||
|
set -e; \
|
||||||
|
cd ..; \
|
||||||
|
rm -f buildroot.tar.bz2; \
|
||||||
|
tar -cvf buildroot.tar buildroot; \
|
||||||
|
bzip2 -9 buildroot.tar; \
|
||||||
|
|
||||||
|
|
||||||
|
else # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
|
||||||
|
|
||||||
|
all: menuconfig
|
||||||
|
|
||||||
|
# configuration
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
$(CONFIG)/conf:
|
||||||
|
$(MAKE) -C $(CONFIG) conf
|
||||||
|
-@if [ ! -f .config ] ; then \
|
||||||
|
cp $(CONFIG_DEFCONFIG) .config; \
|
||||||
|
fi
|
||||||
|
$(CONFIG)/mconf:
|
||||||
|
$(MAKE) -C $(CONFIG) ncurses conf mconf
|
||||||
|
-@if [ ! -f .config ] ; then \
|
||||||
|
cp $(CONFIG_DEFCONFIG) .config; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
menuconfig: $(CONFIG)/mconf
|
||||||
|
@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
config: $(CONFIG)/conf
|
||||||
|
@$(CONFIG)/conf $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
oldconfig: $(CONFIG)/conf
|
||||||
|
@$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
randconfig: $(CONFIG)/conf
|
||||||
|
@$(CONFIG)/conf -r $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
allyesconfig: $(CONFIG)/conf
|
||||||
|
#@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN)
|
||||||
|
#sed -i -e "s/^CONFIG_DEBUG.*/# CONFIG_DEBUG is not set/" .config
|
||||||
|
@$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
allnoconfig: $(CONFIG)/conf
|
||||||
|
@$(CONFIG)/conf -n $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
defconfig: $(CONFIG)/conf
|
||||||
|
@$(CONFIG)/conf -d $(CONFIG_CONFIG_IN)
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# Cleanup and misc junk
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
clean:
|
||||||
|
@$(MAKE) -C $(CONFIG) clean
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
|
||||||
|
endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
|
||||||
|
|
||||||
|
.PHONY: dummy subdirs release distclean clean config oldconfig \
|
||||||
|
menuconfig tags check test depend
|
||||||
|
|
||||||
|
|
18
docs/README
Normal file
18
docs/README
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
To build and use the buildroot stuff, do the following:
|
||||||
|
|
||||||
|
1) run 'make'
|
||||||
|
2) select which packages you wish to compile
|
||||||
|
3) run 'make'
|
||||||
|
4) wait while it compiles
|
||||||
|
5) Use your shiney new root filesystem. Depending on which sortof
|
||||||
|
root filesystem you selecter, you may want to loop mount it,
|
||||||
|
chroot into it, loop mount it and then nfs mount that on your
|
||||||
|
target device, burn it to flash, or whatever is appropriate
|
||||||
|
for your target system.
|
||||||
|
|
||||||
|
You do not need to be root to build or run buildroot. Have fun!
|
||||||
|
|
||||||
|
-Erik
|
||||||
|
|
||||||
|
Please feed suggestions, bug reports, insults, and bribes back to:
|
||||||
|
Erik Andersen <andersen@codepoet.org>
|
644
docs/buildroot-documentation.html
Normal file
644
docs/buildroot-documentation.html
Normal file
@ -0,0 +1,644 @@
|
|||||||
|
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Buildroot - Usage and documentation</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="main">
|
||||||
|
<div class="titre">
|
||||||
|
<h1>Buildroot</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>Usage and documentation by Thomas Petazzoni. Contributions from
|
||||||
|
Karsten Kruse, Ned Ludd, Martin Herren.</p>
|
||||||
|
|
||||||
|
<p><small>Last modification : $Id$</small></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="#about">About Buildroot</a></li>
|
||||||
|
<li><a href="#download">Obtaining Buildroot</a></li>
|
||||||
|
<li><a href="#using">Using Buildroot</a></li>
|
||||||
|
<li><a href="#custom_targetfs">Customizing the target filesystem</a></li>
|
||||||
|
<li><a href="#custom_busybox">Customizing the Busybox
|
||||||
|
configuration</a></li>
|
||||||
|
<li><a href="#custom_uclibc">Customizing the uClibc
|
||||||
|
configuration</a></li>
|
||||||
|
<li><a href="#buildroot_innards">How Buildroot works</a></li>
|
||||||
|
<li><a href="#using_toolchain">Using the uClibc toolchain</a></li>
|
||||||
|
<li><a href="#toolchain_standalone">Using the uClibc toolchain
|
||||||
|
outside of Buildroot</a></li>
|
||||||
|
<li><a href="#downloaded_packages">Location of downloaded packages</a></li>
|
||||||
|
<li><a href="#add_software">Extending Buildroot with more
|
||||||
|
Software</a></li>
|
||||||
|
<li><a href="#links">Ressources</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2><a name="about" id="about"></a>About Buildroot</h2>
|
||||||
|
|
||||||
|
<p>Buildroot is a set of Makefiles and patches that allows to easily
|
||||||
|
generate both a cross-compilation toolchain and a root filesystem for your
|
||||||
|
target. The cross-compilation toolchain uses uClibc (<a href=
|
||||||
|
"http://www.uclibc.org/">http://www.uclibc.org/</a>), a tiny C standard
|
||||||
|
library.</p>
|
||||||
|
|
||||||
|
<p>Buildroot is useful mainly for people working with embedded systems.
|
||||||
|
Embedded systems often use processors that are not the regular x86
|
||||||
|
processors everyone is used to have on his PC. It can be PowerPC
|
||||||
|
processors, MIPS processors, ARM processors, etc.</p>
|
||||||
|
|
||||||
|
<p>A compilation toolchain is the set of tools that allows to
|
||||||
|
compile code for your system. It consists of a compiler (in our
|
||||||
|
case, <code>gcc</code>), binary utils like assembler and linker
|
||||||
|
(in our case, <code>binutils</code>) and a C standard library (for
|
||||||
|
example <a href="http://www.gnu.org/software/libc/libc.html">GNU
|
||||||
|
Libc</a>, <a href="http://www.uclibc.org">uClibc</a> or <a
|
||||||
|
href="http://www.fefe.de/dietlibc/">dietlibc</a>). The system
|
||||||
|
installed on your development station certainly already has a
|
||||||
|
compilation toolchain that you can use to compile application that
|
||||||
|
runs on your system. If you're using a PC, your compilation
|
||||||
|
toolchain runs on an x86 processor and generates code for a x86
|
||||||
|
processor. Under most Linux systems, the compilation toolchain
|
||||||
|
uses the GNU libc as C standard library. This compilation
|
||||||
|
toolchain is called the "host compilation toolchain", and more
|
||||||
|
generally, the machine on which it is running, and on which you're
|
||||||
|
working is called the "host system". The compilation toolchain is
|
||||||
|
provided by your distribution, and Buildroot has nothing to do
|
||||||
|
with it.</p>
|
||||||
|
|
||||||
|
<p>As said above, the compilation toolchain that comes with your system
|
||||||
|
runs and generates code for the processor of your host system. As your
|
||||||
|
embedded system has a different processor, you need a cross-compilation
|
||||||
|
toolchain: it's a compilation toolchain that runs on your host system but
|
||||||
|
that generates code for your target system (and target processor). For
|
||||||
|
example, if your host system uses x86 and your target system uses ARM, the
|
||||||
|
regular compilation toolchain of your host runs on x86 and generates code
|
||||||
|
for x86, while the cross-compilation toolchain runs on x86 and generates
|
||||||
|
code for ARM.</p>
|
||||||
|
|
||||||
|
<p>Even if your embedded system uses a x86 processor, you might interested
|
||||||
|
in Buildroot, for two reasons:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>The compilation toolchain of your host certainly uses the GNU Libc
|
||||||
|
which is a complete but huge C standard library. Instead of using GNU
|
||||||
|
Libc on your target system, you can use uClibc which is a tiny C standard
|
||||||
|
library. If you want to use this C library, then you need a compilation
|
||||||
|
toolchain to generate binaries linked with it. Buildroot can do it for
|
||||||
|
you.</li>
|
||||||
|
|
||||||
|
<li>Buildroot automates the building of a root filesystem with all needed
|
||||||
|
tools like busybox. It makes it much easier than doing it by hand.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>You might wonder why such a tool is needed when you can compile
|
||||||
|
<code>gcc</code>, <code>binutils</code>, uClibc and all the tools by hand.
|
||||||
|
Of course, doing so is possible. But dealing with all configure options,
|
||||||
|
with all problems of every <code>gcc</code> or <code>binutils</code>
|
||||||
|
version it very time-consuming and uninteresting. Buildroot automates this
|
||||||
|
process through the use of Makefiles, and has a collection of patches for
|
||||||
|
each <code>gcc</code> and <code>binutils</code> version to make them work
|
||||||
|
on most architectures.</p>
|
||||||
|
|
||||||
|
<h2><a name="download" id="download"></a>Obtaining Buildroot</h2>
|
||||||
|
|
||||||
|
<p>Buildroot is available as daily CVS snapshots or directly using
|
||||||
|
CVS.</p>
|
||||||
|
|
||||||
|
<p>The latest snapshot is always available at <a
|
||||||
|
href="http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2">http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2</a>,
|
||||||
|
and previous snapshots are also available at <a
|
||||||
|
href="http://uclibc.org/downloads/snapshots/">http://uclibc.org/downloads/snapshots/</a>.</p>
|
||||||
|
|
||||||
|
<p>To download Buildroot using CVS, you can simply follow
|
||||||
|
the rules described on the "Accessing CVS"-page (<a href=
|
||||||
|
"http://www.uclibc.org/cvs_anon.html">http://www.uclibc.org/cvs_anon.html</a>)
|
||||||
|
of the uClibc website (<a href=
|
||||||
|
"http://www.uclibc.org">http://www.uclibc.org</a>), and download the
|
||||||
|
<code>buildroot</code> CVS module. For the impatient, here's a quick
|
||||||
|
recipe:</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ cvs -d:pserver:anonymous@uclibc.org:/var/cvs login
|
||||||
|
$ cvs -z3 -d:pserver:anonymous@uclibc.org:/var/cvs co buildroot
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="using" id="using"></a>Using Buildroot</h2>
|
||||||
|
|
||||||
|
<p>Buildroot has a nice configuration tool similar to the one you can find
|
||||||
|
in the Linux Kernel (<a href=
|
||||||
|
"http://www.kernel.org/">http://www.kernel.org/</a>) or in Busybox
|
||||||
|
(<a href="http://www.busybox.org/">http://www.busybox.org/</a>). Note that
|
||||||
|
you can run everything as a normal user. There is no need to be root to
|
||||||
|
configure and use Buildroot. The first step is to run the configuration
|
||||||
|
assistant:</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ make menuconfig
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>For each entry of the configuration tool, you can find associated help
|
||||||
|
that describes the purpose of the entry.</p>
|
||||||
|
|
||||||
|
<p>Once everything is configured, the configuration tool has generated a
|
||||||
|
<code>.config</code> file that contains the description of your
|
||||||
|
configuration. It will be used by the Makefiles to do what's needed.</p>
|
||||||
|
|
||||||
|
<p>Let's go:</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
$ make
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>This command will download, configure and compile all the selected
|
||||||
|
tools, and finally generate a target filesystem. The target filesystem will
|
||||||
|
be named <code>root_fs_ARCH.EXT</code> where <code>ARCH</code> is your
|
||||||
|
architecture and <code>EXT</code> depends on the type of target filesystem
|
||||||
|
selected in the <code>Target options</code> section of the configuration
|
||||||
|
tool.</p>
|
||||||
|
|
||||||
|
<h2><a name="custom_targetfs" id="custom_targetfs"></a>Customizing the
|
||||||
|
target filesystem</h2>
|
||||||
|
|
||||||
|
<p>There are two ways to customize the resulting target filesystem:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Customize the target filesystem directly, and rebuild the image. The
|
||||||
|
target filesystem is available under <code>build_ARCH/root/</code> where
|
||||||
|
<code>ARCH</code> is the chosen target architecture. You can simply make
|
||||||
|
your changes here, and run make afterwards, which will rebuild the target
|
||||||
|
filesystem image. This method allows to do everything on the target
|
||||||
|
filesystem, but if you decide to completely rebuild your toolchain and
|
||||||
|
tools, these changes will be lost.</li>
|
||||||
|
|
||||||
|
<li>Customize the target filesystem skeleton, available under
|
||||||
|
<code>target/default/target_skeleton/</code>. You can customize
|
||||||
|
configuration files or other stuff here. However, the full file hierarchy
|
||||||
|
is not yet present, because it's created during the compilation process.
|
||||||
|
So you can't do everything on this target filesystem skeleton, but
|
||||||
|
changes to it remains even you completely rebuild the cross-compilation
|
||||||
|
toolchain and the tools.<br />
|
||||||
|
You can also customize the <code>target/default/device_table.txt</code>
|
||||||
|
file which is used by the tools that generate the target filesystem image
|
||||||
|
to properly set permissions and create device nodes. The
|
||||||
|
<code>target/default/skel.tar.gz</code> file contains the main
|
||||||
|
directories of a root filesystem and there is no obvious reason for which
|
||||||
|
it should be changed. These main directories are in an tarball inside of
|
||||||
|
inside the skeleton because it contains symlinks that would be broken
|
||||||
|
otherwise.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2><a name="custom_busybox" id="custom_busybox"></a>Customizing the
|
||||||
|
Busybox configuration</h2>
|
||||||
|
|
||||||
|
<p>Busybox is very configurable, and you may want to customize it. You can
|
||||||
|
follow these simple steps to do it. It's not an optimal way, but it's
|
||||||
|
simple and it works.</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Make a first compilation of buildroot with busybox without trying to
|
||||||
|
customize it.</li>
|
||||||
|
|
||||||
|
<li>Go into <code>build_ARCH/busybox/</code> and run <code>make
|
||||||
|
menuconfig</code>. The nice configuration tool appears and you can
|
||||||
|
customize everything.</li>
|
||||||
|
|
||||||
|
<li>Copy the <code>.config</code> file to
|
||||||
|
<code>package/busybox/busybox.config</code> so that your customized
|
||||||
|
configuration will remains even if you remove the cross-compilation
|
||||||
|
toolchain.</li>
|
||||||
|
|
||||||
|
<li>Run the compilation of buildroot again.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>Otherwise, you can simply change the
|
||||||
|
<code>package/busybox/busybox.config</code> file if you know the options
|
||||||
|
you want to change without using the configuration tool.</p>
|
||||||
|
|
||||||
|
<h2><a name="custom_uclibc" id="custom_uclibc"></a>Customizing the uClibc
|
||||||
|
configuration</h2>
|
||||||
|
|
||||||
|
<p>Just like <a href="#custom_busybox">BusyBox</a>, <a
|
||||||
|
href="http://www.uclibc.org">uClibc</a> offers a lot of
|
||||||
|
configuration options. They allow to select various
|
||||||
|
functionalities, depending on your needs and limitations.</p>
|
||||||
|
|
||||||
|
<p>The easiest way to modify the configuration of uClibc is to
|
||||||
|
follow these steps :</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
|
||||||
|
<li>Make a first compilation of buildroot without trying to
|
||||||
|
customize uClibc.</li>
|
||||||
|
|
||||||
|
<li>Go into the directory
|
||||||
|
<code>toolchain_build_ARCH/uClibc/</code> and run <code>make
|
||||||
|
menuconfig</code>. The nice configuration assistant, similar to
|
||||||
|
the one used in the Linux Kernel or in Buildroot appears. Make
|
||||||
|
your configuration as appropriate.</li>
|
||||||
|
|
||||||
|
<li>Copy the <code>.config</code> file to
|
||||||
|
<code>toolchain/uClibc/uClibc.config</code> or
|
||||||
|
<code>toolchain/uClibc/uClibc.config-locale</code>. The former
|
||||||
|
is used if you haven't selected locale support in Buildroot
|
||||||
|
configuration, and the latter is used if you have selected
|
||||||
|
locale support.</li>
|
||||||
|
|
||||||
|
<li>Run the compilation of Buildroot again</li>
|
||||||
|
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>Otherwise, you can simply change
|
||||||
|
<code>toolchain/uClibc/uClibc.config</code> or
|
||||||
|
<code>toolchain/uClibc/uClibc.config-locale</code> without running
|
||||||
|
the configuration assistant.</p>
|
||||||
|
|
||||||
|
<h2><a name="buildroot_innards" id="buildroot_innards"></a>How Buildroot
|
||||||
|
works</h2>
|
||||||
|
|
||||||
|
<p>As said above, Buildroot is basically a set of Makefiles that download,
|
||||||
|
configure and compiles software with the correct options. It also includes
|
||||||
|
some patches for various software, mainly the ones involved in the
|
||||||
|
cross-compilation tool chain (<code>gcc</code>, <code>binutils</code> and
|
||||||
|
uClibc).</p>
|
||||||
|
|
||||||
|
<p>There is basically one Makefile per software, and they are named with
|
||||||
|
the <code>.mk</code> extension. Makefiles are split into three
|
||||||
|
sections:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><b>package</b> (in the <code>package/</code> directory) contains the
|
||||||
|
Makefiles and associated files for all user-space tools that Buildroot
|
||||||
|
can compile and add to the target root filesystem. There is one
|
||||||
|
sub-directory per tool.</li>
|
||||||
|
|
||||||
|
<li><b>toolchain</b> (in the <code>toolchain/</code> directory) contains
|
||||||
|
the Makefiles and associated files for all software related to the
|
||||||
|
cross-compilation toolchain : <code>binutils</code>, <code>ccache</code>,
|
||||||
|
<code>gcc</code>, <code>gdb</code>, <code>kernel-headers</code> and
|
||||||
|
<code>uClibc</code>.</li>
|
||||||
|
|
||||||
|
<li><b>target</b> (in the <code>target</code> directory) contains the
|
||||||
|
Makefiles and associated files for software related to the generation of
|
||||||
|
the target root filesystem image. Four types of filesystems are supported
|
||||||
|
: ext2, jffs2, cramfs and squashfs. For each of them, there's a
|
||||||
|
sub-directory with the required files. There is also a
|
||||||
|
<code>default/</code> directory that contains the target filesystem
|
||||||
|
skeleton.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Each directory contains at least 3 files :</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><code>something.mk</code> is the Makefile that downloads, configures,
|
||||||
|
compiles and installs the software <code>something</code>.</li>
|
||||||
|
|
||||||
|
<li><code>Config.in</code> is a part of the configuration tool
|
||||||
|
description file. It describes the option related to the current
|
||||||
|
software.</li>
|
||||||
|
|
||||||
|
<li><code>Makefile.in</code> is a part of Makefile that sets various
|
||||||
|
variables according to the configuration given through the configuration
|
||||||
|
tool. For most tools it simply involves adding the name of the tool to
|
||||||
|
the <code>TARGETS</code> variable.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>The main Makefile do the job through the following steps (once the
|
||||||
|
configuration is done):</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Create the download directory (<code>dl/</code> by default). This is
|
||||||
|
where the tarballs will be downloaded. It is interesting to know that the
|
||||||
|
tarballs are in this directory because it may be useful to save them
|
||||||
|
somewhere to avoid further downloads.</li>
|
||||||
|
|
||||||
|
<li>Create the build directory (<code>build_ARCH/</code> by default,
|
||||||
|
where <code>ARCH</code> is your architecture). This is where all
|
||||||
|
user-space tools while be compiled.</li>
|
||||||
|
|
||||||
|
<li>Create the toolchain build directory
|
||||||
|
(<code>toolchain_build_ARCH/</code> by default, where <code>ARCH</code>
|
||||||
|
is your architecture). This is where the cross compilation toolchain will
|
||||||
|
be compiled.</li>
|
||||||
|
|
||||||
|
<li>Setup the staging directory (<code>build_ARCH/staging_dir/</code> by
|
||||||
|
default). This is where the cross-compilation toolchain will be
|
||||||
|
installed. If you want to use the same cross-compilation toolchain for
|
||||||
|
other purposes, such as compiling third-party applications, you can add
|
||||||
|
<code>build_ARCH/staging_dir/bin</code> to your PATH, and then use
|
||||||
|
<code>arch-linux-gcc</code> to compile your application. In order to
|
||||||
|
setup this staging directory, it first removes it, and then it creates
|
||||||
|
various subdirectories and symlinks inside it.</li>
|
||||||
|
|
||||||
|
<li>Create the target directory (<code>build_ARCH/root/</code> by
|
||||||
|
default) and the target filesystem skeleton. This directory will contain
|
||||||
|
the final root filesystem. To setup it up, it first deletes it, then it
|
||||||
|
uncompress the <code>target/default/skel.tar.gz</code> file to create the
|
||||||
|
main subdirectories and symlinks, copies the skeleton available in
|
||||||
|
<code>target/default/target_skeleton</code> and then removes useless
|
||||||
|
<code>CVS/</code> directories.</li>
|
||||||
|
|
||||||
|
<li>Make the <code>TARGETS</code> dependency. This is where all the job
|
||||||
|
is done : all <code>Makefile.in</code> files "subscribe" targets into
|
||||||
|
this global variable, so that the needed tools gets compiled.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2><a name="using_toolchain" id="using_toolchain"></a>Using the
|
||||||
|
uClibc toolchain</h2>
|
||||||
|
|
||||||
|
<p>You may want to compile your own programs or other software
|
||||||
|
that are not packaged in Buildroot. In order to do this, you can
|
||||||
|
use the toolchain that was generated by Buildroot.</p>
|
||||||
|
|
||||||
|
<p>The toolchain generated by Buildroot by default is located in
|
||||||
|
<code>build_ARCH/staging_dir/</code>. The simplest way to use it
|
||||||
|
is to add <code>build_ARCH/staging_dir/bin/</code> to your PATH
|
||||||
|
environnement variable, and then to use
|
||||||
|
<code>arch-linux-gcc</code>, <code>arch-linux-objdump</code>,
|
||||||
|
<code>arch-linux-ld</code>, etc.</p>
|
||||||
|
|
||||||
|
<p>For example, you may add the following to your
|
||||||
|
<code>.bashrc</code> (considering you're building for the MIPS
|
||||||
|
architecture and that Buildroot is located in
|
||||||
|
<code>~/buildroot/</code>) :</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
export PATH=$PATH:~/buildroot/build_mips/bin/
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Then you can simply do :</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
mips-linux-gcc -o foo foo.c
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p><b>Important</b> : do not try to move the toolchain to an other
|
||||||
|
directory, it won't work. There are some hard-coded paths in the
|
||||||
|
<i>gcc</i> configuration. If the default toolchain directory
|
||||||
|
doesn't suit your needs, please refer to the <a
|
||||||
|
href="#toolchain_standalone">Using the uClibc toolchain outside of
|
||||||
|
buildroot</a> section.</p>
|
||||||
|
|
||||||
|
<h2><a name="toolchain_standalone" id="toolchain_standalone"></a>Using the
|
||||||
|
uClibc toolchain outside of buildroot</h2>
|
||||||
|
|
||||||
|
<p>By default, the cross-compilation toolchain is generated inside
|
||||||
|
<code>build_ARCH/staging_dir/</code>. But sometimes, it may be useful to
|
||||||
|
install it somewhere else, so that it can be used to compile other programs
|
||||||
|
or by other users. Moving the <code>build_ARCH/staging_dir/</code>
|
||||||
|
directory elsewhere is <b>not possible</b>, because they are some hardcoded
|
||||||
|
paths in the toolchain configuration.</p>
|
||||||
|
|
||||||
|
<p>If you want to use the generated toolchain for other purposes,
|
||||||
|
you can configure Buildroot to generate it elsewhere using the
|
||||||
|
option of the configuration tool : <code>Build options ->
|
||||||
|
Toolchain and header file location</code>, which defaults to
|
||||||
|
<code>$(BUILD_DIR)/staging_dir/</code>.</p>
|
||||||
|
|
||||||
|
<h2><a name="downloaded_packages"
|
||||||
|
id="downloaded_packages"></a>Location of downloaded packages</h2>
|
||||||
|
|
||||||
|
<p>It might be useful to know that the various tarballs that are
|
||||||
|
downloaded by the <i>Makefiles</i> are all stored in the
|
||||||
|
<code>DL_DIR</code> which by default is the <code>dl</code>
|
||||||
|
directory. It's useful for example if you want to keep a complete
|
||||||
|
version of Buildroot which is know to be working with the
|
||||||
|
associated tarballs. This will allow you to regenerate the
|
||||||
|
toolchain and the target filesystem with exactly the same
|
||||||
|
versions.</p>
|
||||||
|
|
||||||
|
<h2><a name="add_software" id="add_software"></a>Extending Buildroot with
|
||||||
|
more software</h2>
|
||||||
|
|
||||||
|
<p>This section will only consider the case in which you want to
|
||||||
|
add user-space software.</p>
|
||||||
|
|
||||||
|
<h3>Package directory</h3>
|
||||||
|
|
||||||
|
<p>First of all, create a directory under the <code>package</code>
|
||||||
|
directory for your software, for example <code>foo</code>.</p>
|
||||||
|
|
||||||
|
<h3><code>Config.in</code> file</h3>
|
||||||
|
|
||||||
|
<p>Then, create a file named <code>Config.in</code>. This file
|
||||||
|
will contain the portion of options description related to our
|
||||||
|
<code>foo</code> software that will be used and displayed in the
|
||||||
|
configuration tool. It should basically contain :</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
config BR2_PACKAGE_FOO
|
||||||
|
bool "foo"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
This is a comment that explains what foo is.
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Of course, you can add other options to configure particular
|
||||||
|
things in your software.</p>
|
||||||
|
|
||||||
|
<h3><code>Makefile.in</code> file</h3>
|
||||||
|
|
||||||
|
<p>Then, write a <code>Makefile.in</code> file. Basically, this is
|
||||||
|
a very short <i>Makefile</i> that adds the name of the software to
|
||||||
|
the list of <code>TARGETS</code> that Buildroot will generate. In
|
||||||
|
fact, the name of the software is the the identifier of the target
|
||||||
|
inside the real <i>Makefile</i> that will do everything (download,
|
||||||
|
compile, install), and that we study below. Back to
|
||||||
|
<code>Makefile.in</code>, here is an example :</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
ifeq ($(strip $(BR2_PACKAGE_FOO)),y)
|
||||||
|
TARGETS+=foo
|
||||||
|
endif
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>As you can see, this short <i>Makefile</i> simply adds the
|
||||||
|
target <code>foo</code> to the list of targets handled by Buildroot
|
||||||
|
if software <i>foo</i> was selected using the configuration tool.</p>
|
||||||
|
|
||||||
|
<h3>The real <i>Makefile</i></h3>
|
||||||
|
|
||||||
|
<p>Finally, here's the hardest part. Create a file named
|
||||||
|
<code>foo.mk</code>. It will contain the <i>Makefile</i> rules that
|
||||||
|
are in charge of downloading, configuring, compiling and installing
|
||||||
|
the software. Below is an example that we will comment
|
||||||
|
afterwards.</p>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
1 #############################################################
|
||||||
|
2 #
|
||||||
|
3 # foo
|
||||||
|
4 #
|
||||||
|
5 #############################################################
|
||||||
|
6 FOO_VERSION:=1.0
|
||||||
|
7 FOO_SOURCE:=less-$(FOO_VERSION).tar.gz
|
||||||
|
8 FOO_SITE:=http://www.foosoftware.org/downloads
|
||||||
|
9 FOO_DIR:=$(BUILD_DIR)/less-$(FOO_VERSION)
|
||||||
|
10 FOO_BINARY:=foo
|
||||||
|
11 FOO_TARGET_BINARY:=usr/bin/foo
|
||||||
|
12
|
||||||
|
13 $(DL_DIR)/$(FOO_SOURCE):
|
||||||
|
14 $(WGET) -P $(DL_DIR) $(FOO_SITE)/$(FOO_SOURCE)
|
||||||
|
15
|
||||||
|
16 $(FOO_DIR)/.source: $(DL_DIR)/$(FOO_SOURCE)
|
||||||
|
17 zcat $(DL_DIR)/$(FOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
18 touch $(FOO_DIR)/.source
|
||||||
|
19
|
||||||
|
20 $(FOO_DIR)/.configured: $(FOO_DIR)/.source
|
||||||
|
21 (cd $(FOO_DIR); \
|
||||||
|
22 $(TARGET_CONFIGURE_OPTS) \
|
||||||
|
23 CFLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
24 ./configure \
|
||||||
|
25 --target=$(GNU_TARGET_NAME) \
|
||||||
|
26 --host=$(GNU_TARGET_NAME) \
|
||||||
|
27 --build=$(GNU_HOST_NAME) \
|
||||||
|
28 --prefix=/usr \
|
||||||
|
29 --sysconfdir=/etc \
|
||||||
|
30 );
|
||||||
|
31 touch $(FOO_DIR)/.configured;
|
||||||
|
32
|
||||||
|
33 $(FOO_DIR)/$(FOO_BINARY): $(FOO_DIR)/.configured
|
||||||
|
34 $(MAKE) CC=$(TARGET_CC) -C $(FOO_DIR)
|
||||||
|
35
|
||||||
|
36 $(TARGET_DIR)/$(FOO_TARGET_BINARY): $(FOO_DIR)/$(FOO_BINARY)
|
||||||
|
37 $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) install
|
||||||
|
38 rm -Rf $(TARGET_DIR)/usr/man
|
||||||
|
39
|
||||||
|
40 foo: uclibc ncurses $(TARGET_DIR)/$(FOO_TARGET_BINARY)
|
||||||
|
41
|
||||||
|
42 foo-source: $(DL_DIR)/$(FOO_SOURCE)
|
||||||
|
43
|
||||||
|
44 foo-clean:
|
||||||
|
45 $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) uninstall
|
||||||
|
46 -$(MAKE) -C $(FOO_DIR) clean
|
||||||
|
47
|
||||||
|
48 foo-dirclean:
|
||||||
|
49 rm -rf $(FOO_DIR)
|
||||||
|
50
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>First of all, this <i>Makefile</i> example works for a single
|
||||||
|
binary software. For other software such as libraries or more
|
||||||
|
complex stuff with multiple binaries, it should be adapted. Look at
|
||||||
|
the other <code>*.mk</code> files in the <code>package</code>
|
||||||
|
directory.</p>
|
||||||
|
|
||||||
|
<p>At lines 6-11, a couple of useful variables are defined :</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
|
||||||
|
<li><code>FOO_VERSION</code> : The version of <i>foo</i> that
|
||||||
|
should be downloaded.</li>
|
||||||
|
|
||||||
|
<li><code>FOO_SOURCE</code> : The name of the tarball of
|
||||||
|
<i>foo</i> on the download website of FTP site. As you can see
|
||||||
|
<code>FOO_VERSION</code> is used.</li>
|
||||||
|
|
||||||
|
<li><code>FOO_SITE</code> : The HTTP or FTP site from which
|
||||||
|
<i>foo</i> archive is downloaded. It must include the complete
|
||||||
|
path to the directory where <code>FOO_SOURCE</code> can be
|
||||||
|
found.</li>
|
||||||
|
|
||||||
|
<li><code>FOO_DIR</code> : The directory into which the software
|
||||||
|
will be configured and compiled. Basically, it's a subdirectory
|
||||||
|
of <code>BUILD_DIR</code> which is created upon decompression of
|
||||||
|
the tarball.</li>
|
||||||
|
|
||||||
|
<li><code>FOO_BINARY</code> : Software binary name. As said
|
||||||
|
previously, this is an example for a single binary software.</li>
|
||||||
|
|
||||||
|
<li><code>FOO_TARGET_BINARY</code> : The full path of the binary
|
||||||
|
inside the target filesystem.</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Lines 13-14 defines a target that downloads the tarball from
|
||||||
|
the remote site to the download directory
|
||||||
|
(<code>DL_DIR</code>).</p>
|
||||||
|
|
||||||
|
<p>Lines 16-18 defines a target and associated rules that
|
||||||
|
uncompress the downloaded tarball. As you can see, this target
|
||||||
|
depends on the tarball file, so that the previous target (line
|
||||||
|
13-14) is called before executing the rules of the current
|
||||||
|
target. Uncompressing is followed by <i>touching</i> a hidden file
|
||||||
|
to mark the software has having been uncompressed. This trick is
|
||||||
|
used everywhere in Buildroot <i>Makefile</i> to split steps
|
||||||
|
(download, uncompress, configure, compile, install) while still
|
||||||
|
having correct dependencies.</p>
|
||||||
|
|
||||||
|
<p>Lines 20-31 defines a target and associated rules that
|
||||||
|
configures the software. It depends on the previous target (the
|
||||||
|
hidden <code>.source</code> file) so that we are sure the software has
|
||||||
|
been uncompressed. In order to configure it, it basically runs the
|
||||||
|
well-known <code>./configure</code>script. As we may be doing
|
||||||
|
cross-compilation, <code>target</code>, <code>host</code> and
|
||||||
|
<code>build</code> arguments are given. The prefix is also set to
|
||||||
|
<code>/usr</code>, not because the software will be installed in
|
||||||
|
<code>/usr</code> on your host system, but in the target
|
||||||
|
filesystem. Finally it creates a <code>.configured</code> file to
|
||||||
|
mark the software as configured.</p>
|
||||||
|
|
||||||
|
<p>Lines 33-34 defines a target and a rule that compiles the
|
||||||
|
software. This target will create the binary file in the
|
||||||
|
compilation directory, and depends on the software being already
|
||||||
|
configured (hence the reference to the <code>.configured</code>
|
||||||
|
file). It basically runs <code>make</code> inside the source
|
||||||
|
directory.</p>
|
||||||
|
|
||||||
|
<p>Lines 36-38 defines a target and associated rules that install
|
||||||
|
the software inside the target filesystem. It depends on the
|
||||||
|
binary file in the source directory, to make sure the software has
|
||||||
|
been compiled. It uses the <code>install</code> target of the
|
||||||
|
software <code>Makefile</code> by passing a <code>prefix</code>
|
||||||
|
argument, so that the <code>Makefile</code> doesn't try to install
|
||||||
|
the software inside host <code>/usr</code> but inside target
|
||||||
|
<code>/usr</code>. After the installation, the
|
||||||
|
<code>/usr/man</code> directory inside the target filesystem is
|
||||||
|
removed to save space.</p>
|
||||||
|
|
||||||
|
<p>Line 40 defines the main target of the software, the one
|
||||||
|
referenced in the <code>Makefile.in</code> file. This targets
|
||||||
|
should first of all depends on the dependecies of the software (in
|
||||||
|
our example, <i>uclibc</i> and <i>ncurses</i>), and then to the
|
||||||
|
final binary. This last dependency will call all previous
|
||||||
|
dependencies in the right order. </p>
|
||||||
|
|
||||||
|
<p>Line 42 defines a simple target that only downloads the code
|
||||||
|
source. This is not used during normal operation of Buildroot, but
|
||||||
|
might be useful.</p>
|
||||||
|
|
||||||
|
<p>Lignes 44-46 define a simple target to clean the software build
|
||||||
|
by calling the <i>Makefiles</i> with the appropriate option.</p>
|
||||||
|
|
||||||
|
<p>Lines 48-49 define a simple target to completely remove the
|
||||||
|
directory in which the software was uncompressed, configured and
|
||||||
|
compiled.</p>
|
||||||
|
|
||||||
|
<h3>Conclusion</h3>
|
||||||
|
|
||||||
|
<p>As you can see, adding a software to buildroot is simply a
|
||||||
|
matter of writing a <i>Makefile</i> using an already existing
|
||||||
|
example and to modify it according to the compilation process of
|
||||||
|
the software.</p>
|
||||||
|
|
||||||
|
<p>If you package software that might be useful for other persons,
|
||||||
|
don't forget to send a patch to Buildroot developers !</p>
|
||||||
|
|
||||||
|
<h2><a name="links" id="links"></a>Ressources</h2>
|
||||||
|
|
||||||
|
<p>To learn more about Buildroot you can visit these
|
||||||
|
websites:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://www.uclibc.org/">http://www.uclibc.org/</a></li>
|
||||||
|
<li><a href="http://www.busybox.net/">http://www.busybox.net/</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
65
docs/stylesheet.css
Normal file
65
docs/stylesheet.css
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
body {
|
||||||
|
margin: 0px 0px 0px 0px;
|
||||||
|
color: white;
|
||||||
|
background-color: #93c6f9;
|
||||||
|
font: 12pt/18pt georgia;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.main {
|
||||||
|
margin: 10px 10px 10px 10px;
|
||||||
|
padding: 10px 10px 10px 10px;
|
||||||
|
color: black;
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.titre {
|
||||||
|
text-align: center;
|
||||||
|
background-color: #336699;
|
||||||
|
color: white;
|
||||||
|
padding: 10px 10px 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
font: 26pt georgia;
|
||||||
|
letter-spacing: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
padding: 5px 5px 5px 5px;
|
||||||
|
background-color: #c2e0ff;
|
||||||
|
color: #336699;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:link, a:visited {
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: none;
|
||||||
|
color: #336699;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover, a:active {
|
||||||
|
text-decoration: underline;
|
||||||
|
color: #9685BA;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font: italic normal 14pt georgia;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
color: #336699;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
border-left: 3px #aaa solid;
|
||||||
|
margin-left: 1em;
|
||||||
|
padding: 0 1em;
|
||||||
|
color: #888;
|
||||||
|
}
|
15
package/Config.in
Normal file
15
package/Config.in
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#
|
||||||
|
|
||||||
|
menu "OpenWrt Package Selection"
|
||||||
|
|
||||||
|
comment "The default set"
|
||||||
|
source "package/busybox/Config.in"
|
||||||
|
source "package/dnsmasq/Config.in"
|
||||||
|
source "package/linux/Config.in"
|
||||||
|
source "package/iptables/Config.in"
|
||||||
|
source "package/bridge/Config.in"
|
||||||
|
|
||||||
|
comment "Suggested Extras"
|
||||||
|
source "package/dropbear_sshd/Config.in"
|
||||||
|
|
||||||
|
endmenu
|
64
package/Makefile.in
Normal file
64
package/Makefile.in
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
MAKE1=make
|
||||||
|
MAKE=make -j$(BR2_JLEVEL)
|
||||||
|
|
||||||
|
# Strip off the annoying quoting
|
||||||
|
ARCH:=$(strip $(subst ",, $(BR2_ARCH)))
|
||||||
|
#"
|
||||||
|
WGET:=$(strip $(subst ",, $(BR2_WGET)))
|
||||||
|
#"
|
||||||
|
|
||||||
|
ifneq ($(BR2_LARGEFILE),y)
|
||||||
|
DISABLE_LARGEFILE= --disable-largefile
|
||||||
|
endif
|
||||||
|
TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
|
||||||
|
|
||||||
|
HOSTCC:=gcc
|
||||||
|
BASE_DIR:=${shell pwd}
|
||||||
|
DL_DIR:=$(BASE_DIR)/dl
|
||||||
|
#PATCH_DIR=$(BASE_DIR)/sources/patches
|
||||||
|
BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX)
|
||||||
|
TARGET_DIR:=$(BUILD_DIR)/root
|
||||||
|
TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)
|
||||||
|
# Strip off the annoying quoting
|
||||||
|
STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR)))
|
||||||
|
#"
|
||||||
|
TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin
|
||||||
|
IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX)
|
||||||
|
REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc
|
||||||
|
GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux
|
||||||
|
KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
|
||||||
|
TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
|
||||||
|
TARGET_CC=$(TARGET_CROSS)gcc
|
||||||
|
STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note
|
||||||
|
|
||||||
|
|
||||||
|
HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
|
||||||
|
-e 's/sparc.*/sparc/' \
|
||||||
|
-e 's/arm.*/arm/g' \
|
||||||
|
-e 's/m68k.*/m68k/' \
|
||||||
|
-e 's/ppc/powerpc/g' \
|
||||||
|
-e 's/v850.*/v850/g' \
|
||||||
|
-e 's/sh[234]/sh/' \
|
||||||
|
-e 's/mips-.*/mips/' \
|
||||||
|
-e 's/mipsel-.*/mipsel/' \
|
||||||
|
-e 's/cris.*/cris/' \
|
||||||
|
-e 's/i[3-9]86/i386/' \
|
||||||
|
)
|
||||||
|
GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu
|
||||||
|
TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
|
||||||
|
AR=$(TARGET_CROSS)ar \
|
||||||
|
AS=$(TARGET_CROSS)as \
|
||||||
|
LD=$(TARGET_CROSS)ld \
|
||||||
|
NM=$(TARGET_CROSS)nm \
|
||||||
|
CC=$(TARGET_CROSS)gcc \
|
||||||
|
GCC=$(TARGET_CROSS)gcc \
|
||||||
|
CXX=$(TARGET_CROSS)g++ \
|
||||||
|
RANLIB=$(TARGET_CROSS)ranlib
|
||||||
|
|
||||||
|
ifeq ($(ENABLE_LOCALE),true)
|
||||||
|
DISABLE_NLS:=
|
||||||
|
else
|
||||||
|
DISABLE_NLS:=--disable-nls
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
8
package/bridge/Config.in
Normal file
8
package/bridge/Config.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
config BR2_PACKAGE_BRIDGE
|
||||||
|
bool "bridge"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Manage ethernet bridging; a way to connect networks together to
|
||||||
|
form a larger network.
|
||||||
|
|
||||||
|
http://bridge.sourceforge.net/
|
3
package/bridge/Makefile.in
Normal file
3
package/bridge/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y)
|
||||||
|
TARGETS+=bridge
|
||||||
|
endif
|
61
package/bridge/bridge.mk
Normal file
61
package/bridge/bridge.mk
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# bridgeutils - User Space Program For Controling Bridging
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
BRIDGE_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/bridge/
|
||||||
|
BRIDGE_SOURCE=bridge-utils-1.0.4.tar.gz
|
||||||
|
BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-1.0.4
|
||||||
|
BRIDGE_TARGET_BINARY:=usr/sbin/brctl
|
||||||
|
|
||||||
|
$(DL_DIR)/$(BRIDGE_SOURCE):
|
||||||
|
$(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE)
|
||||||
|
|
||||||
|
$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE)
|
||||||
|
zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
patch -p1 -d $(BRIDGE_BUILD_DIR) < package/bridge/bridge.patch
|
||||||
|
touch $(BRIDGE_BUILD_DIR)/.unpacked
|
||||||
|
|
||||||
|
$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.unpacked
|
||||||
|
(cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
CFLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
./configure \
|
||||||
|
--target=$(GNU_TARGET_NAME) \
|
||||||
|
--host=$(GNU_TARGET_NAME) \
|
||||||
|
--build=$(GNU_HOST_NAME) \
|
||||||
|
--prefix=/usr \
|
||||||
|
--exec-prefix=/usr \
|
||||||
|
--bindir=/usr/bin \
|
||||||
|
--sbindir=/usr/sbin \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--sysconfdir=/etc \
|
||||||
|
--datadir=/usr/share \
|
||||||
|
--localstatedir=/var \
|
||||||
|
--mandir=/usr/man \
|
||||||
|
--infodir=/usr/info \
|
||||||
|
$(DISABLE_NLS) \
|
||||||
|
--with-linux=$(LINUX_DIR) \
|
||||||
|
);
|
||||||
|
touch $(BRIDGE_BUILD_DIR)/.configured
|
||||||
|
|
||||||
|
$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured
|
||||||
|
$(MAKE) -C $(BRIDGE_BUILD_DIR)
|
||||||
|
|
||||||
|
$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl
|
||||||
|
cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
|
||||||
|
$(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
|
||||||
|
#cp -af $(BRIDGE_BUILD_DIR)/brctl/brctld $(TARGET_DIR)/usr/sbin/
|
||||||
|
#$(STRIP) $(TARGET_DIR)/usr/sbin/brctld
|
||||||
|
|
||||||
|
bridge: linux $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
|
||||||
|
|
||||||
|
bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE)
|
||||||
|
|
||||||
|
bridge-clean:
|
||||||
|
#$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall
|
||||||
|
-$(MAKE) -C $(BRIDGE_BUILD_DIR) clean
|
||||||
|
|
||||||
|
bridge-dirclean:
|
||||||
|
rm -rf $(BRIDGE_BUILD_DIR)
|
11
package/bridge/bridge.patch
Normal file
11
package/bridge/bridge.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
--- bridge-utils-0.9.6/libbridge/Makefile.in.dist 2004-03-01 20:55:52.000000000 -0600
|
||||||
|
+++ bridge-utils-0.9.6/libbridge/Makefile.in 2004-03-01 20:56:23.000000000 -0600
|
||||||
|
@@ -5,7 +5,7 @@
|
||||||
|
RANLIB=@RANLIB@
|
||||||
|
|
||||||
|
CC=@CC@
|
||||||
|
-CFLAGS = -Wall -g $(KERNEL_HEADERS)
|
||||||
|
+CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS)
|
||||||
|
|
||||||
|
prefix=@prefix@
|
||||||
|
exec_prefix=@exec_prefix@
|
19
package/busybox/Config.in
Normal file
19
package/busybox/Config.in
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
config BR2_PACKAGE_BUSYBOX
|
||||||
|
bool "busybox"
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
The Swiss Army Knife of embedded Linux. It slices, it dices, it
|
||||||
|
makes Julian Fries.
|
||||||
|
|
||||||
|
http://busybox.net/
|
||||||
|
|
||||||
|
Most people will answer Y.
|
||||||
|
|
||||||
|
config BR2_PACKAGE_BUSYBOX_SNAPSHOT
|
||||||
|
bool "Use the daily snapshot of busybox?"
|
||||||
|
depends BR2_PACKAGE_BUSYBOX
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Use the latest busybox CVS snapshot instead of release.
|
||||||
|
|
||||||
|
For fun, you should say Y.
|
3
package/busybox/Makefile.in
Normal file
3
package/busybox/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y)
|
||||||
|
TARGETS+=busybox
|
||||||
|
endif
|
464
package/busybox/busybox.config
Normal file
464
package/busybox/busybox.config
Normal file
@ -0,0 +1,464 @@
|
|||||||
|
#
|
||||||
|
# Automatically generated make config: don't edit
|
||||||
|
#
|
||||||
|
HAVE_DOT_CONFIG=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# General Configuration
|
||||||
|
#
|
||||||
|
# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set
|
||||||
|
CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y
|
||||||
|
# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
|
||||||
|
CONFIG_FEATURE_VERBOSE_USAGE=y
|
||||||
|
# CONFIG_FEATURE_INSTALLER is not set
|
||||||
|
# CONFIG_LOCALE_SUPPORT is not set
|
||||||
|
# CONFIG_FEATURE_DEVFS is not set
|
||||||
|
CONFIG_FEATURE_DEVPTS=y
|
||||||
|
# CONFIG_FEATURE_CLEAN_UP is not set
|
||||||
|
CONFIG_FEATURE_SUID=y
|
||||||
|
# CONFIG_FEATURE_SUID_CONFIG is not set
|
||||||
|
# CONFIG_SELINUX is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Build Options
|
||||||
|
#
|
||||||
|
# CONFIG_STATIC is not set
|
||||||
|
CONFIG_LFS=y
|
||||||
|
# USING_CROSS_COMPILER is not set
|
||||||
|
EXTRA_CFLAGS_OPTIONS=""
|
||||||
|
|
||||||
|
#
|
||||||
|
# Installation Options
|
||||||
|
#
|
||||||
|
# CONFIG_INSTALL_NO_USR is not set
|
||||||
|
PREFIX="./_install"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Archival Utilities
|
||||||
|
#
|
||||||
|
# CONFIG_AR is not set
|
||||||
|
CONFIG_BUNZIP2=y
|
||||||
|
# CONFIG_CPIO is not set
|
||||||
|
# CONFIG_DPKG is not set
|
||||||
|
# CONFIG_DPKG_DEB is not set
|
||||||
|
CONFIG_GUNZIP=y
|
||||||
|
# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set
|
||||||
|
CONFIG_GZIP=y
|
||||||
|
# CONFIG_RPM2CPIO is not set
|
||||||
|
# CONFIG_RPM is not set
|
||||||
|
CONFIG_TAR=y
|
||||||
|
CONFIG_FEATURE_TAR_CREATE=y
|
||||||
|
CONFIG_FEATURE_TAR_BZIP2=y
|
||||||
|
# CONFIG_FEATURE_TAR_FROM is not set
|
||||||
|
CONFIG_FEATURE_TAR_GZIP=y
|
||||||
|
# CONFIG_FEATURE_TAR_COMPRESS is not set
|
||||||
|
# CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY is not set
|
||||||
|
CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y
|
||||||
|
# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set
|
||||||
|
# CONFIG_UNCOMPRESS is not set
|
||||||
|
CONFIG_UNZIP=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for cpio and tar
|
||||||
|
#
|
||||||
|
# CONFIG_FEATURE_UNARCHIVE_TAPE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Coreutils
|
||||||
|
#
|
||||||
|
CONFIG_BASENAME=y
|
||||||
|
# CONFIG_CAL is not set
|
||||||
|
CONFIG_CAT=y
|
||||||
|
CONFIG_CHGRP=y
|
||||||
|
CONFIG_CHMOD=y
|
||||||
|
CONFIG_CHOWN=y
|
||||||
|
CONFIG_CHROOT=y
|
||||||
|
CONFIG_CMP=y
|
||||||
|
CONFIG_CP=y
|
||||||
|
CONFIG_CUT=y
|
||||||
|
CONFIG_DATE=y
|
||||||
|
CONFIG_FEATURE_DATE_ISOFMT=y
|
||||||
|
CONFIG_DD=y
|
||||||
|
CONFIG_DF=y
|
||||||
|
CONFIG_DIRNAME=y
|
||||||
|
CONFIG_DOS2UNIX=y
|
||||||
|
CONFIG_UNIX2DOS=y
|
||||||
|
CONFIG_DU=y
|
||||||
|
CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K=y
|
||||||
|
CONFIG_ECHO=y
|
||||||
|
CONFIG_FEATURE_FANCY_ECHO=y
|
||||||
|
CONFIG_ENV=y
|
||||||
|
CONFIG_EXPR=y
|
||||||
|
CONFIG_FALSE=y
|
||||||
|
# CONFIG_FOLD is not set
|
||||||
|
CONFIG_HEAD=y
|
||||||
|
# CONFIG_FEATURE_FANCY_HEAD is not set
|
||||||
|
CONFIG_HOSTID=y
|
||||||
|
CONFIG_ID=y
|
||||||
|
CONFIG_INSTALL=y
|
||||||
|
# CONFIG_LENGTH is not set
|
||||||
|
CONFIG_LN=y
|
||||||
|
CONFIG_LOGNAME=y
|
||||||
|
CONFIG_LS=y
|
||||||
|
CONFIG_FEATURE_LS_FILETYPES=y
|
||||||
|
CONFIG_FEATURE_LS_FOLLOWLINKS=y
|
||||||
|
CONFIG_FEATURE_LS_RECURSIVE=y
|
||||||
|
CONFIG_FEATURE_LS_SORTFILES=y
|
||||||
|
CONFIG_FEATURE_LS_TIMESTAMPS=y
|
||||||
|
CONFIG_FEATURE_LS_USERNAME=y
|
||||||
|
CONFIG_FEATURE_LS_COLOR=y
|
||||||
|
CONFIG_MD5SUM=y
|
||||||
|
CONFIG_MKDIR=y
|
||||||
|
# CONFIG_MKFIFO is not set
|
||||||
|
CONFIG_MKNOD=y
|
||||||
|
CONFIG_MV=y
|
||||||
|
# CONFIG_OD is not set
|
||||||
|
# CONFIG_PRINTF is not set
|
||||||
|
CONFIG_PWD=y
|
||||||
|
# CONFIG_REALPATH is not set
|
||||||
|
CONFIG_RM=y
|
||||||
|
CONFIG_RMDIR=y
|
||||||
|
# CONFIG_SEQ is not set
|
||||||
|
CONFIG_SHA1SUM=y
|
||||||
|
CONFIG_SLEEP=y
|
||||||
|
# CONFIG_FEATURE_FANCY_SLEEP is not set
|
||||||
|
CONFIG_SORT=y
|
||||||
|
CONFIG_STTY=y
|
||||||
|
CONFIG_SYNC=y
|
||||||
|
CONFIG_TAIL=y
|
||||||
|
CONFIG_FEATURE_FANCY_TAIL=y
|
||||||
|
CONFIG_TEE=y
|
||||||
|
CONFIG_FEATURE_TEE_USE_BLOCK_IO=y
|
||||||
|
CONFIG_TEST=y
|
||||||
|
CONFIG_FEATURE_TEST_64=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# test (forced enabled for use with shell)
|
||||||
|
#
|
||||||
|
CONFIG_TOUCH=y
|
||||||
|
# CONFIG_TR is not set
|
||||||
|
CONFIG_TRUE=y
|
||||||
|
CONFIG_TTY=y
|
||||||
|
CONFIG_UNAME=y
|
||||||
|
CONFIG_UNIQ=y
|
||||||
|
CONFIG_USLEEP=y
|
||||||
|
CONFIG_UUDECODE=y
|
||||||
|
CONFIG_UUENCODE=y
|
||||||
|
# CONFIG_WATCH is not set
|
||||||
|
CONFIG_WC=y
|
||||||
|
# CONFIG_WHO is not set
|
||||||
|
CONFIG_WHOAMI=y
|
||||||
|
CONFIG_YES=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for cp and mv
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_PRESERVE_HARDLINKS=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for ls and more
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_AUTOWIDTH=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for df, du, ls
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_HUMAN_READABLE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for md5sum, sha1sum
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Console Utilities
|
||||||
|
#
|
||||||
|
CONFIG_CHVT=y
|
||||||
|
CONFIG_CLEAR=y
|
||||||
|
CONFIG_DEALLOCVT=y
|
||||||
|
# CONFIG_DUMPKMAP is not set
|
||||||
|
# CONFIG_LOADFONT is not set
|
||||||
|
# CONFIG_LOADKMAP is not set
|
||||||
|
CONFIG_OPENVT=y
|
||||||
|
CONFIG_RESET=y
|
||||||
|
# CONFIG_SETKEYCODES is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Debian Utilities
|
||||||
|
#
|
||||||
|
CONFIG_MKTEMP=y
|
||||||
|
# CONFIG_PIPE_PROGRESS is not set
|
||||||
|
CONFIG_READLINK=y
|
||||||
|
CONFIG_FEATURE_READLINK_FOLLOW=y
|
||||||
|
CONFIG_RUN_PARTS=y
|
||||||
|
CONFIG_START_STOP_DAEMON=y
|
||||||
|
CONFIG_WHICH=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Editors
|
||||||
|
#
|
||||||
|
# CONFIG_AWK is not set
|
||||||
|
# CONFIG_PATCH is not set
|
||||||
|
CONFIG_SED=y
|
||||||
|
CONFIG_VI=y
|
||||||
|
CONFIG_FEATURE_VI_COLON=y
|
||||||
|
CONFIG_FEATURE_VI_YANKMARK=y
|
||||||
|
CONFIG_FEATURE_VI_SEARCH=y
|
||||||
|
CONFIG_FEATURE_VI_USE_SIGNALS=y
|
||||||
|
CONFIG_FEATURE_VI_DOT_CMD=y
|
||||||
|
CONFIG_FEATURE_VI_READONLY=y
|
||||||
|
CONFIG_FEATURE_VI_SETOPTS=y
|
||||||
|
CONFIG_FEATURE_VI_SET=y
|
||||||
|
CONFIG_FEATURE_VI_WIN_RESIZE=y
|
||||||
|
CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Finding Utilities
|
||||||
|
#
|
||||||
|
CONFIG_FIND=y
|
||||||
|
CONFIG_FEATURE_FIND_MTIME=y
|
||||||
|
CONFIG_FEATURE_FIND_PERM=y
|
||||||
|
CONFIG_FEATURE_FIND_TYPE=y
|
||||||
|
CONFIG_FEATURE_FIND_XDEV=y
|
||||||
|
# CONFIG_FEATURE_FIND_NEWER is not set
|
||||||
|
# CONFIG_FEATURE_FIND_INUM is not set
|
||||||
|
CONFIG_GREP=y
|
||||||
|
CONFIG_FEATURE_GREP_EGREP_ALIAS=y
|
||||||
|
CONFIG_FEATURE_GREP_FGREP_ALIAS=y
|
||||||
|
CONFIG_FEATURE_GREP_CONTEXT=y
|
||||||
|
CONFIG_XARGS=y
|
||||||
|
# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
|
||||||
|
CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y
|
||||||
|
CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y
|
||||||
|
CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Init Utilities
|
||||||
|
#
|
||||||
|
CONFIG_INIT=y
|
||||||
|
CONFIG_FEATURE_USE_INITTAB=y
|
||||||
|
CONFIG_FEATURE_INITRD=y
|
||||||
|
# CONFIG_FEATURE_INIT_COREDUMPS is not set
|
||||||
|
CONFIG_FEATURE_EXTRA_QUIET=y
|
||||||
|
CONFIG_HALT=y
|
||||||
|
CONFIG_POWEROFF=y
|
||||||
|
CONFIG_REBOOT=y
|
||||||
|
# CONFIG_MESG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Login/Password Management Utilities
|
||||||
|
#
|
||||||
|
# CONFIG_USE_BB_PWD_GRP is not set
|
||||||
|
CONFIG_ADDGROUP=y
|
||||||
|
CONFIG_DELGROUP=y
|
||||||
|
CONFIG_ADDUSER=y
|
||||||
|
CONFIG_DELUSER=y
|
||||||
|
CONFIG_GETTY=y
|
||||||
|
# CONFIG_FEATURE_U_W_TMP is not set
|
||||||
|
CONFIG_LOGIN=y
|
||||||
|
CONFIG_FEATURE_SECURETTY=y
|
||||||
|
CONFIG_PASSWD=y
|
||||||
|
CONFIG_SU=y
|
||||||
|
CONFIG_SULOGIN=y
|
||||||
|
CONFIG_VLOCK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for adduser, deluser, login, su
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_SHADOWPASSWDS=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Miscellaneous Utilities
|
||||||
|
#
|
||||||
|
# CONFIG_ADJTIMEX is not set
|
||||||
|
# CONFIG_CROND is not set
|
||||||
|
# CONFIG_CRONTAB is not set
|
||||||
|
CONFIG_DC=y
|
||||||
|
# CONFIG_DEVFSD is not set
|
||||||
|
# CONFIG_LAST is not set
|
||||||
|
# CONFIG_HDPARM is not set
|
||||||
|
# CONFIG_MAKEDEVS is not set
|
||||||
|
CONFIG_MT=y
|
||||||
|
# CONFIG_RX is not set
|
||||||
|
CONFIG_STRINGS=y
|
||||||
|
CONFIG_TIME=y
|
||||||
|
# CONFIG_WATCHDOG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Linux Module Utilities
|
||||||
|
#
|
||||||
|
CONFIG_INSMOD=y
|
||||||
|
CONFIG_FEATURE_2_4_MODULES=y
|
||||||
|
# CONFIG_FEATURE_2_6_MODULES is not set
|
||||||
|
# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
|
||||||
|
# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
|
||||||
|
# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
|
||||||
|
# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
|
||||||
|
CONFIG_LSMOD=y
|
||||||
|
CONFIG_FEATURE_QUERY_MODULE_INTERFACE=y
|
||||||
|
CONFIG_MODPROBE=y
|
||||||
|
CONFIG_RMMOD=y
|
||||||
|
CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking Utilities
|
||||||
|
#
|
||||||
|
# CONFIG_FEATURE_IPV6 is not set
|
||||||
|
# CONFIG_ARPING is not set
|
||||||
|
# CONFIG_FTPGET is not set
|
||||||
|
# CONFIG_FTPPUT is not set
|
||||||
|
CONFIG_HOSTNAME=y
|
||||||
|
# CONFIG_HTTPD is not set
|
||||||
|
CONFIG_IFCONFIG=y
|
||||||
|
CONFIG_FEATURE_IFCONFIG_STATUS=y
|
||||||
|
# CONFIG_FEATURE_IFCONFIG_SLIP is not set
|
||||||
|
# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
|
||||||
|
# CONFIG_FEATURE_IFCONFIG_HW is not set
|
||||||
|
# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
|
||||||
|
CONFIG_IFUPDOWN=y
|
||||||
|
# CONFIG_FEATURE_IFUPDOWN_IP is not set
|
||||||
|
CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y
|
||||||
|
CONFIG_FEATURE_IFUPDOWN_IPV4=y
|
||||||
|
# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
|
||||||
|
# CONFIG_FEATURE_IFUPDOWN_IPX is not set
|
||||||
|
# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set
|
||||||
|
# CONFIG_INETD is not set
|
||||||
|
# CONFIG_IP is not set
|
||||||
|
# CONFIG_IPCALC is not set
|
||||||
|
# CONFIG_IPADDR is not set
|
||||||
|
# CONFIG_IPLINK is not set
|
||||||
|
# CONFIG_IPROUTE is not set
|
||||||
|
# CONFIG_IPTUNNEL is not set
|
||||||
|
# CONFIG_NAMEIF is not set
|
||||||
|
# CONFIG_NC is not set
|
||||||
|
CONFIG_NETSTAT=y
|
||||||
|
CONFIG_NSLOOKUP=y
|
||||||
|
CONFIG_PING=y
|
||||||
|
CONFIG_FEATURE_FANCY_PING=y
|
||||||
|
CONFIG_ROUTE=y
|
||||||
|
CONFIG_TELNET=y
|
||||||
|
CONFIG_FEATURE_TELNET_TTYPE=y
|
||||||
|
# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set
|
||||||
|
# CONFIG_TELNETD is not set
|
||||||
|
# CONFIG_TFTP is not set
|
||||||
|
# CONFIG_TRACEROUTE is not set
|
||||||
|
# CONFIG_VCONFIG is not set
|
||||||
|
CONFIG_WGET=y
|
||||||
|
CONFIG_FEATURE_WGET_STATUSBAR=y
|
||||||
|
CONFIG_FEATURE_WGET_AUTHENTICATION=y
|
||||||
|
# CONFIG_FEATURE_WGET_IP6_LITERAL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# udhcp Server/Client
|
||||||
|
#
|
||||||
|
CONFIG_UDHCPD=y
|
||||||
|
CONFIG_UDHCPC=y
|
||||||
|
CONFIG_DUMPLEASES=y
|
||||||
|
CONFIG_FEATURE_UDHCP_SYSLOG=y
|
||||||
|
# CONFIG_FEATURE_UDHCP_DEBUG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Process Utilities
|
||||||
|
#
|
||||||
|
CONFIG_FREE=y
|
||||||
|
CONFIG_KILL=y
|
||||||
|
CONFIG_KILLALL=y
|
||||||
|
CONFIG_PIDOF=y
|
||||||
|
CONFIG_PS=y
|
||||||
|
# CONFIG_RENICE is not set
|
||||||
|
# CONFIG_TOP is not set
|
||||||
|
CONFIG_UPTIME=y
|
||||||
|
# CONFIG_SYSCTL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Another Bourne-like Shell
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_SH_IS_ASH=y
|
||||||
|
# CONFIG_FEATURE_SH_IS_HUSH is not set
|
||||||
|
# CONFIG_FEATURE_SH_IS_LASH is not set
|
||||||
|
# CONFIG_FEATURE_SH_IS_MSH is not set
|
||||||
|
# CONFIG_FEATURE_SH_IS_NONE is not set
|
||||||
|
CONFIG_ASH=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Ash Shell Options
|
||||||
|
#
|
||||||
|
CONFIG_ASH_JOB_CONTROL=y
|
||||||
|
CONFIG_ASH_ALIAS=y
|
||||||
|
CONFIG_ASH_MATH_SUPPORT=y
|
||||||
|
CONFIG_ASH_MATH_SUPPORT_64=y
|
||||||
|
# CONFIG_ASH_GETOPTS is not set
|
||||||
|
# CONFIG_ASH_CMDCMD is not set
|
||||||
|
# CONFIG_ASH_MAIL is not set
|
||||||
|
CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
|
||||||
|
# CONFIG_ASH_RANDOM_SUPPORT is not set
|
||||||
|
# CONFIG_HUSH is not set
|
||||||
|
# CONFIG_LASH is not set
|
||||||
|
# CONFIG_MSH is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bourne Shell Options
|
||||||
|
#
|
||||||
|
# CONFIG_FEATURE_SH_EXTRA_QUIET is not set
|
||||||
|
# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set
|
||||||
|
CONFIG_FEATURE_COMMAND_EDITING=y
|
||||||
|
CONFIG_FEATURE_COMMAND_HISTORY=15
|
||||||
|
CONFIG_FEATURE_COMMAND_SAVEHISTORY=y
|
||||||
|
CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y
|
||||||
|
# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set
|
||||||
|
CONFIG_FEATURE_SH_FANCY_PROMPT=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# System Logging Utilities
|
||||||
|
#
|
||||||
|
CONFIG_SYSLOGD=y
|
||||||
|
CONFIG_FEATURE_ROTATE_LOGFILE=y
|
||||||
|
# CONFIG_FEATURE_REMOTE_LOG is not set
|
||||||
|
# CONFIG_FEATURE_IPC_SYSLOG is not set
|
||||||
|
CONFIG_KLOGD=y
|
||||||
|
CONFIG_LOGGER=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Linux System Utilities
|
||||||
|
#
|
||||||
|
CONFIG_DMESG=y
|
||||||
|
# CONFIG_FBSET is not set
|
||||||
|
# CONFIG_FDFLUSH is not set
|
||||||
|
CONFIG_FDFORMAT=y
|
||||||
|
CONFIG_FDISK=y
|
||||||
|
FDISK_SUPPORT_LARGE_DISKS=y
|
||||||
|
CONFIG_FEATURE_FDISK_WRITABLE=y
|
||||||
|
# CONFIG_FEATURE_AIX_LABEL is not set
|
||||||
|
# CONFIG_FEATURE_SGI_LABEL is not set
|
||||||
|
# CONFIG_FEATURE_SUN_LABEL is not set
|
||||||
|
# CONFIG_FEATURE_OSF_LABEL is not set
|
||||||
|
# CONFIG_FEATURE_FDISK_ADVANCED is not set
|
||||||
|
# CONFIG_FREERAMDISK is not set
|
||||||
|
# CONFIG_FSCK_MINIX is not set
|
||||||
|
# CONFIG_MKFS_MINIX is not set
|
||||||
|
CONFIG_GETOPT=y
|
||||||
|
CONFIG_HEXDUMP=y
|
||||||
|
CONFIG_HWCLOCK=y
|
||||||
|
CONFIG_FEATURE_HWCLOCK_LONGOPTIONS=y
|
||||||
|
# CONFIG_LOSETUP is not set
|
||||||
|
# CONFIG_MKSWAP is not set
|
||||||
|
CONFIG_MORE=y
|
||||||
|
CONFIG_FEATURE_USE_TERMIOS=y
|
||||||
|
CONFIG_PIVOT_ROOT=y
|
||||||
|
CONFIG_RDATE=y
|
||||||
|
CONFIG_SWAPONOFF=y
|
||||||
|
CONFIG_MOUNT=y
|
||||||
|
# CONFIG_NFSMOUNT is not set
|
||||||
|
CONFIG_UMOUNT=y
|
||||||
|
# CONFIG_FEATURE_MOUNT_FORCE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Common options for mount/umount
|
||||||
|
#
|
||||||
|
CONFIG_FEATURE_MOUNT_LOOP=y
|
||||||
|
# CONFIG_FEATURE_MTAB_SUPPORT is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Debugging Options
|
||||||
|
#
|
||||||
|
# CONFIG_DEBUG is not set
|
62
package/busybox/busybox.mk
Normal file
62
package/busybox/busybox.mk
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# busybox
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
ifeq ($(strip $(BR2_PACKAGE_BUSYBOX_SNAPSHOT)),y)
|
||||||
|
# Be aware that this changes daily....
|
||||||
|
BUSYBOX_DIR:=$(BUILD_DIR)/busybox
|
||||||
|
BUSYBOX_SOURCE:=busybox-snapshot.tar.bz2
|
||||||
|
BUSYBOX_SITE:=http://www.busybox.net/downloads/snapshots
|
||||||
|
else
|
||||||
|
BUSYBOX_VER:=1.00
|
||||||
|
BUSYBOX_DIR:=$(BUILD_DIR)/busybox-$(BUSYBOX_VER)
|
||||||
|
BUSYBOX_SOURCE:=busybox-$(BUSYBOX_VER).tar.bz2
|
||||||
|
BUSYBOX_SITE:=http://www.busybox.net/downloads
|
||||||
|
endif
|
||||||
|
BUSYBOX_UNZIP=bzcat
|
||||||
|
BUSYBOX_CONFIG:=package/busybox/busybox.config
|
||||||
|
|
||||||
|
$(DL_DIR)/$(BUSYBOX_SOURCE):
|
||||||
|
$(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE)
|
||||||
|
|
||||||
|
busybox-source: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG)
|
||||||
|
|
||||||
|
$(BUSYBOX_DIR)/.unpacked: $(DL_DIR)/$(BUSYBOX_SOURCE)
|
||||||
|
$(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
# Allow busybox patches.
|
||||||
|
toolchain/patch-kernel.sh $(BUSYBOX_DIR) package/busybox busybox-\*.patch
|
||||||
|
touch $(BUSYBOX_DIR)/.unpacked
|
||||||
|
|
||||||
|
$(BUSYBOX_DIR)/.configured: $(BUSYBOX_DIR)/.unpacked $(BUSYBOX_CONFIG)
|
||||||
|
cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config
|
||||||
|
$(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\
|
||||||
|
PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak
|
||||||
|
ifeq ($(BR2_LARGEFILE),y)
|
||||||
|
$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config
|
||||||
|
else
|
||||||
|
$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config
|
||||||
|
$(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config
|
||||||
|
endif
|
||||||
|
$(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig
|
||||||
|
touch $(BUSYBOX_DIR)/.configured
|
||||||
|
|
||||||
|
$(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured
|
||||||
|
$(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \
|
||||||
|
EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR)
|
||||||
|
|
||||||
|
$(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox
|
||||||
|
$(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \
|
||||||
|
EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install
|
||||||
|
# Just in case
|
||||||
|
-chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script
|
||||||
|
|
||||||
|
busybox: uclibc $(TARGET_DIR)/bin/busybox
|
||||||
|
|
||||||
|
busybox-clean:
|
||||||
|
rm -f $(TARGET_DIR)/bin/busybox
|
||||||
|
-$(MAKE) -C $(BUSYBOX_DIR) clean
|
||||||
|
|
||||||
|
busybox-dirclean:
|
||||||
|
rm -rf $(BUSYBOX_DIR)
|
8
package/config/.cvsignore
Normal file
8
package/config/.cvsignore
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
conf
|
||||||
|
mconf
|
||||||
|
lkc_defs.h
|
||||||
|
lex.zconf.c
|
||||||
|
zconf.tab.h
|
||||||
|
zconf.tab.c
|
||||||
|
lex.backup
|
||||||
|
zconf.output
|
8
package/config/Config.in
Normal file
8
package/config/Config.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#
|
||||||
|
|
||||||
|
config BR2_PACKAGE_CONFIG
|
||||||
|
bool"config"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Add help text here.
|
||||||
|
|
255
package/config/Kconfig-language.txt
Normal file
255
package/config/Kconfig-language.txt
Normal file
@ -0,0 +1,255 @@
|
|||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
The configuration database is 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 visible 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 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"/"integer"
|
||||||
|
Every config option must have a type. There are only two basic types:
|
||||||
|
tristate and string, the other types base 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" <symbol> ["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
|
||||||
|
overriden 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".
|
||||||
|
|
||||||
|
- dependencies: "depends on"/"requires" <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 "if" expression), so these two examples are equivalent:
|
||||||
|
|
||||||
|
bool "foo" if BAR
|
||||||
|
default y if BAR
|
||||||
|
and
|
||||||
|
depends on BAR
|
||||||
|
bool "foo"
|
||||||
|
default y
|
||||||
|
|
||||||
|
- help text: "help"
|
||||||
|
This defines a help text. The end of the help text is determined by
|
||||||
|
the level indentation, this means it ends at the first line which has
|
||||||
|
a smaller indentation than the first line of the help text.
|
||||||
|
|
||||||
|
|
||||||
|
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 type of symbols: constant and nonconstant symbols.
|
||||||
|
Nonconstant symbols are the most common ones and are defined with the
|
||||||
|
'config' statement. Nonconstant 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 explicitely:
|
||||||
|
|
||||||
|
menu "Network device support"
|
||||||
|
depends 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 the previous (parent) symbol must
|
||||||
|
be part of the dependency list and then one of these two condititions
|
||||||
|
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 MODULES
|
||||||
|
|
||||||
|
comment "module support disabled"
|
||||||
|
depends !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 it's 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
|
||||||
|
- choice/endchoice
|
||||||
|
- comment
|
||||||
|
- menu/endmenu
|
||||||
|
- if/endif
|
||||||
|
- source
|
||||||
|
The first four 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.
|
||||||
|
|
||||||
|
choices:
|
||||||
|
|
||||||
|
"choice"
|
||||||
|
<choice options>
|
||||||
|
<choice block>
|
||||||
|
"endchoice"
|
||||||
|
|
||||||
|
This defines a choice group and accepts any of 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.
|
112
package/config/Makefile
Normal file
112
package/config/Makefile
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
# Makefile for buildroot2
|
||||||
|
#
|
||||||
|
# Copyright (C) 2002-2004 Erik Andersen <andersen@codepoet.org>
|
||||||
|
|
||||||
|
|
||||||
|
# Select the compiler needed to build binaries for your development system
|
||||||
|
HOSTCC = gcc
|
||||||
|
HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
|
||||||
|
# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
|
||||||
|
LC_ALL:= C
|
||||||
|
|
||||||
|
|
||||||
|
all: ncurses conf mconf
|
||||||
|
|
||||||
|
LIBS = -lncurses
|
||||||
|
ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
|
||||||
|
HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
||||||
|
else
|
||||||
|
ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
|
||||||
|
HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
|
||||||
|
else
|
||||||
|
ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
|
||||||
|
HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
||||||
|
else
|
||||||
|
ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
|
||||||
|
HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
|
||||||
|
else
|
||||||
|
ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
|
||||||
|
HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
|
||||||
|
else
|
||||||
|
HOSTNCURSES += -DCURSES_LOC="<curses.h>"
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
CONF_SRC =conf.c
|
||||||
|
MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c
|
||||||
|
SHARED_SRC=zconf.tab.c
|
||||||
|
SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h
|
||||||
|
CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
|
||||||
|
MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
|
||||||
|
SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC))
|
||||||
|
|
||||||
|
conf: $(CONF_OBJS) $(SHARED_OBJS)
|
||||||
|
$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
|
||||||
|
|
||||||
|
mconf: $(MCONF_OBJS) $(SHARED_OBJS)
|
||||||
|
$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
|
||||||
|
|
||||||
|
$(CONF_OBJS): %.o : %.c $(SHARED_DEPS)
|
||||||
|
$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
|
||||||
|
|
||||||
|
$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS)
|
||||||
|
$(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@
|
||||||
|
|
||||||
|
lkc_defs.h: lkc_proto.h
|
||||||
|
@sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
|
||||||
|
|
||||||
|
###
|
||||||
|
# The following requires flex/bison
|
||||||
|
# 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
|
||||||
|
|
||||||
|
%.tab.c %.tab.h: %.y
|
||||||
|
bison -t -d -v -b $* -p $(notdir $*) $<
|
||||||
|
|
||||||
|
lex.%.c: %.l
|
||||||
|
flex -P$(notdir $*) -o$@ $<
|
||||||
|
else
|
||||||
|
|
||||||
|
lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
|
||||||
|
$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
|
||||||
|
|
||||||
|
lex.zconf.c: lex.zconf.c_shipped
|
||||||
|
cp lex.zconf.c_shipped lex.zconf.c
|
||||||
|
|
||||||
|
zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS)
|
||||||
|
$(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@
|
||||||
|
|
||||||
|
zconf.tab.c: zconf.tab.c_shipped
|
||||||
|
cp zconf.tab.c_shipped zconf.tab.c
|
||||||
|
|
||||||
|
zconf.tab.h: zconf.tab.h_shipped
|
||||||
|
cp zconf.tab.h_shipped zconf.tab.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: ncurses
|
||||||
|
|
||||||
|
ncurses:
|
||||||
|
@echo "main() {}" > lxtemp.c
|
||||||
|
@if $(HOSTCC) lxtemp.c $(LIBS) ; then \
|
||||||
|
rm -f lxtemp.c a.out; \
|
||||||
|
else \
|
||||||
|
rm -f lxtemp.c; \
|
||||||
|
echo -e "\007" ;\
|
||||||
|
echo ">> Unable to find the Ncurses libraries." ;\
|
||||||
|
echo ">>" ;\
|
||||||
|
echo ">> You must have Ncurses installed in order" ;\
|
||||||
|
echo ">> to use 'make menuconfig'" ;\
|
||||||
|
echo ;\
|
||||||
|
exit 1 ;\
|
||||||
|
fi
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
|
||||||
|
conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
|
||||||
|
|
3
package/config/Makefile.in
Normal file
3
package/config/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_CONFIG)),y)
|
||||||
|
TARGETS+=config
|
||||||
|
endif
|
372
package/config/checklist.c
Normal file
372
package/config/checklist.c
Normal file
@ -0,0 +1,372 @@
|
|||||||
|
/*
|
||||||
|
* checklist.c -- implements the checklist box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
|
||||||
|
* Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
static int list_width, check_x, item_x, checkflag;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print list item
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_item (WINDOW * win, const char *item, int status,
|
||||||
|
int choice, int selected)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Clear 'residue' of last item */
|
||||||
|
wattrset (win, menubox_attr);
|
||||||
|
wmove (win, choice, 0);
|
||||||
|
for (i = 0; i < list_width; i++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
|
||||||
|
wmove (win, choice, check_x);
|
||||||
|
wattrset (win, selected ? check_selected_attr : check_attr);
|
||||||
|
if (checkflag == FLAG_CHECK)
|
||||||
|
wprintw (win, "[%c]", status ? 'X' : ' ');
|
||||||
|
else
|
||||||
|
wprintw (win, "(%c)", status ? 'X' : ' ');
|
||||||
|
|
||||||
|
wattrset (win, selected ? tag_selected_attr : tag_attr);
|
||||||
|
mvwaddch(win, choice, item_x, item[0]);
|
||||||
|
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||||
|
waddstr (win, (char *)item+1);
|
||||||
|
if (selected) {
|
||||||
|
wmove (win, choice, check_x+1);
|
||||||
|
wrefresh (win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print the scroll indicators.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_arrows (WINDOW * win, int choice, int item_no, int scroll,
|
||||||
|
int y, int x, int height)
|
||||||
|
{
|
||||||
|
wmove(win, y, x);
|
||||||
|
|
||||||
|
if (scroll > 0) {
|
||||||
|
wattrset (win, uarrow_attr);
|
||||||
|
waddch (win, ACS_UARROW);
|
||||||
|
waddstr (win, "(-)");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wattrset (win, menubox_attr);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
y = y + height + 1;
|
||||||
|
wmove(win, y, x);
|
||||||
|
|
||||||
|
if ((height < item_no) && (scroll + choice < item_no - 1)) {
|
||||||
|
wattrset (win, darrow_attr);
|
||||||
|
waddch (win, ACS_DARROW);
|
||||||
|
waddstr (win, "(+)");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wattrset (win, menubox_border_attr);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display the termination buttons
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_buttons( WINDOW *dialog, int height, int width, int selected)
|
||||||
|
{
|
||||||
|
int x = width / 2 - 11;
|
||||||
|
int y = height - 2;
|
||||||
|
|
||||||
|
print_button (dialog, "Select", y, x, selected == 0);
|
||||||
|
print_button (dialog, " Help ", y, x + 14, selected == 1);
|
||||||
|
|
||||||
|
wmove(dialog, y, x+1 + 14*selected);
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a dialog box with a list of options that can be turned on or off
|
||||||
|
* The `flag' parameter is used to select between radiolist and checklist.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_checklist (const char *title, const char *prompt, int height, int width,
|
||||||
|
int list_height, int item_no, struct dialog_list_item ** items,
|
||||||
|
int flag)
|
||||||
|
|
||||||
|
{
|
||||||
|
int i, x, y, box_x, box_y;
|
||||||
|
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
|
||||||
|
WINDOW *dialog, *list;
|
||||||
|
|
||||||
|
checkflag = flag;
|
||||||
|
|
||||||
|
/* Allocate space for storing item on/off status */
|
||||||
|
if ((status = malloc (sizeof (int) * item_no)) == NULL) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nCan't allocate memory in dialog_checklist().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initializes status */
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
status[i] = (items[i]->selected == 1); /* ON */
|
||||||
|
if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
|
||||||
|
choice = i + 1;
|
||||||
|
}
|
||||||
|
if (choice)
|
||||||
|
choice--;
|
||||||
|
|
||||||
|
max_choice = MIN (list_height, item_no);
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||||
|
|
||||||
|
list_width = width - 6;
|
||||||
|
box_y = height - list_height - 5;
|
||||||
|
box_x = (width - list_width) / 2 - 1;
|
||||||
|
|
||||||
|
/* create new window for the list */
|
||||||
|
list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
|
||||||
|
|
||||||
|
keypad (list, TRUE);
|
||||||
|
|
||||||
|
/* draw a box around the list items */
|
||||||
|
draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
|
||||||
|
menubox_border_attr, menubox_attr);
|
||||||
|
|
||||||
|
/* Find length of longest item in order to center checklist */
|
||||||
|
check_x = 0;
|
||||||
|
for (i = 0; i < item_no; i++)
|
||||||
|
check_x = MAX (check_x, + strlen (items[i]->name) + 4);
|
||||||
|
|
||||||
|
check_x = (list_width - check_x) / 2;
|
||||||
|
item_x = check_x + 4;
|
||||||
|
|
||||||
|
if (choice >= list_height) {
|
||||||
|
scroll = choice - list_height + 1;
|
||||||
|
choice -= scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print the list */
|
||||||
|
for (i = 0; i < max_choice; i++) {
|
||||||
|
print_item (list, items[scroll + i]->name,
|
||||||
|
status[i+scroll], i, i == choice);
|
||||||
|
}
|
||||||
|
|
||||||
|
print_arrows(dialog, choice, item_no, scroll,
|
||||||
|
box_y, box_x + check_x + 5, list_height);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
|
||||||
|
wnoutrefresh (list);
|
||||||
|
wnoutrefresh (dialog);
|
||||||
|
doupdate ();
|
||||||
|
|
||||||
|
while (key != ESC) {
|
||||||
|
key = wgetch (dialog);
|
||||||
|
|
||||||
|
for (i = 0; i < max_choice; i++)
|
||||||
|
if (toupper(key) == toupper(items[scroll + i]->name[0]))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
|
||||||
|
key == '+' || key == '-' ) {
|
||||||
|
if (key == KEY_UP || key == '-') {
|
||||||
|
if (!choice) {
|
||||||
|
if (!scroll)
|
||||||
|
continue;
|
||||||
|
/* Scroll list down */
|
||||||
|
if (list_height > 1) {
|
||||||
|
/* De-highlight current first item */
|
||||||
|
print_item (list, items[scroll]->name,
|
||||||
|
status[scroll], 0, FALSE);
|
||||||
|
scrollok (list, TRUE);
|
||||||
|
wscrl (list, -1);
|
||||||
|
scrollok (list, FALSE);
|
||||||
|
}
|
||||||
|
scroll--;
|
||||||
|
print_item (list, items[scroll]->name,
|
||||||
|
status[scroll], 0, TRUE);
|
||||||
|
wnoutrefresh (list);
|
||||||
|
|
||||||
|
print_arrows(dialog, choice, item_no, scroll,
|
||||||
|
box_y, box_x + check_x + 5, list_height);
|
||||||
|
|
||||||
|
wrefresh (dialog);
|
||||||
|
|
||||||
|
continue; /* wait for another key press */
|
||||||
|
} else
|
||||||
|
i = choice - 1;
|
||||||
|
} else if (key == KEY_DOWN || key == '+') {
|
||||||
|
if (choice == max_choice - 1) {
|
||||||
|
if (scroll + choice >= item_no - 1)
|
||||||
|
continue;
|
||||||
|
/* Scroll list up */
|
||||||
|
if (list_height > 1) {
|
||||||
|
/* De-highlight current last item before scrolling up */
|
||||||
|
print_item (list, items[scroll + max_choice - 1]->name,
|
||||||
|
status[scroll + max_choice - 1],
|
||||||
|
max_choice - 1, FALSE);
|
||||||
|
scrollok (list, TRUE);
|
||||||
|
scroll (list);
|
||||||
|
scrollok (list, FALSE);
|
||||||
|
}
|
||||||
|
scroll++;
|
||||||
|
print_item (list, items[scroll + max_choice - 1]->name,
|
||||||
|
status[scroll + max_choice - 1],
|
||||||
|
max_choice - 1, TRUE);
|
||||||
|
wnoutrefresh (list);
|
||||||
|
|
||||||
|
print_arrows(dialog, choice, item_no, scroll,
|
||||||
|
box_y, box_x + check_x + 5, list_height);
|
||||||
|
|
||||||
|
wrefresh (dialog);
|
||||||
|
|
||||||
|
continue; /* wait for another key press */
|
||||||
|
} else
|
||||||
|
i = choice + 1;
|
||||||
|
}
|
||||||
|
if (i != choice) {
|
||||||
|
/* De-highlight current item */
|
||||||
|
print_item (list, items[scroll + choice]->name,
|
||||||
|
status[scroll + choice], choice, FALSE);
|
||||||
|
/* Highlight new item */
|
||||||
|
choice = i;
|
||||||
|
print_item (list, items[scroll + choice]->name,
|
||||||
|
status[scroll + choice], choice, TRUE);
|
||||||
|
wnoutrefresh (list);
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
continue; /* wait for another key press */
|
||||||
|
}
|
||||||
|
switch (key) {
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
for (i = 0; i < item_no; i++)
|
||||||
|
items[i]->selected = 0;
|
||||||
|
items[scroll + choice]->selected = 1;
|
||||||
|
delwin (dialog);
|
||||||
|
free (status);
|
||||||
|
return 1;
|
||||||
|
case TAB:
|
||||||
|
case KEY_LEFT:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||||
|
? 1 : (button > 1 ? 0 : button);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, button);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
case 's':
|
||||||
|
case ' ':
|
||||||
|
case '\n':
|
||||||
|
if (!button) {
|
||||||
|
if (flag == FLAG_CHECK) {
|
||||||
|
status[scroll + choice] = !status[scroll + choice];
|
||||||
|
wmove (list, choice, check_x);
|
||||||
|
wattrset (list, check_selected_attr);
|
||||||
|
wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
|
||||||
|
} else {
|
||||||
|
if (!status[scroll + choice]) {
|
||||||
|
for (i = 0; i < item_no; i++)
|
||||||
|
status[i] = 0;
|
||||||
|
status[scroll + choice] = 1;
|
||||||
|
for (i = 0; i < max_choice; i++)
|
||||||
|
print_item (list, items[scroll + i]->name,
|
||||||
|
status[scroll + i], i, i == choice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wnoutrefresh (list);
|
||||||
|
wrefresh (dialog);
|
||||||
|
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
items[i]->selected = status[i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < item_no; i++)
|
||||||
|
items[i]->selected = 0;
|
||||||
|
items[scroll + choice]->selected = 1;
|
||||||
|
}
|
||||||
|
delwin (dialog);
|
||||||
|
free (status);
|
||||||
|
return button;
|
||||||
|
case 'X':
|
||||||
|
case 'x':
|
||||||
|
key = ESC;
|
||||||
|
case ESC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now, update everything... */
|
||||||
|
doupdate ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
free (status);
|
||||||
|
return -1; /* ESC pressed */
|
||||||
|
}
|
161
package/config/colors.h
Normal file
161
package/config/colors.h
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* colors.h -- color attribute definitions
|
||||||
|
*
|
||||||
|
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default color definitions
|
||||||
|
*
|
||||||
|
* *_FG = foreground
|
||||||
|
* *_BG = background
|
||||||
|
* *_HL = highlight?
|
||||||
|
*/
|
||||||
|
#define SCREEN_FG COLOR_CYAN
|
||||||
|
#define SCREEN_BG COLOR_BLUE
|
||||||
|
#define SCREEN_HL TRUE
|
||||||
|
|
||||||
|
#define SHADOW_FG COLOR_BLACK
|
||||||
|
#define SHADOW_BG COLOR_BLACK
|
||||||
|
#define SHADOW_HL TRUE
|
||||||
|
|
||||||
|
#define DIALOG_FG COLOR_BLACK
|
||||||
|
#define DIALOG_BG COLOR_WHITE
|
||||||
|
#define DIALOG_HL FALSE
|
||||||
|
|
||||||
|
#define TITLE_FG COLOR_YELLOW
|
||||||
|
#define TITLE_BG COLOR_WHITE
|
||||||
|
#define TITLE_HL TRUE
|
||||||
|
|
||||||
|
#define BORDER_FG COLOR_WHITE
|
||||||
|
#define BORDER_BG COLOR_WHITE
|
||||||
|
#define BORDER_HL TRUE
|
||||||
|
|
||||||
|
#define BUTTON_ACTIVE_FG COLOR_WHITE
|
||||||
|
#define BUTTON_ACTIVE_BG COLOR_BLUE
|
||||||
|
#define BUTTON_ACTIVE_HL TRUE
|
||||||
|
|
||||||
|
#define BUTTON_INACTIVE_FG COLOR_BLACK
|
||||||
|
#define BUTTON_INACTIVE_BG COLOR_WHITE
|
||||||
|
#define BUTTON_INACTIVE_HL FALSE
|
||||||
|
|
||||||
|
#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE
|
||||||
|
#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE
|
||||||
|
#define BUTTON_KEY_ACTIVE_HL TRUE
|
||||||
|
|
||||||
|
#define BUTTON_KEY_INACTIVE_FG COLOR_RED
|
||||||
|
#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE
|
||||||
|
#define BUTTON_KEY_INACTIVE_HL FALSE
|
||||||
|
|
||||||
|
#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW
|
||||||
|
#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE
|
||||||
|
#define BUTTON_LABEL_ACTIVE_HL TRUE
|
||||||
|
|
||||||
|
#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK
|
||||||
|
#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE
|
||||||
|
#define BUTTON_LABEL_INACTIVE_HL TRUE
|
||||||
|
|
||||||
|
#define INPUTBOX_FG COLOR_BLACK
|
||||||
|
#define INPUTBOX_BG COLOR_WHITE
|
||||||
|
#define INPUTBOX_HL FALSE
|
||||||
|
|
||||||
|
#define INPUTBOX_BORDER_FG COLOR_BLACK
|
||||||
|
#define INPUTBOX_BORDER_BG COLOR_WHITE
|
||||||
|
#define INPUTBOX_BORDER_HL FALSE
|
||||||
|
|
||||||
|
#define SEARCHBOX_FG COLOR_BLACK
|
||||||
|
#define SEARCHBOX_BG COLOR_WHITE
|
||||||
|
#define SEARCHBOX_HL FALSE
|
||||||
|
|
||||||
|
#define SEARCHBOX_TITLE_FG COLOR_YELLOW
|
||||||
|
#define SEARCHBOX_TITLE_BG COLOR_WHITE
|
||||||
|
#define SEARCHBOX_TITLE_HL TRUE
|
||||||
|
|
||||||
|
#define SEARCHBOX_BORDER_FG COLOR_WHITE
|
||||||
|
#define SEARCHBOX_BORDER_BG COLOR_WHITE
|
||||||
|
#define SEARCHBOX_BORDER_HL TRUE
|
||||||
|
|
||||||
|
#define POSITION_INDICATOR_FG COLOR_YELLOW
|
||||||
|
#define POSITION_INDICATOR_BG COLOR_WHITE
|
||||||
|
#define POSITION_INDICATOR_HL TRUE
|
||||||
|
|
||||||
|
#define MENUBOX_FG COLOR_BLACK
|
||||||
|
#define MENUBOX_BG COLOR_WHITE
|
||||||
|
#define MENUBOX_HL FALSE
|
||||||
|
|
||||||
|
#define MENUBOX_BORDER_FG COLOR_WHITE
|
||||||
|
#define MENUBOX_BORDER_BG COLOR_WHITE
|
||||||
|
#define MENUBOX_BORDER_HL TRUE
|
||||||
|
|
||||||
|
#define ITEM_FG COLOR_BLACK
|
||||||
|
#define ITEM_BG COLOR_WHITE
|
||||||
|
#define ITEM_HL FALSE
|
||||||
|
|
||||||
|
#define ITEM_SELECTED_FG COLOR_WHITE
|
||||||
|
#define ITEM_SELECTED_BG COLOR_BLUE
|
||||||
|
#define ITEM_SELECTED_HL TRUE
|
||||||
|
|
||||||
|
#define TAG_FG COLOR_YELLOW
|
||||||
|
#define TAG_BG COLOR_WHITE
|
||||||
|
#define TAG_HL TRUE
|
||||||
|
|
||||||
|
#define TAG_SELECTED_FG COLOR_YELLOW
|
||||||
|
#define TAG_SELECTED_BG COLOR_BLUE
|
||||||
|
#define TAG_SELECTED_HL TRUE
|
||||||
|
|
||||||
|
#define TAG_KEY_FG COLOR_YELLOW
|
||||||
|
#define TAG_KEY_BG COLOR_WHITE
|
||||||
|
#define TAG_KEY_HL TRUE
|
||||||
|
|
||||||
|
#define TAG_KEY_SELECTED_FG COLOR_YELLOW
|
||||||
|
#define TAG_KEY_SELECTED_BG COLOR_BLUE
|
||||||
|
#define TAG_KEY_SELECTED_HL TRUE
|
||||||
|
|
||||||
|
#define CHECK_FG COLOR_BLACK
|
||||||
|
#define CHECK_BG COLOR_WHITE
|
||||||
|
#define CHECK_HL FALSE
|
||||||
|
|
||||||
|
#define CHECK_SELECTED_FG COLOR_WHITE
|
||||||
|
#define CHECK_SELECTED_BG COLOR_BLUE
|
||||||
|
#define CHECK_SELECTED_HL TRUE
|
||||||
|
|
||||||
|
#define UARROW_FG COLOR_GREEN
|
||||||
|
#define UARROW_BG COLOR_WHITE
|
||||||
|
#define UARROW_HL TRUE
|
||||||
|
|
||||||
|
#define DARROW_FG COLOR_GREEN
|
||||||
|
#define DARROW_BG COLOR_WHITE
|
||||||
|
#define DARROW_HL TRUE
|
||||||
|
|
||||||
|
/* End of default color definitions */
|
||||||
|
|
||||||
|
#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
|
||||||
|
#define COLOR_NAME_LEN 10
|
||||||
|
#define COLOR_COUNT 8
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global variables
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char name[COLOR_NAME_LEN];
|
||||||
|
int value;
|
||||||
|
} color_names_st;
|
||||||
|
|
||||||
|
extern color_names_st color_names[];
|
||||||
|
extern int color_table[][3];
|
583
package/config/conf.c
Normal file
583
package/config/conf.c
Normal file
@ -0,0 +1,583 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
static void conf(struct menu *menu);
|
||||||
|
static void check_conf(struct menu *menu);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ask_all,
|
||||||
|
ask_new,
|
||||||
|
ask_silent,
|
||||||
|
set_default,
|
||||||
|
set_yes,
|
||||||
|
set_mod,
|
||||||
|
set_no,
|
||||||
|
set_random
|
||||||
|
} input_mode = ask_all;
|
||||||
|
char *defconfig_file;
|
||||||
|
|
||||||
|
static int indent = 1;
|
||||||
|
static int valid_stdin = 1;
|
||||||
|
static int conf_cnt;
|
||||||
|
static char line[128];
|
||||||
|
static struct menu *rootEntry;
|
||||||
|
|
||||||
|
static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
|
||||||
|
|
||||||
|
static void strip(char *str)
|
||||||
|
{
|
||||||
|
char *p = str;
|
||||||
|
int l;
|
||||||
|
|
||||||
|
while ((isspace(*p)))
|
||||||
|
p++;
|
||||||
|
l = strlen(p);
|
||||||
|
if (p != str)
|
||||||
|
memmove(str, p, l + 1);
|
||||||
|
if (!l)
|
||||||
|
return;
|
||||||
|
p = str + l - 1;
|
||||||
|
while ((isspace(*p)))
|
||||||
|
*p-- = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void check_stdin(void)
|
||||||
|
{
|
||||||
|
if (!valid_stdin && input_mode == ask_silent) {
|
||||||
|
printf("aborted!\n\n");
|
||||||
|
printf("Console input/output is redirected. ");
|
||||||
|
printf("Run 'make oldconfig' to update configuration.\n\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_askvalue(struct symbol *sym, const char *def)
|
||||||
|
{
|
||||||
|
enum symbol_type type = sym_get_type(sym);
|
||||||
|
tristate val;
|
||||||
|
|
||||||
|
if (!sym_has_value(sym))
|
||||||
|
printf("(NEW) ");
|
||||||
|
|
||||||
|
line[0] = '\n';
|
||||||
|
line[1] = 0;
|
||||||
|
|
||||||
|
if (!sym_is_changable(sym)) {
|
||||||
|
printf("%s\n", def);
|
||||||
|
line[0] = '\n';
|
||||||
|
line[1] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (input_mode) {
|
||||||
|
case ask_new:
|
||||||
|
case ask_silent:
|
||||||
|
if (sym_has_value(sym)) {
|
||||||
|
printf("%s\n", def);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
check_stdin();
|
||||||
|
case ask_all:
|
||||||
|
fflush(stdout);
|
||||||
|
fgets(line, 128, stdin);
|
||||||
|
return;
|
||||||
|
case set_default:
|
||||||
|
printf("%s\n", def);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
case S_STRING:
|
||||||
|
printf("%s\n", def);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
switch (input_mode) {
|
||||||
|
case set_yes:
|
||||||
|
if (sym_tristate_within_range(sym, yes)) {
|
||||||
|
line[0] = 'y';
|
||||||
|
line[1] = '\n';
|
||||||
|
line[2] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case set_mod:
|
||||||
|
if (type == S_TRISTATE) {
|
||||||
|
if (sym_tristate_within_range(sym, mod)) {
|
||||||
|
line[0] = 'm';
|
||||||
|
line[1] = '\n';
|
||||||
|
line[2] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (sym_tristate_within_range(sym, yes)) {
|
||||||
|
line[0] = 'y';
|
||||||
|
line[1] = '\n';
|
||||||
|
line[2] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case set_no:
|
||||||
|
if (sym_tristate_within_range(sym, no)) {
|
||||||
|
line[0] = 'n';
|
||||||
|
line[1] = '\n';
|
||||||
|
line[2] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case set_random:
|
||||||
|
do {
|
||||||
|
val = (tristate)(random() % 3);
|
||||||
|
} while (!sym_tristate_within_range(sym, val));
|
||||||
|
switch (val) {
|
||||||
|
case no: line[0] = 'n'; break;
|
||||||
|
case mod: line[0] = 'm'; break;
|
||||||
|
case yes: line[0] = 'y'; break;
|
||||||
|
}
|
||||||
|
line[1] = '\n';
|
||||||
|
line[2] = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("%s", line);
|
||||||
|
}
|
||||||
|
|
||||||
|
int conf_string(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
const char *def, *help;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
printf("%*s%s ", indent - 1, "", menu->prompt->text);
|
||||||
|
printf("(%s) ", sym->name);
|
||||||
|
def = sym_get_string_value(sym);
|
||||||
|
if (sym_get_string_value(sym))
|
||||||
|
printf("[%s] ", def);
|
||||||
|
conf_askvalue(sym, def);
|
||||||
|
switch (line[0]) {
|
||||||
|
case '\n':
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
/* print help */
|
||||||
|
if (line[1] == '\n') {
|
||||||
|
help = nohelp_text;
|
||||||
|
if (menu->sym->help)
|
||||||
|
help = menu->sym->help;
|
||||||
|
printf("\n%s\n", menu->sym->help);
|
||||||
|
def = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
line[strlen(line)-1] = 0;
|
||||||
|
def = line;
|
||||||
|
}
|
||||||
|
if (def && sym_set_string_value(sym, def))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int conf_sym(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
int type;
|
||||||
|
tristate oldval, newval;
|
||||||
|
const char *help;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
printf("%*s%s ", indent - 1, "", menu->prompt->text);
|
||||||
|
if (sym->name)
|
||||||
|
printf("(%s) ", sym->name);
|
||||||
|
type = sym_get_type(sym);
|
||||||
|
putchar('[');
|
||||||
|
oldval = sym_get_tristate_value(sym);
|
||||||
|
switch (oldval) {
|
||||||
|
case no:
|
||||||
|
putchar('N');
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
putchar('M');
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
putchar('Y');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (oldval != no && sym_tristate_within_range(sym, no))
|
||||||
|
printf("/n");
|
||||||
|
if (oldval != mod && sym_tristate_within_range(sym, mod))
|
||||||
|
printf("/m");
|
||||||
|
if (oldval != yes && sym_tristate_within_range(sym, yes))
|
||||||
|
printf("/y");
|
||||||
|
if (sym->help)
|
||||||
|
printf("/?");
|
||||||
|
printf("] ");
|
||||||
|
conf_askvalue(sym, sym_get_string_value(sym));
|
||||||
|
strip(line);
|
||||||
|
|
||||||
|
switch (line[0]) {
|
||||||
|
case 'n':
|
||||||
|
case 'N':
|
||||||
|
newval = no;
|
||||||
|
if (!line[1] || !strcmp(&line[1], "o"))
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
case 'm':
|
||||||
|
case 'M':
|
||||||
|
newval = mod;
|
||||||
|
if (!line[1])
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
case 'y':
|
||||||
|
case 'Y':
|
||||||
|
newval = yes;
|
||||||
|
if (!line[1] || !strcmp(&line[1], "es"))
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
|
case 0:
|
||||||
|
newval = oldval;
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
goto help;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sym_set_tristate_value(sym, newval))
|
||||||
|
return 0;
|
||||||
|
help:
|
||||||
|
help = nohelp_text;
|
||||||
|
if (sym->help)
|
||||||
|
help = sym->help;
|
||||||
|
printf("\n%s\n", help);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int conf_choice(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *def_sym;
|
||||||
|
struct menu *child;
|
||||||
|
int type;
|
||||||
|
bool is_new;
|
||||||
|
|
||||||
|
sym = menu->sym;
|
||||||
|
type = sym_get_type(sym);
|
||||||
|
is_new = !sym_has_value(sym);
|
||||||
|
if (sym_is_changable(sym)) {
|
||||||
|
conf_sym(menu);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
return 1;
|
||||||
|
case mod:
|
||||||
|
return 0;
|
||||||
|
case yes:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
return 1;
|
||||||
|
case mod:
|
||||||
|
printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
|
||||||
|
return 0;
|
||||||
|
case yes:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int cnt, def;
|
||||||
|
|
||||||
|
printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
|
||||||
|
def_sym = sym_get_choice_value(sym);
|
||||||
|
cnt = def = 0;
|
||||||
|
line[0] = '0';
|
||||||
|
line[1] = 0;
|
||||||
|
for (child = menu->list; child; child = child->next) {
|
||||||
|
if (!menu_is_visible(child))
|
||||||
|
continue;
|
||||||
|
if (!child->sym) {
|
||||||
|
printf("%*c %s\n", indent, '*', menu_get_prompt(child));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cnt++;
|
||||||
|
if (child->sym == def_sym) {
|
||||||
|
def = cnt;
|
||||||
|
printf("%*c", indent, '>');
|
||||||
|
} else
|
||||||
|
printf("%*c", indent, ' ');
|
||||||
|
printf(" %d. %s", cnt, menu_get_prompt(child));
|
||||||
|
if (child->sym->name)
|
||||||
|
printf(" (%s)", child->sym->name);
|
||||||
|
if (!sym_has_value(child->sym))
|
||||||
|
printf(" (NEW)");
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("%*schoice", indent - 1, "");
|
||||||
|
if (cnt == 1) {
|
||||||
|
printf("[1]: 1\n");
|
||||||
|
goto conf_childs;
|
||||||
|
}
|
||||||
|
printf("[1-%d", cnt);
|
||||||
|
if (sym->help)
|
||||||
|
printf("?");
|
||||||
|
printf("]: ");
|
||||||
|
switch (input_mode) {
|
||||||
|
case ask_new:
|
||||||
|
case ask_silent:
|
||||||
|
if (!is_new) {
|
||||||
|
cnt = def;
|
||||||
|
printf("%d\n", cnt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
check_stdin();
|
||||||
|
case ask_all:
|
||||||
|
fflush(stdout);
|
||||||
|
fgets(line, 128, stdin);
|
||||||
|
strip(line);
|
||||||
|
if (line[0] == '?') {
|
||||||
|
printf("\n%s\n", menu->sym->help ?
|
||||||
|
menu->sym->help : nohelp_text);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!line[0])
|
||||||
|
cnt = def;
|
||||||
|
else if (isdigit(line[0]))
|
||||||
|
cnt = atoi(line);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
break;
|
||||||
|
case set_random:
|
||||||
|
def = (random() % cnt) + 1;
|
||||||
|
case set_default:
|
||||||
|
case set_yes:
|
||||||
|
case set_mod:
|
||||||
|
case set_no:
|
||||||
|
cnt = def;
|
||||||
|
printf("%d\n", cnt);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf_childs:
|
||||||
|
for (child = menu->list; child; child = child->next) {
|
||||||
|
if (!child->sym || !menu_is_visible(child))
|
||||||
|
continue;
|
||||||
|
if (!--cnt)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!child)
|
||||||
|
continue;
|
||||||
|
if (line[strlen(line) - 1] == '?') {
|
||||||
|
printf("\n%s\n", child->sym->help ?
|
||||||
|
child->sym->help : nohelp_text);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sym_set_choice_value(sym, child->sym);
|
||||||
|
if (child->list) {
|
||||||
|
indent += 2;
|
||||||
|
conf(child->list);
|
||||||
|
indent -= 2;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct menu *child;
|
||||||
|
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
sym = menu->sym;
|
||||||
|
prop = menu->prompt;
|
||||||
|
if (prop) {
|
||||||
|
const char *prompt;
|
||||||
|
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_MENU:
|
||||||
|
if (input_mode == ask_silent && rootEntry != menu) {
|
||||||
|
check_conf(menu);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case P_COMMENT:
|
||||||
|
prompt = menu_get_prompt(menu);
|
||||||
|
if (prompt)
|
||||||
|
printf("%*c\n%*c %s\n%*c\n",
|
||||||
|
indent, '*',
|
||||||
|
indent, '*', prompt,
|
||||||
|
indent, '*');
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sym)
|
||||||
|
goto conf_childs;
|
||||||
|
|
||||||
|
if (sym_is_choice(sym)) {
|
||||||
|
conf_choice(menu);
|
||||||
|
if (sym->curr.tri != mod)
|
||||||
|
return;
|
||||||
|
goto conf_childs;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
case S_STRING:
|
||||||
|
conf_string(menu);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
conf_sym(menu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
conf_childs:
|
||||||
|
if (sym)
|
||||||
|
indent += 2;
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
conf(child);
|
||||||
|
if (sym)
|
||||||
|
indent -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void check_conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct menu *child;
|
||||||
|
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
sym = menu->sym;
|
||||||
|
if (sym) {
|
||||||
|
if (sym_is_changable(sym) && !sym_has_value(sym)) {
|
||||||
|
if (!conf_cnt++)
|
||||||
|
printf("*\n* Restart config...\n*\n");
|
||||||
|
rootEntry = menu_get_parent_menu(menu);
|
||||||
|
conf(rootEntry);
|
||||||
|
}
|
||||||
|
if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
check_conf(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int ac, char **av)
|
||||||
|
{
|
||||||
|
int i = 1;
|
||||||
|
const char *name;
|
||||||
|
struct stat tmpstat;
|
||||||
|
|
||||||
|
if (ac > i && av[i][0] == '-') {
|
||||||
|
switch (av[i++][1]) {
|
||||||
|
case 'o':
|
||||||
|
input_mode = ask_new;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
input_mode = ask_silent;
|
||||||
|
valid_stdin = isatty(0) && isatty(1) && isatty(2);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
input_mode = set_default;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
input_mode = set_default;
|
||||||
|
defconfig_file = av[i++];
|
||||||
|
if (!defconfig_file) {
|
||||||
|
printf("%s: No default config file specified\n",
|
||||||
|
av[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
input_mode = set_no;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
input_mode = set_mod;
|
||||||
|
break;
|
||||||
|
case 'y':
|
||||||
|
input_mode = set_yes;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
input_mode = set_random;
|
||||||
|
srandom(time(NULL));
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
printf("%s [-o|-s] config\n", av[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
name = av[i];
|
||||||
|
if (!name) {
|
||||||
|
printf("%s: configuration file missing\n", av[0]);
|
||||||
|
}
|
||||||
|
conf_parse(name);
|
||||||
|
//zconfdump(stdout);
|
||||||
|
switch (input_mode) {
|
||||||
|
case set_default:
|
||||||
|
if (!defconfig_file)
|
||||||
|
defconfig_file = conf_get_default_confname();
|
||||||
|
if (conf_read(defconfig_file)) {
|
||||||
|
printf("***\n"
|
||||||
|
"*** Can't find default configuration \"%s\"!\n"
|
||||||
|
"***\n", defconfig_file);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ask_silent:
|
||||||
|
if (stat(".config", &tmpstat)) {
|
||||||
|
printf("***\n"
|
||||||
|
"*** You have not yet configured Buildroot!\n"
|
||||||
|
"***\n"
|
||||||
|
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
||||||
|
"*** \"make menuconfig\" or \"make config\").\n"
|
||||||
|
"***\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
case ask_all:
|
||||||
|
case ask_new:
|
||||||
|
conf_read(NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input_mode != ask_silent) {
|
||||||
|
rootEntry = &rootmenu;
|
||||||
|
conf(&rootmenu);
|
||||||
|
if (input_mode == ask_all) {
|
||||||
|
input_mode = ask_silent;
|
||||||
|
valid_stdin = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
conf_cnt = 0;
|
||||||
|
check_conf(&rootmenu);
|
||||||
|
} while (conf_cnt);
|
||||||
|
if (conf_write(NULL)) {
|
||||||
|
fprintf(stderr, "\n*** Error during writing of the Buildroot configuration.\n\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
447
package/config/confdata.c
Normal file
447
package/config/confdata.c
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
const char conf_def_filename[] = ".config";
|
||||||
|
|
||||||
|
const char conf_defname[] = "sysdeps/linux/defconfig";
|
||||||
|
|
||||||
|
const char *conf_confnames[] = {
|
||||||
|
".config",
|
||||||
|
conf_defname,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *conf_expand_value(const char *in)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
const char *src;
|
||||||
|
static char res_value[SYMBOL_MAXLENGTH];
|
||||||
|
char *dst, name[SYMBOL_MAXLENGTH];
|
||||||
|
|
||||||
|
res_value[0] = 0;
|
||||||
|
dst = name;
|
||||||
|
while ((src = strchr(in, '$'))) {
|
||||||
|
strncat(res_value, in, src - in);
|
||||||
|
src++;
|
||||||
|
dst = name;
|
||||||
|
while (isalnum(*src) || *src == '_')
|
||||||
|
*dst++ = *src++;
|
||||||
|
*dst = 0;
|
||||||
|
sym = sym_lookup(name, 0);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
strcat(res_value, sym_get_string_value(sym));
|
||||||
|
in = src;
|
||||||
|
}
|
||||||
|
strcat(res_value, in);
|
||||||
|
|
||||||
|
return res_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *conf_get_default_confname(void)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
static char fullname[PATH_MAX+1];
|
||||||
|
char *env, *name;
|
||||||
|
|
||||||
|
name = conf_expand_value(conf_defname);
|
||||||
|
env = getenv(SRCTREE);
|
||||||
|
if (env) {
|
||||||
|
sprintf(fullname, "%s/%s", env, name);
|
||||||
|
if (!stat(fullname, &buf))
|
||||||
|
return fullname;
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
int conf_read(const char *name)
|
||||||
|
{
|
||||||
|
FILE *in = NULL;
|
||||||
|
char line[1024];
|
||||||
|
char *p, *p2;
|
||||||
|
int lineno = 0;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
in = zconf_fopen(name);
|
||||||
|
} else {
|
||||||
|
const char **names = conf_confnames;
|
||||||
|
while ((name = *names++)) {
|
||||||
|
name = conf_expand_value(name);
|
||||||
|
in = zconf_fopen(name);
|
||||||
|
if (in) {
|
||||||
|
printf("#\n"
|
||||||
|
"# using defaults found in %s\n"
|
||||||
|
"#\n", name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!in)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
|
||||||
|
sym->flags &= ~SYMBOL_VALID;
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
case S_STRING:
|
||||||
|
if (sym->user.val)
|
||||||
|
free(sym->user.val);
|
||||||
|
default:
|
||||||
|
sym->user.val = NULL;
|
||||||
|
sym->user.tri = no;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line), in)) {
|
||||||
|
lineno++;
|
||||||
|
sym = NULL;
|
||||||
|
switch (line[0]) {
|
||||||
|
case '#':
|
||||||
|
if (line[1]!=' ')
|
||||||
|
continue;
|
||||||
|
p = strchr(line + 2, ' ');
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
*p++ = 0;
|
||||||
|
if (strncmp(p, "is not set", 10))
|
||||||
|
continue;
|
||||||
|
sym = sym_find(line + 2);
|
||||||
|
if (!sym) {
|
||||||
|
fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
sym->user.tri = no;
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'A' ... 'Z':
|
||||||
|
p = strchr(line, '=');
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
|
*p++ = 0;
|
||||||
|
p2 = strchr(p, '\n');
|
||||||
|
if (p2)
|
||||||
|
*p2 = 0;
|
||||||
|
sym = sym_find(line);
|
||||||
|
if (!sym) {
|
||||||
|
fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_TRISTATE:
|
||||||
|
if (p[0] == 'm') {
|
||||||
|
sym->user.tri = mod;
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case S_BOOLEAN:
|
||||||
|
if (p[0] == 'y') {
|
||||||
|
sym->user.tri = yes;
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p[0] == 'n') {
|
||||||
|
sym->user.tri = no;
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
if (*p++ != '"')
|
||||||
|
break;
|
||||||
|
for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
|
||||||
|
if (*p2 == '"') {
|
||||||
|
*p2 = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
memmove(p2, p2 + 1, strlen(p2));
|
||||||
|
}
|
||||||
|
if (!p2) {
|
||||||
|
fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
if (sym_string_valid(sym, p)) {
|
||||||
|
sym->user.val = strdup(p);
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sym && sym_is_choice_value(sym)) {
|
||||||
|
struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
|
||||||
|
switch (sym->user.tri) {
|
||||||
|
case no:
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
if (cs->user.tri == yes)
|
||||||
|
/* warn? */;
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
if (cs->user.tri != no)
|
||||||
|
/* warn? */;
|
||||||
|
cs->user.val = sym;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
|
||||||
|
cs->flags &= ~SYMBOL_NEW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(in);
|
||||||
|
|
||||||
|
if (modules_sym)
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
|
||||||
|
if (sym->visible == no)
|
||||||
|
sym->flags |= SYMBOL_NEW;
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_STRING:
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
if (!sym_string_within_range(sym, sym->user.val))
|
||||||
|
sym->flags |= SYMBOL_NEW;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sym_is_choice(sym))
|
||||||
|
continue;
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
for (e = prop->expr; e; e = e->left.expr)
|
||||||
|
if (e->right.sym->visible != no)
|
||||||
|
sym->flags |= e->right.sym->flags & SYMBOL_NEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym_change_count = 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int conf_write(const char *name)
|
||||||
|
{
|
||||||
|
FILE *out, *out_h;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct menu *menu;
|
||||||
|
const char *basename;
|
||||||
|
char dirname[128], tmpname[128], newname[128];
|
||||||
|
int type, l;
|
||||||
|
const char *str;
|
||||||
|
|
||||||
|
dirname[0] = 0;
|
||||||
|
if (name && name[0]) {
|
||||||
|
struct stat st;
|
||||||
|
char *slash;
|
||||||
|
|
||||||
|
if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
|
||||||
|
strcpy(dirname, name);
|
||||||
|
strcat(dirname, "/");
|
||||||
|
basename = conf_def_filename;
|
||||||
|
} else if ((slash = strrchr(name, '/'))) {
|
||||||
|
int size = slash - name + 1;
|
||||||
|
memcpy(dirname, name, size);
|
||||||
|
dirname[size] = 0;
|
||||||
|
if (slash[1])
|
||||||
|
basename = slash + 1;
|
||||||
|
else
|
||||||
|
basename = conf_def_filename;
|
||||||
|
} else
|
||||||
|
basename = name;
|
||||||
|
} else
|
||||||
|
basename = conf_def_filename;
|
||||||
|
|
||||||
|
sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
|
||||||
|
out = fopen(newname, "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
out_h = NULL;
|
||||||
|
if (!name) {
|
||||||
|
out_h = fopen(".tmpconfig.h", "w");
|
||||||
|
if (!out_h)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
fprintf(out, "#\n"
|
||||||
|
"# Automatically generated make config: don't edit\n"
|
||||||
|
"#\n");
|
||||||
|
if (out_h) {
|
||||||
|
fprintf(out_h, "/*\n"
|
||||||
|
" * Automatically generated header file: don't edit\n"
|
||||||
|
" */\n\n"
|
||||||
|
"#define AUTOCONF_INCLUDED\n\n"
|
||||||
|
"/* Version Number */\n"
|
||||||
|
"#define BB_VER \"%s\"\n"
|
||||||
|
"#define BB_BT \"%s\"\n",
|
||||||
|
getenv("VERSION"),
|
||||||
|
getenv("BUILDTIME"));
|
||||||
|
if (getenv("EXTRA_VERSION"))
|
||||||
|
fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
|
||||||
|
getenv("EXTRA_VERSION"));
|
||||||
|
fprintf(out_h, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sym_change_count)
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
menu = rootmenu.list;
|
||||||
|
while (menu) {
|
||||||
|
sym = menu->sym;
|
||||||
|
if (!sym) {
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
goto next;
|
||||||
|
str = menu_get_prompt(menu);
|
||||||
|
fprintf(out, "\n"
|
||||||
|
"#\n"
|
||||||
|
"# %s\n"
|
||||||
|
"#\n", str);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "\n"
|
||||||
|
"/*\n"
|
||||||
|
" * %s\n"
|
||||||
|
" */\n", str);
|
||||||
|
} else if (!(sym->flags & SYMBOL_CHOICE)) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
if (!(sym->flags & SYMBOL_WRITE))
|
||||||
|
goto next;
|
||||||
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
|
type = sym->type;
|
||||||
|
if (type == S_TRISTATE) {
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
if (modules_sym->curr.tri == no)
|
||||||
|
type = S_BOOLEAN;
|
||||||
|
}
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (sym_get_tristate_value(sym)) {
|
||||||
|
case no:
|
||||||
|
fprintf(out, "# %s is not set\n", sym->name);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#undef %s\n", sym->name);
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
#if 0
|
||||||
|
fprintf(out, "%s=m\n", sym->name);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
fprintf(out, "%s=y\n", sym->name);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#define %s 1\n", sym->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
// fix me
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
fprintf(out, "%s=\"", sym->name);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#define %s \"", sym->name);
|
||||||
|
do {
|
||||||
|
l = strcspn(str, "\"\\");
|
||||||
|
if (l) {
|
||||||
|
fwrite(str, l, 1, out);
|
||||||
|
if (out_h)
|
||||||
|
fwrite(str, l, 1, out_h);
|
||||||
|
}
|
||||||
|
str += l;
|
||||||
|
while (*str == '\\' || *str == '"') {
|
||||||
|
fprintf(out, "\\%c", *str);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "\\%c", *str);
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
} while (*str);
|
||||||
|
fputs("\"\n", out);
|
||||||
|
if (out_h)
|
||||||
|
fputs("\"\n", out_h);
|
||||||
|
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);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case S_INT:
|
||||||
|
str = sym_get_string_value(sym);
|
||||||
|
fprintf(out, "%s=%s\n", sym->name, str);
|
||||||
|
if (out_h)
|
||||||
|
fprintf(out_h, "#define %s %s\n", sym->name, str);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
if (out_h) {
|
||||||
|
fclose(out_h);
|
||||||
|
rename(".tmpconfig.h", "include/config.h");
|
||||||
|
file_write_dep(NULL);
|
||||||
|
}
|
||||||
|
if (!name || basename != conf_def_filename) {
|
||||||
|
if (!name)
|
||||||
|
name = conf_def_filename;
|
||||||
|
sprintf(tmpname, "%s.old", name);
|
||||||
|
rename(name, tmpname);
|
||||||
|
}
|
||||||
|
sprintf(tmpname, "%s%s", dirname, basename);
|
||||||
|
if (rename(newname, tmpname))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
sym_change_count = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
196
package/config/dialog.h
Normal file
196
package/config/dialog.h
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* dialog.h -- common declarations for all dialog modules
|
||||||
|
*
|
||||||
|
* AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef CURSES_LOC
|
||||||
|
#include CURSES_LOC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Colors in ncurses 1.9.9e do not work properly since foreground and
|
||||||
|
* background colors are OR'd rather than separately masked. This version
|
||||||
|
* of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
|
||||||
|
* with standard curses. The simplest fix (to make this work with standard
|
||||||
|
* curses) uses the wbkgdset() function, not used in the original hack.
|
||||||
|
* Turn it off if we're building with 1.9.9e, since it just confuses things.
|
||||||
|
*/
|
||||||
|
#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
|
||||||
|
#define OLD_NCURSES 1
|
||||||
|
#undef wbkgdset
|
||||||
|
#define wbkgdset(w,p) /*nothing*/
|
||||||
|
#else
|
||||||
|
#define OLD_NCURSES 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TR(params) _tracef params
|
||||||
|
|
||||||
|
#define ESC 27
|
||||||
|
#define TAB 9
|
||||||
|
#define MAX_LEN 2048
|
||||||
|
#define BUF_SIZE (10*1024)
|
||||||
|
#define MIN(x,y) (x < y ? x : y)
|
||||||
|
#define MAX(x,y) (x > y ? x : y)
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef ACS_ULCORNER
|
||||||
|
#define ACS_ULCORNER '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_LLCORNER
|
||||||
|
#define ACS_LLCORNER '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_URCORNER
|
||||||
|
#define ACS_URCORNER '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_LRCORNER
|
||||||
|
#define ACS_LRCORNER '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_HLINE
|
||||||
|
#define ACS_HLINE '-'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_VLINE
|
||||||
|
#define ACS_VLINE '|'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_LTEE
|
||||||
|
#define ACS_LTEE '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_RTEE
|
||||||
|
#define ACS_RTEE '+'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_UARROW
|
||||||
|
#define ACS_UARROW '^'
|
||||||
|
#endif
|
||||||
|
#ifndef ACS_DARROW
|
||||||
|
#define ACS_DARROW 'v'
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attribute names
|
||||||
|
*/
|
||||||
|
#define screen_attr attributes[0]
|
||||||
|
#define shadow_attr attributes[1]
|
||||||
|
#define dialog_attr attributes[2]
|
||||||
|
#define title_attr attributes[3]
|
||||||
|
#define border_attr attributes[4]
|
||||||
|
#define button_active_attr attributes[5]
|
||||||
|
#define button_inactive_attr attributes[6]
|
||||||
|
#define button_key_active_attr attributes[7]
|
||||||
|
#define button_key_inactive_attr attributes[8]
|
||||||
|
#define button_label_active_attr attributes[9]
|
||||||
|
#define button_label_inactive_attr attributes[10]
|
||||||
|
#define inputbox_attr attributes[11]
|
||||||
|
#define inputbox_border_attr attributes[12]
|
||||||
|
#define searchbox_attr attributes[13]
|
||||||
|
#define searchbox_title_attr attributes[14]
|
||||||
|
#define searchbox_border_attr attributes[15]
|
||||||
|
#define position_indicator_attr attributes[16]
|
||||||
|
#define menubox_attr attributes[17]
|
||||||
|
#define menubox_border_attr attributes[18]
|
||||||
|
#define item_attr attributes[19]
|
||||||
|
#define item_selected_attr attributes[20]
|
||||||
|
#define tag_attr attributes[21]
|
||||||
|
#define tag_selected_attr attributes[22]
|
||||||
|
#define tag_key_attr attributes[23]
|
||||||
|
#define tag_key_selected_attr attributes[24]
|
||||||
|
#define check_attr attributes[25]
|
||||||
|
#define check_selected_attr attributes[26]
|
||||||
|
#define uarrow_attr attributes[27]
|
||||||
|
#define darrow_attr attributes[28]
|
||||||
|
|
||||||
|
/* number of attributes */
|
||||||
|
#define ATTRIBUTE_COUNT 29
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Global variables
|
||||||
|
*/
|
||||||
|
extern bool use_colors;
|
||||||
|
|
||||||
|
extern chtype attributes[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char *backtitle;
|
||||||
|
|
||||||
|
struct dialog_list_item {
|
||||||
|
char *name;
|
||||||
|
int namelen;
|
||||||
|
char *tag;
|
||||||
|
int selected; /* Set to 1 by dialog_*() function. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function prototypes
|
||||||
|
*/
|
||||||
|
|
||||||
|
void init_dialog (void);
|
||||||
|
void end_dialog (void);
|
||||||
|
void dialog_clear (void);
|
||||||
|
#ifdef CURSES_LOC
|
||||||
|
void attr_clear (WINDOW * win, int height, int width, chtype attr);
|
||||||
|
void color_setup (void);
|
||||||
|
void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
|
||||||
|
void print_button (WINDOW * win, const char *label, int y, int x, int selected);
|
||||||
|
void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
|
||||||
|
chtype border);
|
||||||
|
void draw_shadow (WINDOW * win, int y, int x, int height, int width);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int first_alpha (const char *string, const char *exempt);
|
||||||
|
int dialog_yesno (const char *title, const char *prompt, int height, int width);
|
||||||
|
int dialog_msgbox (const char *title, const char *prompt, int height,
|
||||||
|
int width, int pause);
|
||||||
|
int dialog_textbox (const char *title, const char *file, int height, int width);
|
||||||
|
int dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||||
|
int menu_height, const char *choice, int item_no,
|
||||||
|
struct dialog_list_item ** items);
|
||||||
|
int dialog_checklist (const char *title, const char *prompt, int height,
|
||||||
|
int width, int list_height, int item_no,
|
||||||
|
struct dialog_list_item ** items, int flag);
|
||||||
|
extern unsigned char dialog_input_result[];
|
||||||
|
int dialog_inputbox (const char *title, const char *prompt, int height,
|
||||||
|
int width, const char *init);
|
||||||
|
|
||||||
|
struct dialog_list_item *first_sel_item(int item_no,
|
||||||
|
struct dialog_list_item ** items);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the base for fictitious keys, which activate
|
||||||
|
* the buttons.
|
||||||
|
*
|
||||||
|
* Mouse-generated keys are the following:
|
||||||
|
* -- the first 32 are used as numbers, in addition to '0'-'9'
|
||||||
|
* -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
|
||||||
|
* -- uppercase chars are used to invoke the button (M_EVENT + 'O')
|
||||||
|
*/
|
||||||
|
#ifdef CURSES_LOC
|
||||||
|
#define M_EVENT (KEY_MAX+1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The `flag' parameter in checklist is used to select between
|
||||||
|
* radiolist and checklist
|
||||||
|
*/
|
||||||
|
#define FLAG_CHECK 1
|
||||||
|
#define FLAG_RADIO 0
|
1089
package/config/expr.c
Normal file
1089
package/config/expr.c
Normal file
File diff suppressed because it is too large
Load Diff
193
package/config/expr.h
Normal file
193
package/config/expr.h
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EXPR_H
|
||||||
|
#define EXPR_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#include <stdbool.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct file {
|
||||||
|
struct file *next;
|
||||||
|
struct file *parent;
|
||||||
|
char *name;
|
||||||
|
int lineno;
|
||||||
|
int flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FILE_BUSY 0x0001
|
||||||
|
#define FILE_SCANNED 0x0002
|
||||||
|
#define FILE_PRINTED 0x0004
|
||||||
|
|
||||||
|
typedef enum tristate {
|
||||||
|
no, mod, yes
|
||||||
|
} tristate;
|
||||||
|
|
||||||
|
enum expr_type {
|
||||||
|
E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
|
||||||
|
};
|
||||||
|
|
||||||
|
union expr_data {
|
||||||
|
struct expr *expr;
|
||||||
|
struct symbol *sym;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct expr {
|
||||||
|
enum expr_type type;
|
||||||
|
union expr_data left, right;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
|
||||||
|
#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
|
||||||
|
#define E_NOT(dep) (2-(dep))
|
||||||
|
|
||||||
|
struct expr_value {
|
||||||
|
struct expr *expr;
|
||||||
|
tristate tri;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct symbol_value {
|
||||||
|
void *val;
|
||||||
|
tristate tri;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum symbol_type {
|
||||||
|
S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
|
||||||
|
};
|
||||||
|
|
||||||
|
struct symbol {
|
||||||
|
struct symbol *next;
|
||||||
|
char *name;
|
||||||
|
char *help;
|
||||||
|
enum symbol_type type;
|
||||||
|
struct symbol_value curr, user;
|
||||||
|
tristate visible;
|
||||||
|
int flags;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *dep, *dep2;
|
||||||
|
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 SYMBOL_YES 0x0001
|
||||||
|
#define SYMBOL_MOD 0x0002
|
||||||
|
#define SYMBOL_NO 0x0004
|
||||||
|
#define SYMBOL_CONST 0x0007
|
||||||
|
#define SYMBOL_CHECK 0x0008
|
||||||
|
#define SYMBOL_CHOICE 0x0010
|
||||||
|
#define SYMBOL_CHOICEVAL 0x0020
|
||||||
|
#define SYMBOL_PRINTED 0x0040
|
||||||
|
#define SYMBOL_VALID 0x0080
|
||||||
|
#define SYMBOL_OPTIONAL 0x0100
|
||||||
|
#define SYMBOL_WRITE 0x0200
|
||||||
|
#define SYMBOL_CHANGED 0x0400
|
||||||
|
#define SYMBOL_NEW 0x0800
|
||||||
|
#define SYMBOL_AUTO 0x1000
|
||||||
|
#define SYMBOL_CHECKED 0x2000
|
||||||
|
#define SYMBOL_CHECK_DONE 0x4000
|
||||||
|
#define SYMBOL_WARNED 0x8000
|
||||||
|
|
||||||
|
#define SYMBOL_MAXLENGTH 256
|
||||||
|
#define SYMBOL_HASHSIZE 257
|
||||||
|
#define SYMBOL_HASHMASK 0xff
|
||||||
|
|
||||||
|
enum prop_type {
|
||||||
|
P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
|
||||||
|
};
|
||||||
|
|
||||||
|
struct property {
|
||||||
|
struct property *next;
|
||||||
|
struct symbol *sym;
|
||||||
|
enum prop_type type;
|
||||||
|
const char *text;
|
||||||
|
struct expr_value visible;
|
||||||
|
struct expr *expr;
|
||||||
|
struct menu *menu;
|
||||||
|
struct file *file;
|
||||||
|
int lineno;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define for_all_properties(sym, st, tok) \
|
||||||
|
for (st = sym->prop; st; st = st->next) \
|
||||||
|
if (st->type == (tok))
|
||||||
|
#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
|
||||||
|
#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
|
||||||
|
#define for_all_prompts(sym, st) \
|
||||||
|
for (st = sym->prop; st; st = st->next) \
|
||||||
|
if (st->text)
|
||||||
|
|
||||||
|
struct menu {
|
||||||
|
struct menu *next;
|
||||||
|
struct menu *parent;
|
||||||
|
struct menu *list;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prompt;
|
||||||
|
struct expr *dep;
|
||||||
|
unsigned int flags;
|
||||||
|
//char *help;
|
||||||
|
struct file *file;
|
||||||
|
int lineno;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define MENU_CHANGED 0x0001
|
||||||
|
#define MENU_ROOT 0x0002
|
||||||
|
|
||||||
|
#ifndef SWIG
|
||||||
|
|
||||||
|
extern struct file *file_list;
|
||||||
|
extern struct file *current_file;
|
||||||
|
struct file *lookup_file(const char *name);
|
||||||
|
|
||||||
|
extern struct symbol symbol_yes, symbol_no, symbol_mod;
|
||||||
|
extern struct symbol *modules_sym;
|
||||||
|
extern int cdebug;
|
||||||
|
struct expr *expr_alloc_symbol(struct symbol *sym);
|
||||||
|
struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
|
||||||
|
struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
|
||||||
|
struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
|
||||||
|
struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
|
||||||
|
struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
|
||||||
|
struct expr *expr_copy(struct expr *org);
|
||||||
|
void expr_free(struct expr *e);
|
||||||
|
int expr_eq(struct expr *e1, struct expr *e2);
|
||||||
|
void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
|
||||||
|
tristate expr_calc_value(struct expr *e);
|
||||||
|
struct expr *expr_eliminate_yn(struct expr *e);
|
||||||
|
struct expr *expr_trans_bool(struct expr *e);
|
||||||
|
struct expr *expr_eliminate_dups(struct expr *e);
|
||||||
|
struct expr *expr_transform(struct expr *e);
|
||||||
|
int expr_contains_symbol(struct expr *dep, struct symbol *sym);
|
||||||
|
bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
|
||||||
|
struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
|
||||||
|
struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
|
||||||
|
void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
|
||||||
|
struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
|
||||||
|
|
||||||
|
void expr_fprint(struct expr *e, FILE *out);
|
||||||
|
|
||||||
|
static inline int expr_is_yes(struct expr *e)
|
||||||
|
{
|
||||||
|
return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int expr_is_no(struct expr *e)
|
||||||
|
{
|
||||||
|
return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* EXPR_H */
|
240
package/config/inputbox.c
Normal file
240
package/config/inputbox.c
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* inputbox.c -- implements the input box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
unsigned char dialog_input_result[MAX_LEN + 1];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print the termination buttons
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||||
|
{
|
||||||
|
int x = width / 2 - 11;
|
||||||
|
int y = height - 2;
|
||||||
|
|
||||||
|
print_button (dialog, " Ok ", y, x, selected==0);
|
||||||
|
print_button (dialog, " Help ", y, x + 14, selected==1);
|
||||||
|
|
||||||
|
wmove(dialog, y, x+1+14*selected);
|
||||||
|
wrefresh(dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a dialog box for inputing a string
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_inputbox (const char *title, const char *prompt, int height, int width,
|
||||||
|
const char *init)
|
||||||
|
{
|
||||||
|
int i, x, y, box_y, box_x, box_width;
|
||||||
|
int input_x = 0, scroll = 0, key = 0, button = -1;
|
||||||
|
unsigned char *instr = dialog_input_result;
|
||||||
|
WINDOW *dialog;
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||||
|
|
||||||
|
/* Draw the input field box */
|
||||||
|
box_width = width - 6;
|
||||||
|
getyx (dialog, y, x);
|
||||||
|
box_y = y + 2;
|
||||||
|
box_x = (width - box_width) / 2;
|
||||||
|
draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
|
||||||
|
border_attr, dialog_attr);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
|
||||||
|
/* Set up the initial value */
|
||||||
|
wmove (dialog, box_y, box_x);
|
||||||
|
wattrset (dialog, inputbox_attr);
|
||||||
|
|
||||||
|
if (!init)
|
||||||
|
instr[0] = '\0';
|
||||||
|
else
|
||||||
|
strcpy (instr, init);
|
||||||
|
|
||||||
|
input_x = strlen (instr);
|
||||||
|
|
||||||
|
if (input_x >= box_width) {
|
||||||
|
scroll = input_x - box_width + 1;
|
||||||
|
input_x = box_width - 1;
|
||||||
|
for (i = 0; i < box_width - 1; i++)
|
||||||
|
waddch (dialog, instr[scroll + i]);
|
||||||
|
} else
|
||||||
|
waddstr (dialog, instr);
|
||||||
|
|
||||||
|
wmove (dialog, box_y, box_x + input_x);
|
||||||
|
|
||||||
|
wrefresh (dialog);
|
||||||
|
|
||||||
|
while (key != ESC) {
|
||||||
|
key = wgetch (dialog);
|
||||||
|
|
||||||
|
if (button == -1) { /* Input box selected */
|
||||||
|
switch (key) {
|
||||||
|
case TAB:
|
||||||
|
case KEY_UP:
|
||||||
|
case KEY_DOWN:
|
||||||
|
break;
|
||||||
|
case KEY_LEFT:
|
||||||
|
continue;
|
||||||
|
case KEY_RIGHT:
|
||||||
|
continue;
|
||||||
|
case KEY_BACKSPACE:
|
||||||
|
case 127:
|
||||||
|
if (input_x || scroll) {
|
||||||
|
wattrset (dialog, inputbox_attr);
|
||||||
|
if (!input_x) {
|
||||||
|
scroll = scroll < box_width - 1 ?
|
||||||
|
0 : scroll - (box_width - 1);
|
||||||
|
wmove (dialog, box_y, box_x);
|
||||||
|
for (i = 0; i < box_width; i++)
|
||||||
|
waddch (dialog, instr[scroll + input_x + i] ?
|
||||||
|
instr[scroll + input_x + i] : ' ');
|
||||||
|
input_x = strlen (instr) - scroll;
|
||||||
|
} else
|
||||||
|
input_x--;
|
||||||
|
instr[scroll + input_x] = '\0';
|
||||||
|
mvwaddch (dialog, box_y, input_x + box_x, ' ');
|
||||||
|
wmove (dialog, box_y, input_x + box_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
default:
|
||||||
|
if (key < 0x100 && isprint (key)) {
|
||||||
|
if (scroll + input_x < MAX_LEN) {
|
||||||
|
wattrset (dialog, inputbox_attr);
|
||||||
|
instr[scroll + input_x] = key;
|
||||||
|
instr[scroll + input_x + 1] = '\0';
|
||||||
|
if (input_x == box_width - 1) {
|
||||||
|
scroll++;
|
||||||
|
wmove (dialog, box_y, box_x);
|
||||||
|
for (i = 0; i < box_width - 1; i++)
|
||||||
|
waddch (dialog, instr[scroll + i]);
|
||||||
|
} else {
|
||||||
|
wmove (dialog, box_y, input_x++ + box_x);
|
||||||
|
waddch (dialog, key);
|
||||||
|
}
|
||||||
|
wrefresh (dialog);
|
||||||
|
} else
|
||||||
|
flash (); /* Alarm user about overflow */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (key) {
|
||||||
|
case 'O':
|
||||||
|
case 'o':
|
||||||
|
delwin (dialog);
|
||||||
|
return 0;
|
||||||
|
case 'H':
|
||||||
|
case 'h':
|
||||||
|
delwin (dialog);
|
||||||
|
return 1;
|
||||||
|
case KEY_UP:
|
||||||
|
case KEY_LEFT:
|
||||||
|
switch (button) {
|
||||||
|
case -1:
|
||||||
|
button = 1; /* Indicates "Cancel" button is selected */
|
||||||
|
print_buttons(dialog, height, width, 1);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
button = -1; /* Indicates input box is selected */
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
wmove (dialog, box_y, box_x + input_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
button = 0; /* Indicates "OK" button is selected */
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TAB:
|
||||||
|
case KEY_DOWN:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
switch (button) {
|
||||||
|
case -1:
|
||||||
|
button = 0; /* Indicates "OK" button is selected */
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
button = 1; /* Indicates "Cancel" button is selected */
|
||||||
|
print_buttons(dialog, height, width, 1);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
button = -1; /* Indicates input box is selected */
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
wmove (dialog, box_y, box_x + input_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case '\n':
|
||||||
|
delwin (dialog);
|
||||||
|
return (button == -1 ? 0 : button);
|
||||||
|
case 'X':
|
||||||
|
case 'x':
|
||||||
|
key = ESC;
|
||||||
|
case ESC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
return -1; /* ESC pressed */
|
||||||
|
}
|
3688
package/config/lex.zconf.c_shipped
Normal file
3688
package/config/lex.zconf.c_shipped
Normal file
File diff suppressed because it is too large
Load Diff
113
package/config/lkc.h
Normal file
113
package/config/lkc.h
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LKC_H
|
||||||
|
#define LKC_H
|
||||||
|
|
||||||
|
#include "expr.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LKC_DIRECT_LINK
|
||||||
|
#define P(name,type,arg) extern type name arg
|
||||||
|
#else
|
||||||
|
#include "lkc_defs.h"
|
||||||
|
#define P(name,type,arg) extern type (*name ## _p) arg
|
||||||
|
#endif
|
||||||
|
#include "lkc_proto.h"
|
||||||
|
#undef P
|
||||||
|
|
||||||
|
#define SRCTREE "srctree"
|
||||||
|
|
||||||
|
int zconfparse(void);
|
||||||
|
void zconfdump(FILE *out);
|
||||||
|
|
||||||
|
extern int zconfdebug;
|
||||||
|
void zconf_starthelp(void);
|
||||||
|
FILE *zconf_fopen(const char *name);
|
||||||
|
void zconf_initscan(const char *name);
|
||||||
|
void zconf_nextfile(const char *name);
|
||||||
|
int zconf_lineno(void);
|
||||||
|
char *zconf_curname(void);
|
||||||
|
|
||||||
|
/* confdata.c */
|
||||||
|
extern const char conf_def_filename[];
|
||||||
|
extern char conf_filename[];
|
||||||
|
|
||||||
|
char *conf_get_default_confname(void);
|
||||||
|
|
||||||
|
/* kconfig_load.c */
|
||||||
|
void kconfig_load(void);
|
||||||
|
|
||||||
|
/* menu.c */
|
||||||
|
void menu_init(void);
|
||||||
|
void menu_add_menu(void);
|
||||||
|
void menu_end_menu(void);
|
||||||
|
void menu_add_entry(struct symbol *sym);
|
||||||
|
void menu_end_entry(void);
|
||||||
|
void menu_add_dep(struct expr *dep);
|
||||||
|
struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
|
||||||
|
void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
|
||||||
|
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
||||||
|
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
||||||
|
void menu_finalize(struct menu *parent);
|
||||||
|
void menu_set_type(int type);
|
||||||
|
struct file *file_lookup(const char *name);
|
||||||
|
int file_write_dep(const char *name);
|
||||||
|
|
||||||
|
extern struct menu *current_entry;
|
||||||
|
extern struct menu *current_menu;
|
||||||
|
|
||||||
|
/* symbol.c */
|
||||||
|
void sym_init(void);
|
||||||
|
void sym_clear_all_valid(void);
|
||||||
|
void sym_set_changed(struct symbol *sym);
|
||||||
|
struct symbol *sym_check_deps(struct symbol *sym);
|
||||||
|
struct property *prop_alloc(enum prop_type type, struct symbol *sym);
|
||||||
|
struct symbol *prop_get_symbol(struct property *prop);
|
||||||
|
|
||||||
|
static inline tristate sym_get_tristate_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->curr.tri;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline struct symbol *sym_get_choice_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return (struct symbol *)sym->curr.val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
|
||||||
|
{
|
||||||
|
return sym_set_tristate_value(chval, yes);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool sym_is_choice(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->flags & SYMBOL_CHOICE ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool sym_is_choice_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->flags & SYMBOL_CHOICEVAL ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool sym_is_optional(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->flags & SYMBOL_OPTIONAL ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool sym_has_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->flags & SYMBOL_NEW ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LKC_H */
|
39
package/config/lkc_proto.h
Normal file
39
package/config/lkc_proto.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
/* confdata.c */
|
||||||
|
P(conf_parse,void,(const char *name));
|
||||||
|
P(conf_read,int,(const char *name));
|
||||||
|
P(conf_write,int,(const char *name));
|
||||||
|
|
||||||
|
/* menu.c */
|
||||||
|
P(rootmenu,struct menu,);
|
||||||
|
|
||||||
|
P(menu_is_visible,bool,(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_parent_menu,struct menu *,(struct menu *menu));
|
||||||
|
|
||||||
|
/* symbol.c */
|
||||||
|
P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
|
||||||
|
P(sym_change_count,int,);
|
||||||
|
|
||||||
|
P(sym_lookup,struct symbol *,(const char *name, int isconst));
|
||||||
|
P(sym_find,struct symbol *,(const char *name));
|
||||||
|
P(sym_type_name,const char *,(enum symbol_type type));
|
||||||
|
P(sym_calc_value,void,(struct symbol *sym));
|
||||||
|
P(sym_get_type,enum symbol_type,(struct symbol *sym));
|
||||||
|
P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
|
||||||
|
P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
|
||||||
|
P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
|
||||||
|
P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
|
||||||
|
P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
|
||||||
|
P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
|
||||||
|
P(sym_is_changable,bool,(struct symbol *sym));
|
||||||
|
P(sym_get_choice_prop,struct property *,(struct symbol *sym));
|
||||||
|
P(sym_get_default_prop,struct property *,(struct symbol *sym));
|
||||||
|
P(sym_get_string_value,const char *,(struct symbol *sym));
|
||||||
|
|
||||||
|
P(prop_get_type_name,const char *,(enum prop_type type));
|
||||||
|
|
||||||
|
/* expr.c */
|
||||||
|
P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
|
||||||
|
P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
|
713
package/config/mconf.c
Normal file
713
package/config/mconf.c
Normal file
@ -0,0 +1,713 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*
|
||||||
|
* Introduced single menu mode (show all sub-menus in one large tree).
|
||||||
|
* 2002-11-06 Petr Baudis <pasky@ucw.cz>
|
||||||
|
*
|
||||||
|
* Directly use liblxdialog library routines.
|
||||||
|
* 2002-11-14 Petr Baudis <pasky@ucw.cz>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <sys/termios.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
static char menu_backtitle[128];
|
||||||
|
static const char menu_instructions[] =
|
||||||
|
"Arrow keys navigate the menu. "
|
||||||
|
"<Enter> selects submenus --->. "
|
||||||
|
"Highlighted letters are hotkeys. "
|
||||||
|
"Pressing <Y> selectes a feature, while <N> will exclude a feature. "
|
||||||
|
"Press <Esc><Esc> to exit, <?> for Help. "
|
||||||
|
"Legend: [*] feature is selected [ ] feature is excluded",
|
||||||
|
radiolist_instructions[] =
|
||||||
|
"Use the arrow keys to navigate this window or "
|
||||||
|
"press the hotkey of the item you wish to select "
|
||||||
|
"followed by the <SPACE BAR>. "
|
||||||
|
"Press <?> for additional information about this option.",
|
||||||
|
inputbox_instructions_int[] =
|
||||||
|
"Please enter a decimal value. "
|
||||||
|
"Fractions will not be accepted. "
|
||||||
|
"Use the <TAB> key to move from the input field to the buttons below it.",
|
||||||
|
inputbox_instructions_hex[] =
|
||||||
|
"Please enter a hexadecimal value. "
|
||||||
|
"Use the <TAB> key to move from the input field to the buttons below it.",
|
||||||
|
inputbox_instructions_string[] =
|
||||||
|
"Please enter a string value. "
|
||||||
|
"Use the <TAB> key to move from the input field to the buttons below it.",
|
||||||
|
setmod_text[] =
|
||||||
|
"This feature depends on another which has been configured as a module.\n"
|
||||||
|
"As a result, this feature will be built as a module.",
|
||||||
|
nohelp_text[] =
|
||||||
|
"There is no help available for this option.\n",
|
||||||
|
load_config_text[] =
|
||||||
|
"Enter the name of the configuration file you wish to load. "
|
||||||
|
"Accept the name shown to restore the configuration you "
|
||||||
|
"last retrieved. Leave blank to abort.",
|
||||||
|
load_config_help[] =
|
||||||
|
"\n"
|
||||||
|
"For various reasons, one may wish to keep several different Buildroot\n"
|
||||||
|
"configurations available on a single machine.\n"
|
||||||
|
"\n"
|
||||||
|
"If you have saved a previous configuration in a file other than the\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"
|
||||||
|
"configuration files. You should therefor leave this blank to abort.\n",
|
||||||
|
save_config_text[] =
|
||||||
|
"Enter a filename to which this configuration should be saved "
|
||||||
|
"as an alternate. Leave blank to abort.",
|
||||||
|
save_config_help[] =
|
||||||
|
"\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"
|
||||||
|
"and use the current configuration as an alternate to whatever\n"
|
||||||
|
"configuration options you have selected at that time.\n"
|
||||||
|
"\n"
|
||||||
|
"If you are uncertain what all this means then you should probably\n"
|
||||||
|
"leave this blank.\n",
|
||||||
|
top_menu_help[] =
|
||||||
|
"\n"
|
||||||
|
"Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
|
||||||
|
"you wish to change or submenu wish to select and press <Enter>.\n"
|
||||||
|
"Submenus are designated by \"--->\".\n"
|
||||||
|
"\n"
|
||||||
|
"Shortcut: Press the option's highlighted letter (hotkey).\n"
|
||||||
|
"\n"
|
||||||
|
"You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
|
||||||
|
"unseen options into view.\n"
|
||||||
|
;
|
||||||
|
|
||||||
|
static char filename[PATH_MAX+1] = ".config";
|
||||||
|
static int indent = 0;
|
||||||
|
static struct termios ios_org;
|
||||||
|
static int rows, cols;
|
||||||
|
static struct menu *current_menu;
|
||||||
|
static int child_count;
|
||||||
|
static int single_menu_mode;
|
||||||
|
|
||||||
|
static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */
|
||||||
|
static int item_no;
|
||||||
|
|
||||||
|
static void conf(struct menu *menu);
|
||||||
|
static void conf_choice(struct menu *menu);
|
||||||
|
static void conf_string(struct menu *menu);
|
||||||
|
static void conf_load(void);
|
||||||
|
static void conf_save(void);
|
||||||
|
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_help(struct menu *menu);
|
||||||
|
static void show_readme(void);
|
||||||
|
|
||||||
|
static void init_wsize(void)
|
||||||
|
{
|
||||||
|
struct winsize ws;
|
||||||
|
char *env;
|
||||||
|
|
||||||
|
if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
|
||||||
|
rows = 24;
|
||||||
|
cols = 80;
|
||||||
|
} else {
|
||||||
|
rows = ws.ws_row;
|
||||||
|
cols = ws.ws_col;
|
||||||
|
if (!rows) {
|
||||||
|
env = getenv("LINES");
|
||||||
|
if (env)
|
||||||
|
rows = atoi(env);
|
||||||
|
if (!rows)
|
||||||
|
rows = 24;
|
||||||
|
}
|
||||||
|
if (!cols) {
|
||||||
|
env = getenv("COLUMNS");
|
||||||
|
if (env)
|
||||||
|
cols = atoi(env);
|
||||||
|
if (!cols)
|
||||||
|
cols = 80;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows < 19 || cols < 80) {
|
||||||
|
fprintf(stderr, "Your display is too small to run Menuconfig!\n");
|
||||||
|
fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
rows -= 4;
|
||||||
|
cols -= 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cinit(void)
|
||||||
|
{
|
||||||
|
item_no = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cmake(void)
|
||||||
|
{
|
||||||
|
items[item_no] = malloc(sizeof(struct dialog_list_item));
|
||||||
|
memset(items[item_no], 0, sizeof(struct dialog_list_item));
|
||||||
|
items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0;
|
||||||
|
items[item_no]->name = malloc(512); items[item_no]->name[0] = 0;
|
||||||
|
items[item_no]->namelen = 0;
|
||||||
|
item_no++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cprint_name(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!item_no)
|
||||||
|
cmake();
|
||||||
|
va_start(ap, fmt);
|
||||||
|
res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen,
|
||||||
|
512 - items[item_no - 1]->namelen, fmt, ap);
|
||||||
|
if (res > 0)
|
||||||
|
items[item_no - 1]->namelen += res;
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int cprint_tag(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if (!item_no)
|
||||||
|
cmake();
|
||||||
|
va_start(ap, fmt);
|
||||||
|
res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cdone(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
free(items[i]->tag);
|
||||||
|
free(items[i]->name);
|
||||||
|
free(items[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
item_no = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void build_conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct menu *child;
|
||||||
|
int type, tmp, doint = 2;
|
||||||
|
tristate val;
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
if (!menu_is_visible(menu))
|
||||||
|
return;
|
||||||
|
|
||||||
|
sym = menu->sym;
|
||||||
|
prop = menu->prompt;
|
||||||
|
if (!sym) {
|
||||||
|
if (prop && menu != current_menu) {
|
||||||
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_MENU:
|
||||||
|
child_count++;
|
||||||
|
cmake();
|
||||||
|
cprint_tag("m%p", menu);
|
||||||
|
|
||||||
|
if (single_menu_mode) {
|
||||||
|
cprint_name("%s%*c%s",
|
||||||
|
menu->data ? "-->" : "++>",
|
||||||
|
indent + 1, ' ', prompt);
|
||||||
|
} else {
|
||||||
|
cprint_name(" %*c%s --->", indent + 1, ' ', prompt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (single_menu_mode && menu->data)
|
||||||
|
goto conf_childs;
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
if (prompt) {
|
||||||
|
child_count++;
|
||||||
|
cmake();
|
||||||
|
cprint_tag(":%p", menu);
|
||||||
|
cprint_name("---%*c%s", indent + 1, ' ', prompt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
doint = 0;
|
||||||
|
goto conf_childs;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmake();
|
||||||
|
type = sym_get_type(sym);
|
||||||
|
if (sym_is_choice(sym)) {
|
||||||
|
struct symbol *def_sym = sym_get_choice_value(sym);
|
||||||
|
struct menu *def_menu = NULL;
|
||||||
|
|
||||||
|
child_count++;
|
||||||
|
for (child = menu->list; child; child = child->next) {
|
||||||
|
if (menu_is_visible(child) && child->sym == def_sym)
|
||||||
|
def_menu = child;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = sym_get_tristate_value(sym);
|
||||||
|
if (sym_is_changable(sym)) {
|
||||||
|
cprint_tag("t%p", menu);
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
cprint_name("[%c]", val == no ? ' ' : '*');
|
||||||
|
break;
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (val) {
|
||||||
|
case yes: ch = '*'; break;
|
||||||
|
case mod: ch = 'M'; break;
|
||||||
|
default: ch = ' '; break;
|
||||||
|
}
|
||||||
|
cprint_name("<%c>", ch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cprint_tag("%c%p", def_menu ? 't' : ':', menu);
|
||||||
|
cprint_name(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
|
||||||
|
if (val == yes) {
|
||||||
|
if (def_menu) {
|
||||||
|
cprint_name(" (%s)", menu_get_prompt(def_menu));
|
||||||
|
cprint_name(" --->");
|
||||||
|
if (def_menu->list) {
|
||||||
|
indent += 2;
|
||||||
|
build_conf(def_menu);
|
||||||
|
indent -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
child_count++;
|
||||||
|
val = sym_get_tristate_value(sym);
|
||||||
|
if (sym_is_choice_value(sym) && val == yes) {
|
||||||
|
cprint_tag(":%p", menu);
|
||||||
|
cprint_name(" ");
|
||||||
|
} else {
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
cprint_tag("t%p", menu);
|
||||||
|
if (sym_is_changable(sym))
|
||||||
|
cprint_name("[%c]", val == no ? ' ' : '*');
|
||||||
|
else
|
||||||
|
cprint_name("---");
|
||||||
|
break;
|
||||||
|
case S_TRISTATE:
|
||||||
|
cprint_tag("t%p", menu);
|
||||||
|
switch (val) {
|
||||||
|
case yes: ch = '*'; break;
|
||||||
|
case mod: ch = 'M'; break;
|
||||||
|
default: ch = ' '; break;
|
||||||
|
}
|
||||||
|
if (sym_is_changable(sym))
|
||||||
|
cprint_name("<%c>", ch);
|
||||||
|
else
|
||||||
|
cprint_name("---");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
cprint_tag("s%p", menu);
|
||||||
|
tmp = cprint_name("(%s)", sym_get_string_value(sym));
|
||||||
|
tmp = indent - tmp + 4;
|
||||||
|
if (tmp < 0)
|
||||||
|
tmp = 0;
|
||||||
|
cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
|
||||||
|
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
||||||
|
"" : " (NEW)");
|
||||||
|
goto conf_childs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
|
||||||
|
(sym_has_value(sym) || !sym_is_changable(sym)) ?
|
||||||
|
"" : " (NEW)");
|
||||||
|
if (menu->prompt->type == P_MENU) {
|
||||||
|
cprint_name(" --->");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conf_childs:
|
||||||
|
indent += doint;
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
build_conf(child);
|
||||||
|
indent -= doint;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct dialog_list_item *active_item = NULL;
|
||||||
|
struct menu *submenu;
|
||||||
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
struct symbol *sym;
|
||||||
|
char active_entry[40];
|
||||||
|
int stat, type;
|
||||||
|
|
||||||
|
unlink("lxdialog.scrltmp");
|
||||||
|
active_entry[0] = 0;
|
||||||
|
while (1) {
|
||||||
|
indent = 0;
|
||||||
|
child_count = 0;
|
||||||
|
current_menu = menu;
|
||||||
|
cdone(); cinit();
|
||||||
|
build_conf(menu);
|
||||||
|
if (!child_count)
|
||||||
|
break;
|
||||||
|
if (menu == &rootmenu) {
|
||||||
|
cmake(); cprint_tag(":"); cprint_name("--- ");
|
||||||
|
cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File");
|
||||||
|
cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File");
|
||||||
|
}
|
||||||
|
dialog_clear();
|
||||||
|
stat = dialog_menu(prompt ? prompt : "Main Menu",
|
||||||
|
menu_instructions, rows, cols, rows - 10,
|
||||||
|
active_entry, item_no, items);
|
||||||
|
if (stat < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (stat == 1 || stat == 255)
|
||||||
|
break;
|
||||||
|
|
||||||
|
active_item = first_sel_item(item_no, items);
|
||||||
|
if (!active_item)
|
||||||
|
continue;
|
||||||
|
active_item->selected = 0;
|
||||||
|
strncpy(active_entry, active_item->tag, sizeof(active_entry));
|
||||||
|
active_entry[sizeof(active_entry)-1] = 0;
|
||||||
|
type = active_entry[0];
|
||||||
|
if (!type)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sym = NULL;
|
||||||
|
submenu = NULL;
|
||||||
|
if (sscanf(active_entry + 1, "%p", &submenu) == 1)
|
||||||
|
sym = submenu->sym;
|
||||||
|
|
||||||
|
switch (stat) {
|
||||||
|
case 0:
|
||||||
|
switch (type) {
|
||||||
|
case 'm':
|
||||||
|
if (single_menu_mode)
|
||||||
|
submenu->data = (void *) (long) !submenu->data;
|
||||||
|
else
|
||||||
|
conf(submenu);
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
|
||||||
|
conf_choice(submenu);
|
||||||
|
else if (submenu->prompt->type == P_MENU)
|
||||||
|
conf(submenu);
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
conf_string(submenu);
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
conf_load();
|
||||||
|
break;
|
||||||
|
case 'S':
|
||||||
|
conf_save();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (sym)
|
||||||
|
show_help(submenu);
|
||||||
|
else
|
||||||
|
show_readme();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (type == 't') {
|
||||||
|
if (sym_set_tristate_value(sym, yes))
|
||||||
|
break;
|
||||||
|
if (sym_set_tristate_value(sym, mod))
|
||||||
|
show_textbox(NULL, setmod_text, 6, 74);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (type == 't')
|
||||||
|
sym_set_tristate_value(sym, no);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (type == 't')
|
||||||
|
sym_set_tristate_value(sym, mod);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if (type == 't')
|
||||||
|
sym_toggle_tristate_value(sym);
|
||||||
|
else if (type == 'm')
|
||||||
|
conf(submenu);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_textbox(const char *title, const char *text, int r, int c)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = creat(".help.tmp", 0777);
|
||||||
|
write(fd, text, strlen(text));
|
||||||
|
close(fd);
|
||||||
|
while (dialog_textbox(title, ".help.tmp", r, c) < 0)
|
||||||
|
;
|
||||||
|
unlink(".help.tmp");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_helptext(const char *title, const char *text)
|
||||||
|
{
|
||||||
|
show_textbox(title, text, rows, cols);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_help(struct menu *menu)
|
||||||
|
{
|
||||||
|
const char *help;
|
||||||
|
char *helptext;
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
|
||||||
|
help = sym->help;
|
||||||
|
if (!help)
|
||||||
|
help = nohelp_text;
|
||||||
|
if (sym->name) {
|
||||||
|
helptext = malloc(strlen(sym->name) + strlen(help) + 16);
|
||||||
|
sprintf(helptext, "%s:\n\n%s", sym->name, help);
|
||||||
|
show_helptext(menu_get_prompt(menu), helptext);
|
||||||
|
free(helptext);
|
||||||
|
} else
|
||||||
|
show_helptext(menu_get_prompt(menu), help);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void show_readme(void)
|
||||||
|
{
|
||||||
|
show_helptext("Help", top_menu_help);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_choice(struct menu *menu)
|
||||||
|
{
|
||||||
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
struct menu *child;
|
||||||
|
struct symbol *active;
|
||||||
|
|
||||||
|
active = sym_get_choice_value(menu->sym);
|
||||||
|
while (1) {
|
||||||
|
current_menu = menu;
|
||||||
|
cdone(); cinit();
|
||||||
|
for (child = menu->list; child; child = child->next) {
|
||||||
|
if (!menu_is_visible(child))
|
||||||
|
continue;
|
||||||
|
cmake();
|
||||||
|
cprint_tag("%p", child);
|
||||||
|
cprint_name("%s", menu_get_prompt(child));
|
||||||
|
if (child->sym == sym_get_choice_value(menu->sym))
|
||||||
|
items[item_no - 1]->selected = 1; /* ON */
|
||||||
|
else if (child->sym == active)
|
||||||
|
items[item_no - 1]->selected = 2; /* SELECTED */
|
||||||
|
else
|
||||||
|
items[item_no - 1]->selected = 0; /* OFF */
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dialog_checklist(prompt ? prompt : "Main Menu",
|
||||||
|
radiolist_instructions, 15, 70, 6,
|
||||||
|
item_no, items, FLAG_RADIO)) {
|
||||||
|
case 0:
|
||||||
|
if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1)
|
||||||
|
break;
|
||||||
|
sym_set_tristate_value(child->sym, yes);
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) {
|
||||||
|
show_help(child);
|
||||||
|
active = child->sym;
|
||||||
|
} else
|
||||||
|
show_help(menu);
|
||||||
|
break;
|
||||||
|
case 255:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_string(struct menu *menu)
|
||||||
|
{
|
||||||
|
const char *prompt = menu_get_prompt(menu);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
char *heading;
|
||||||
|
|
||||||
|
switch (sym_get_type(menu->sym)) {
|
||||||
|
case S_INT:
|
||||||
|
heading = (char *) inputbox_instructions_int;
|
||||||
|
break;
|
||||||
|
case S_HEX:
|
||||||
|
heading = (char *) inputbox_instructions_hex;
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
heading = (char *) inputbox_instructions_string;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
heading = "Internal mconf error!";
|
||||||
|
/* panic? */;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (dialog_inputbox(prompt ? prompt : "Main Menu",
|
||||||
|
heading, 10, 75,
|
||||||
|
sym_get_string_value(menu->sym))) {
|
||||||
|
case 0:
|
||||||
|
if (sym_set_string_value(menu->sym, dialog_input_result))
|
||||||
|
return;
|
||||||
|
show_textbox(NULL, "You have made an invalid entry.", 5, 43);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
show_help(menu);
|
||||||
|
break;
|
||||||
|
case 255:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_load(void)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
switch (dialog_inputbox(NULL, load_config_text, 11, 55,
|
||||||
|
filename)) {
|
||||||
|
case 0:
|
||||||
|
if (!dialog_input_result[0])
|
||||||
|
return;
|
||||||
|
if (!conf_read(dialog_input_result))
|
||||||
|
return;
|
||||||
|
show_textbox(NULL, "File does not exist!", 5, 38);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
show_helptext("Load Alternate Configuration", load_config_help);
|
||||||
|
break;
|
||||||
|
case 255:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_save(void)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
switch (dialog_inputbox(NULL, save_config_text, 11, 55,
|
||||||
|
filename)) {
|
||||||
|
case 0:
|
||||||
|
if (!dialog_input_result[0])
|
||||||
|
return;
|
||||||
|
if (!conf_write(dialog_input_result))
|
||||||
|
return;
|
||||||
|
show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
show_helptext("Save Alternate Configuration", save_config_help);
|
||||||
|
break;
|
||||||
|
case 255:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void conf_cleanup(void)
|
||||||
|
{
|
||||||
|
tcsetattr(1, TCSAFLUSH, &ios_org);
|
||||||
|
unlink(".help.tmp");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void winch_handler(int sig)
|
||||||
|
{
|
||||||
|
struct winsize ws;
|
||||||
|
|
||||||
|
if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
|
||||||
|
rows = 24;
|
||||||
|
cols = 80;
|
||||||
|
} else {
|
||||||
|
rows = ws.ws_row;
|
||||||
|
cols = ws.ws_col;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rows < 19 || cols < 80) {
|
||||||
|
end_dialog();
|
||||||
|
fprintf(stderr, "Your display is too small to run Menuconfig!\n");
|
||||||
|
fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
rows -= 4;
|
||||||
|
cols -= 5;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int ac, char **av)
|
||||||
|
{
|
||||||
|
int stat;
|
||||||
|
char *mode;
|
||||||
|
struct symbol *sym;
|
||||||
|
|
||||||
|
conf_parse(av[1]);
|
||||||
|
conf_read(NULL);
|
||||||
|
|
||||||
|
sym = sym_lookup("VERSION", 0);
|
||||||
|
sym_calc_value(sym);
|
||||||
|
snprintf(menu_backtitle, 128, "Buildroot v%s Configuration",
|
||||||
|
sym_get_string_value(sym));
|
||||||
|
|
||||||
|
mode = getenv("MENUCONFIG_MODE");
|
||||||
|
if (mode) {
|
||||||
|
if (!strcasecmp(mode, "single_menu"))
|
||||||
|
single_menu_mode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tcgetattr(1, &ios_org);
|
||||||
|
atexit(conf_cleanup);
|
||||||
|
init_wsize();
|
||||||
|
init_dialog();
|
||||||
|
signal(SIGWINCH, winch_handler);
|
||||||
|
conf(&rootmenu);
|
||||||
|
end_dialog();
|
||||||
|
|
||||||
|
/* Restart dialog to act more like when lxdialog was still separate */
|
||||||
|
init_dialog();
|
||||||
|
do {
|
||||||
|
stat = dialog_yesno(NULL,
|
||||||
|
"Do you wish to save your new Buildroot configuration?", 5, 60);
|
||||||
|
} while (stat < 0);
|
||||||
|
end_dialog();
|
||||||
|
|
||||||
|
if (stat == 0) {
|
||||||
|
conf_write(NULL);
|
||||||
|
printf("\n\n"
|
||||||
|
"*** End of Buildroot configuration.\n"
|
||||||
|
"*** Check the top-level Makefile for additional configuration options.\n\n");
|
||||||
|
} else
|
||||||
|
printf("\n\nYour Buildroot configuration changes were NOT saved.\n\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
431
package/config/menu.c
Normal file
431
package/config/menu.c
Normal file
@ -0,0 +1,431 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
struct menu rootmenu;
|
||||||
|
struct menu *current_menu, *current_entry;
|
||||||
|
static struct menu **last_entry_ptr;
|
||||||
|
|
||||||
|
struct file *file_list;
|
||||||
|
struct file *current_file;
|
||||||
|
|
||||||
|
static void menu_warn(struct menu *menu, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void prop_warn(struct property *prop, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_init(void)
|
||||||
|
{
|
||||||
|
current_entry = current_menu = &rootmenu;
|
||||||
|
last_entry_ptr = &rootmenu.list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_entry(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct menu *menu;
|
||||||
|
|
||||||
|
menu = malloc(sizeof(*menu));
|
||||||
|
memset(menu, 0, sizeof(*menu));
|
||||||
|
menu->sym = sym;
|
||||||
|
menu->parent = current_menu;
|
||||||
|
menu->file = current_file;
|
||||||
|
menu->lineno = zconf_lineno();
|
||||||
|
|
||||||
|
*last_entry_ptr = menu;
|
||||||
|
last_entry_ptr = &menu->next;
|
||||||
|
current_entry = menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_end_entry(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_menu(void)
|
||||||
|
{
|
||||||
|
current_menu = current_entry;
|
||||||
|
last_entry_ptr = ¤t_entry->list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_end_menu(void)
|
||||||
|
{
|
||||||
|
last_entry_ptr = ¤t_menu->next;
|
||||||
|
current_menu = current_menu->parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *menu_check_dep(struct expr *e)
|
||||||
|
{
|
||||||
|
if (!e)
|
||||||
|
return e;
|
||||||
|
|
||||||
|
switch (e->type) {
|
||||||
|
case E_NOT:
|
||||||
|
e->left.expr = menu_check_dep(e->left.expr);
|
||||||
|
break;
|
||||||
|
case E_OR:
|
||||||
|
case E_AND:
|
||||||
|
e->left.expr = menu_check_dep(e->left.expr);
|
||||||
|
e->right.expr = menu_check_dep(e->right.expr);
|
||||||
|
break;
|
||||||
|
case E_SYMBOL:
|
||||||
|
/* change 'm' into 'm' && MODULES */
|
||||||
|
if (e->left.sym == &symbol_mod)
|
||||||
|
return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_dep(struct expr *dep)
|
||||||
|
{
|
||||||
|
current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_set_type(int type)
|
||||||
|
{
|
||||||
|
struct symbol *sym = current_entry->sym;
|
||||||
|
|
||||||
|
if (sym->type == type)
|
||||||
|
return;
|
||||||
|
if (sym->type == S_UNKNOWN) {
|
||||||
|
sym->type = type;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
|
||||||
|
sym->name ? sym->name : "<choice>",
|
||||||
|
sym_type_name(sym->type), sym_type_name(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
|
||||||
|
{
|
||||||
|
struct property *prop = prop_alloc(type, current_entry->sym);
|
||||||
|
|
||||||
|
prop->menu = current_entry;
|
||||||
|
prop->text = prompt;
|
||||||
|
prop->expr = expr;
|
||||||
|
prop->visible.expr = menu_check_dep(dep);
|
||||||
|
|
||||||
|
if (prompt) {
|
||||||
|
if (current_entry->prompt)
|
||||||
|
menu_warn(current_entry, "prompt redefined\n");
|
||||||
|
current_entry->prompt = prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
|
||||||
|
{
|
||||||
|
menu_add_prop(type, prompt, NULL, dep);
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
|
||||||
|
{
|
||||||
|
menu_add_prop(type, NULL, expr, dep);
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
|
||||||
|
{
|
||||||
|
menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_check_prop(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym2;
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_DEFAULT:
|
||||||
|
if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
|
||||||
|
prop->expr->type != E_SYMBOL)
|
||||||
|
prop_warn(prop,
|
||||||
|
"default for config symbol '%'"
|
||||||
|
" must be a single symbol", sym->name);
|
||||||
|
break;
|
||||||
|
case P_SELECT:
|
||||||
|
sym2 = prop_get_symbol(prop);
|
||||||
|
if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
|
||||||
|
prop_warn(prop,
|
||||||
|
"config symbol '%s' uses select, but is "
|
||||||
|
"not boolean or tristate", sym->name);
|
||||||
|
else if (sym2->type == S_UNKNOWN)
|
||||||
|
prop_warn(prop,
|
||||||
|
"'select' used by config symbol '%s' "
|
||||||
|
"refer to undefined symbol '%s'",
|
||||||
|
sym->name, sym2->name);
|
||||||
|
else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
|
||||||
|
prop_warn(prop,
|
||||||
|
"'%s' has wrong type. 'select' only "
|
||||||
|
"accept arguments of boolean and "
|
||||||
|
"tristate type", sym2->name);
|
||||||
|
break;
|
||||||
|
case P_RANGE:
|
||||||
|
if (sym->type != S_INT && sym->type != S_HEX)
|
||||||
|
prop_warn(prop, "range is only allowed "
|
||||||
|
"for int or hex symbols");
|
||||||
|
if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
|
||||||
|
!sym_string_valid(sym, prop->expr->right.sym->name))
|
||||||
|
prop_warn(prop, "range is invalid");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_finalize(struct menu *parent)
|
||||||
|
{
|
||||||
|
struct menu *menu, *last_menu;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *parentdep, *basedep, *dep, *dep2, **ep;
|
||||||
|
|
||||||
|
sym = parent->sym;
|
||||||
|
if (parent->list) {
|
||||||
|
if (sym && sym_is_choice(sym)) {
|
||||||
|
/* find the first choice value and find out choice type */
|
||||||
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
|
if (menu->sym) {
|
||||||
|
current_entry = parent;
|
||||||
|
menu_set_type(menu->sym->type);
|
||||||
|
current_entry = menu;
|
||||||
|
menu_set_type(sym->type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parentdep = expr_alloc_symbol(sym);
|
||||||
|
} else if (parent->prompt)
|
||||||
|
parentdep = parent->prompt->visible.expr;
|
||||||
|
else
|
||||||
|
parentdep = parent->dep;
|
||||||
|
|
||||||
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
|
basedep = expr_transform(menu->dep);
|
||||||
|
basedep = expr_alloc_and(expr_copy(parentdep), basedep);
|
||||||
|
basedep = expr_eliminate_dups(basedep);
|
||||||
|
menu->dep = basedep;
|
||||||
|
if (menu->sym)
|
||||||
|
prop = menu->sym->prop;
|
||||||
|
else
|
||||||
|
prop = menu->prompt;
|
||||||
|
for (; prop; prop = prop->next) {
|
||||||
|
if (prop->menu != menu)
|
||||||
|
continue;
|
||||||
|
dep = expr_transform(prop->visible.expr);
|
||||||
|
dep = expr_alloc_and(expr_copy(basedep), dep);
|
||||||
|
dep = expr_eliminate_dups(dep);
|
||||||
|
if (menu->sym && menu->sym->type != S_TRISTATE)
|
||||||
|
dep = expr_trans_bool(dep);
|
||||||
|
prop->visible.expr = dep;
|
||||||
|
if (prop->type == P_SELECT) {
|
||||||
|
struct symbol *es = prop_get_symbol(prop);
|
||||||
|
es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
|
||||||
|
expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (menu = parent->list; menu; menu = menu->next)
|
||||||
|
menu_finalize(menu);
|
||||||
|
} else if (sym) {
|
||||||
|
basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
|
||||||
|
basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
|
||||||
|
basedep = expr_eliminate_dups(expr_transform(basedep));
|
||||||
|
last_menu = NULL;
|
||||||
|
for (menu = parent->next; menu; menu = menu->next) {
|
||||||
|
dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
|
||||||
|
if (!expr_contains_symbol(dep, sym))
|
||||||
|
break;
|
||||||
|
if (expr_depends_symbol(dep, sym))
|
||||||
|
goto next;
|
||||||
|
dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
|
||||||
|
dep = expr_eliminate_dups(expr_transform(dep));
|
||||||
|
dep2 = expr_copy(basedep);
|
||||||
|
expr_eliminate_eq(&dep, &dep2);
|
||||||
|
expr_free(dep);
|
||||||
|
if (!expr_is_yes(dep2)) {
|
||||||
|
expr_free(dep2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
expr_free(dep2);
|
||||||
|
next:
|
||||||
|
menu_finalize(menu);
|
||||||
|
menu->parent = parent;
|
||||||
|
last_menu = menu;
|
||||||
|
}
|
||||||
|
if (last_menu) {
|
||||||
|
parent->list = parent->next;
|
||||||
|
parent->next = last_menu->next;
|
||||||
|
last_menu->next = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (menu = parent->list; menu; menu = menu->next) {
|
||||||
|
if (sym && sym_is_choice(sym) && menu->sym) {
|
||||||
|
menu->sym->flags |= SYMBOL_CHOICEVAL;
|
||||||
|
if (!menu->prompt)
|
||||||
|
menu_warn(menu, "choice value must have a prompt");
|
||||||
|
for (prop = menu->sym->prop; prop; prop = prop->next) {
|
||||||
|
if (prop->type == P_PROMPT && prop->menu != menu) {
|
||||||
|
prop_warn(prop, "choice values "
|
||||||
|
"currently only support a "
|
||||||
|
"single prompt");
|
||||||
|
}
|
||||||
|
if (prop->type == P_DEFAULT)
|
||||||
|
prop_warn(prop, "defaults for choice "
|
||||||
|
"values not supported");
|
||||||
|
}
|
||||||
|
current_entry = menu;
|
||||||
|
menu_set_type(sym->type);
|
||||||
|
menu_add_symbol(P_CHOICE, sym, NULL);
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
|
||||||
|
;
|
||||||
|
*ep = expr_alloc_one(E_CHOICE, NULL);
|
||||||
|
(*ep)->right.sym = menu->sym;
|
||||||
|
}
|
||||||
|
if (menu->list && (!menu->prompt || !menu->prompt->text)) {
|
||||||
|
for (last_menu = menu->list; ; last_menu = last_menu->next) {
|
||||||
|
last_menu->parent = parent;
|
||||||
|
if (!last_menu->next)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
last_menu->next = menu->next;
|
||||||
|
menu->next = menu->list;
|
||||||
|
menu->list = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sym && !(sym->flags & SYMBOL_WARNED)) {
|
||||||
|
if (sym->type == S_UNKNOWN)
|
||||||
|
menu_warn(parent, "config symbol defined "
|
||||||
|
"without type\n");
|
||||||
|
|
||||||
|
if (sym_is_choice(sym) && !parent->prompt)
|
||||||
|
menu_warn(parent, "choice must have a prompt\n");
|
||||||
|
|
||||||
|
/* Check properties connected to this symbol */
|
||||||
|
sym_check_prop(sym);
|
||||||
|
sym->flags |= SYMBOL_WARNED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sym && !sym_is_optional(sym) && parent->prompt) {
|
||||||
|
sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
|
||||||
|
expr_alloc_and(parent->prompt->visible.expr,
|
||||||
|
expr_alloc_symbol(&symbol_mod)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool menu_is_visible(struct menu *menu)
|
||||||
|
{
|
||||||
|
struct menu *child;
|
||||||
|
struct symbol *sym;
|
||||||
|
tristate visible;
|
||||||
|
|
||||||
|
if (!menu->prompt)
|
||||||
|
return false;
|
||||||
|
sym = menu->sym;
|
||||||
|
if (sym) {
|
||||||
|
sym_calc_value(sym);
|
||||||
|
visible = menu->prompt->visible.tri;
|
||||||
|
} else
|
||||||
|
visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
|
||||||
|
|
||||||
|
if (visible != no)
|
||||||
|
return true;
|
||||||
|
if (!sym || sym_get_tristate_value(menu->sym) == no)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (child = menu->list; child; child = child->next)
|
||||||
|
if (menu_is_visible(child))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *menu_get_prompt(struct menu *menu)
|
||||||
|
{
|
||||||
|
if (menu->prompt)
|
||||||
|
return menu->prompt->text;
|
||||||
|
else if (menu->sym)
|
||||||
|
return menu->sym->name;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct menu *menu_get_root_menu(struct menu *menu)
|
||||||
|
{
|
||||||
|
return &rootmenu;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct menu *menu_get_parent_menu(struct menu *menu)
|
||||||
|
{
|
||||||
|
enum prop_type type;
|
||||||
|
|
||||||
|
for (; menu != &rootmenu; menu = menu->parent) {
|
||||||
|
type = menu->prompt ? menu->prompt->type : 0;
|
||||||
|
if (type == P_MENU)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct file *file_lookup(const char *name)
|
||||||
|
{
|
||||||
|
struct file *file;
|
||||||
|
|
||||||
|
for (file = file_list; file; file = file->next) {
|
||||||
|
if (!strcmp(name, file->name))
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = malloc(sizeof(*file));
|
||||||
|
memset(file, 0, sizeof(*file));
|
||||||
|
file->name = strdup(name);
|
||||||
|
file->next = file_list;
|
||||||
|
file_list = file;
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
int file_write_dep(const char *name)
|
||||||
|
{
|
||||||
|
struct file *file;
|
||||||
|
FILE *out;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
name = ".config.cmd";
|
||||||
|
out = fopen(".config.tmp", "w");
|
||||||
|
if (!out)
|
||||||
|
return 1;
|
||||||
|
fprintf(out, "deps_config := \\\n");
|
||||||
|
for (file = file_list; file; file = file->next) {
|
||||||
|
if (file->next)
|
||||||
|
fprintf(out, "\t%s \\\n", file->name);
|
||||||
|
else
|
||||||
|
fprintf(out, "\t%s\n", file->name);
|
||||||
|
}
|
||||||
|
fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
|
||||||
|
fclose(out);
|
||||||
|
rename(".config.tmp", name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
436
package/config/menubox.c
Normal file
436
package/config/menubox.c
Normal file
@ -0,0 +1,436 @@
|
|||||||
|
/*
|
||||||
|
* menubox.c -- implements the menu box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Changes by Clifford Wolf (god@clifford.at)
|
||||||
|
*
|
||||||
|
* [ 1998-06-13 ]
|
||||||
|
*
|
||||||
|
* *) A bugfix for the Page-Down problem
|
||||||
|
*
|
||||||
|
* *) Formerly when I used Page Down and Page Up, the cursor would be set
|
||||||
|
* to the first position in the menu box. Now lxdialog is a bit
|
||||||
|
* smarter and works more like other menu systems (just have a look at
|
||||||
|
* it).
|
||||||
|
*
|
||||||
|
* *) Formerly if I selected something my scrolling would be broken because
|
||||||
|
* lxdialog is re-invoked by the Menuconfig shell script, can't
|
||||||
|
* remember the last scrolling position, and just sets it so that the
|
||||||
|
* cursor is at the bottom of the box. Now it writes the temporary file
|
||||||
|
* lxdialog.scrltmp which contains this information. The file is
|
||||||
|
* deleted by lxdialog if the user leaves a submenu or enters a new
|
||||||
|
* one, but it would be nice if Menuconfig could make another "rm -f"
|
||||||
|
* just to be sure. Just try it out - you will recognise a difference!
|
||||||
|
*
|
||||||
|
* [ 1998-06-14 ]
|
||||||
|
*
|
||||||
|
* *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
|
||||||
|
* and menus change their size on the fly.
|
||||||
|
*
|
||||||
|
* *) If for some reason the last scrolling position is not saved by
|
||||||
|
* lxdialog, it sets the scrolling so that the selected item is in the
|
||||||
|
* middle of the menu box, not at the bottom.
|
||||||
|
*
|
||||||
|
* 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
|
||||||
|
* Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
|
||||||
|
* This fixes a bug in Menuconfig where using ' ' to descend into menus
|
||||||
|
* would leave mis-synchronized lxdialog.scrltmp files lying around,
|
||||||
|
* fscanf would read in 'scroll', and eventually that value would get used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
static int menu_width, item_x;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print menu item
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
char menu_item[menu_width+1];
|
||||||
|
|
||||||
|
strncpy(menu_item, item, menu_width);
|
||||||
|
menu_item[menu_width] = 0;
|
||||||
|
j = first_alpha(menu_item, "YyNnMm");
|
||||||
|
|
||||||
|
/* Clear 'residue' of last item */
|
||||||
|
wattrset (win, menubox_attr);
|
||||||
|
wmove (win, choice, 0);
|
||||||
|
#if OLD_NCURSES
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < menu_width; i++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
wclrtoeol(win);
|
||||||
|
#endif
|
||||||
|
wattrset (win, selected ? item_selected_attr : item_attr);
|
||||||
|
mvwaddstr (win, choice, item_x, menu_item);
|
||||||
|
if (hotkey) {
|
||||||
|
wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
|
||||||
|
mvwaddch(win, choice, item_x+j, menu_item[j]);
|
||||||
|
}
|
||||||
|
if (selected) {
|
||||||
|
wmove (win, choice, item_x+1);
|
||||||
|
wrefresh (win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print the scroll indicators.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_arrows (WINDOW * win, int item_no, int scroll,
|
||||||
|
int y, int x, int height)
|
||||||
|
{
|
||||||
|
int cur_y, cur_x;
|
||||||
|
|
||||||
|
getyx(win, cur_y, cur_x);
|
||||||
|
|
||||||
|
wmove(win, y, x);
|
||||||
|
|
||||||
|
if (scroll > 0) {
|
||||||
|
wattrset (win, uarrow_attr);
|
||||||
|
waddch (win, ACS_UARROW);
|
||||||
|
waddstr (win, "(-)");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wattrset (win, menubox_attr);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
y = y + height + 1;
|
||||||
|
wmove(win, y, x);
|
||||||
|
|
||||||
|
if ((height < item_no) && (scroll + height < item_no)) {
|
||||||
|
wattrset (win, darrow_attr);
|
||||||
|
waddch (win, ACS_DARROW);
|
||||||
|
waddstr (win, "(+)");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
wattrset (win, menubox_border_attr);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
waddch (win, ACS_HLINE);
|
||||||
|
}
|
||||||
|
|
||||||
|
wmove(win, cur_y, cur_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display the termination buttons.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_buttons (WINDOW *win, int height, int width, int selected)
|
||||||
|
{
|
||||||
|
int x = width / 2 - 16;
|
||||||
|
int y = height - 2;
|
||||||
|
|
||||||
|
print_button (win, "Select", y, x, selected == 0);
|
||||||
|
print_button (win, " Exit ", y, x + 12, selected == 1);
|
||||||
|
print_button (win, " Help ", y, x + 24, selected == 2);
|
||||||
|
|
||||||
|
wmove(win, y, x+1+12*selected);
|
||||||
|
wrefresh (win);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a menu for choosing among a number of options
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||||
|
int menu_height, const char *current, int item_no,
|
||||||
|
struct dialog_list_item ** items)
|
||||||
|
{
|
||||||
|
int i, j, x, y, box_x, box_y;
|
||||||
|
int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
|
||||||
|
WINDOW *dialog, *menu;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
max_choice = MIN (menu_height, item_no);
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
wbkgdset (dialog, dialog_attr & A_COLOR);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||||
|
|
||||||
|
menu_width = width - 6;
|
||||||
|
box_y = height - menu_height - 5;
|
||||||
|
box_x = (width - menu_width) / 2 - 1;
|
||||||
|
|
||||||
|
/* create new window for the menu */
|
||||||
|
menu = subwin (dialog, menu_height, menu_width,
|
||||||
|
y + box_y + 1, x + box_x + 1);
|
||||||
|
keypad (menu, TRUE);
|
||||||
|
|
||||||
|
/* draw a box around the menu items */
|
||||||
|
draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
|
||||||
|
menubox_border_attr, menubox_attr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find length of longest item in order to center menu.
|
||||||
|
* Set 'choice' to default item.
|
||||||
|
*/
|
||||||
|
item_x = 0;
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2));
|
||||||
|
if (strcmp(current, items[i]->tag) == 0) choice = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
item_x = (menu_width - item_x) / 2;
|
||||||
|
|
||||||
|
/* get the scroll info from the temp file */
|
||||||
|
if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
|
||||||
|
if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
|
||||||
|
(scroll+max_choice > choice) && (scroll >= 0) &&
|
||||||
|
(scroll+max_choice <= item_no) ) {
|
||||||
|
first_item = scroll;
|
||||||
|
choice = choice - scroll;
|
||||||
|
fclose(f);
|
||||||
|
} else {
|
||||||
|
scroll=0;
|
||||||
|
remove("lxdialog.scrltmp");
|
||||||
|
fclose(f);
|
||||||
|
f=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
|
||||||
|
if (choice >= item_no-max_choice/2)
|
||||||
|
scroll = first_item = item_no-max_choice;
|
||||||
|
else
|
||||||
|
scroll = first_item = choice - max_choice/2;
|
||||||
|
choice = choice - scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print the menu */
|
||||||
|
for (i=0; i < max_choice; i++) {
|
||||||
|
print_item (menu, items[first_item + i]->name, i, i == choice,
|
||||||
|
(items[first_item + i]->tag[0] != ':'));
|
||||||
|
}
|
||||||
|
|
||||||
|
wnoutrefresh (menu);
|
||||||
|
|
||||||
|
print_arrows(dialog, item_no, scroll,
|
||||||
|
box_y, box_x+item_x+1, menu_height);
|
||||||
|
|
||||||
|
print_buttons (dialog, height, width, 0);
|
||||||
|
wmove (menu, choice, item_x+1);
|
||||||
|
wrefresh (menu);
|
||||||
|
|
||||||
|
while (key != ESC) {
|
||||||
|
key = wgetch(menu);
|
||||||
|
|
||||||
|
if (key < 256 && isalpha(key)) key = tolower(key);
|
||||||
|
|
||||||
|
if (strchr("ynm", key))
|
||||||
|
i = max_choice;
|
||||||
|
else {
|
||||||
|
for (i = choice+1; i < max_choice; i++) {
|
||||||
|
j = first_alpha(items[scroll + i]->name, "YyNnMm>");
|
||||||
|
if (key == tolower(items[scroll + i]->name[j]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i == max_choice)
|
||||||
|
for (i = 0; i < max_choice; i++) {
|
||||||
|
j = first_alpha(items[scroll + i]->name, "YyNnMm>");
|
||||||
|
if (key == tolower(items[scroll + i]->name[j]))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < max_choice ||
|
||||||
|
key == KEY_UP || key == KEY_DOWN ||
|
||||||
|
key == '-' || key == '+' ||
|
||||||
|
key == KEY_PPAGE || key == KEY_NPAGE) {
|
||||||
|
|
||||||
|
print_item (menu, items[scroll + choice]->name, choice, FALSE,
|
||||||
|
(items[scroll + choice]->tag[0] != ':'));
|
||||||
|
|
||||||
|
if (key == KEY_UP || key == '-') {
|
||||||
|
if (choice < 2 && scroll) {
|
||||||
|
/* Scroll menu down */
|
||||||
|
scrollok (menu, TRUE);
|
||||||
|
wscrl (menu, -1);
|
||||||
|
scrollok (menu, FALSE);
|
||||||
|
|
||||||
|
scroll--;
|
||||||
|
|
||||||
|
print_item (menu, items[scroll]->name, 0, FALSE,
|
||||||
|
(items[scroll]->tag[0] != ':'));
|
||||||
|
} else
|
||||||
|
choice = MAX(choice - 1, 0);
|
||||||
|
|
||||||
|
} else if (key == KEY_DOWN || key == '+') {
|
||||||
|
|
||||||
|
print_item (menu, items[scroll + choice]->name, choice, FALSE,
|
||||||
|
(items[scroll + choice]->tag[0] != ':'));
|
||||||
|
|
||||||
|
if ((choice > max_choice-3) &&
|
||||||
|
(scroll + max_choice < item_no)
|
||||||
|
) {
|
||||||
|
/* Scroll menu up */
|
||||||
|
scrollok (menu, TRUE);
|
||||||
|
scroll (menu);
|
||||||
|
scrollok (menu, FALSE);
|
||||||
|
|
||||||
|
scroll++;
|
||||||
|
|
||||||
|
print_item (menu, items[scroll + max_choice - 1]->name,
|
||||||
|
max_choice-1, FALSE,
|
||||||
|
(items[scroll + max_choice - 1]->tag[0] != ':'));
|
||||||
|
} else
|
||||||
|
choice = MIN(choice+1, max_choice-1);
|
||||||
|
|
||||||
|
} else if (key == KEY_PPAGE) {
|
||||||
|
scrollok (menu, TRUE);
|
||||||
|
for (i=0; (i < max_choice); i++) {
|
||||||
|
if (scroll > 0) {
|
||||||
|
wscrl (menu, -1);
|
||||||
|
scroll--;
|
||||||
|
print_item (menu, items[scroll]->name, 0, FALSE,
|
||||||
|
(items[scroll]->tag[0] != ':'));
|
||||||
|
} else {
|
||||||
|
if (choice > 0)
|
||||||
|
choice--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scrollok (menu, FALSE);
|
||||||
|
|
||||||
|
} else if (key == KEY_NPAGE) {
|
||||||
|
for (i=0; (i < max_choice); i++) {
|
||||||
|
if (scroll+max_choice < item_no) {
|
||||||
|
scrollok (menu, TRUE);
|
||||||
|
scroll(menu);
|
||||||
|
scrollok (menu, FALSE);
|
||||||
|
scroll++;
|
||||||
|
print_item (menu, items[scroll + max_choice - 1]->name,
|
||||||
|
max_choice-1, FALSE,
|
||||||
|
(items[scroll + max_choice - 1]->tag[0] != ':'));
|
||||||
|
} else {
|
||||||
|
if (choice+1 < max_choice)
|
||||||
|
choice++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else
|
||||||
|
choice = i;
|
||||||
|
|
||||||
|
print_item (menu, items[scroll + choice]->name, choice, TRUE,
|
||||||
|
(items[scroll + choice]->tag[0] != ':'));
|
||||||
|
|
||||||
|
print_arrows(dialog, item_no, scroll,
|
||||||
|
box_y, box_x+item_x+1, menu_height);
|
||||||
|
|
||||||
|
wnoutrefresh (dialog);
|
||||||
|
wrefresh (menu);
|
||||||
|
|
||||||
|
continue; /* wait for another key press */
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case KEY_LEFT:
|
||||||
|
case TAB:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||||
|
? 2 : (button > 2 ? 0 : button);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, button);
|
||||||
|
wrefresh (menu);
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case 's':
|
||||||
|
case 'y':
|
||||||
|
case 'n':
|
||||||
|
case 'm':
|
||||||
|
/* save scroll info */
|
||||||
|
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
|
||||||
|
fprintf(f,"%d\n",scroll);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
delwin (dialog);
|
||||||
|
items[scroll + choice]->selected = 1;
|
||||||
|
switch (key) {
|
||||||
|
case 's': return 3;
|
||||||
|
case 'y': return 3;
|
||||||
|
case 'n': return 4;
|
||||||
|
case 'm': return 5;
|
||||||
|
case ' ': return 6;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
button = 2;
|
||||||
|
case '\n':
|
||||||
|
delwin (dialog);
|
||||||
|
items[scroll + choice]->selected = 1;
|
||||||
|
|
||||||
|
remove("lxdialog.scrltmp");
|
||||||
|
return button;
|
||||||
|
case 'e':
|
||||||
|
case 'x':
|
||||||
|
key = ESC;
|
||||||
|
case ESC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
remove("lxdialog.scrltmp");
|
||||||
|
return -1; /* ESC pressed */
|
||||||
|
}
|
85
package/config/msgbox.c
Normal file
85
package/config/msgbox.c
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* msgbox.c -- implements the message box and info box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a message box. Program will pause and display an "OK" button
|
||||||
|
* if the parameter 'pause' is non-zero.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_msgbox (const char *title, const char *prompt, int height, int width,
|
||||||
|
int pause)
|
||||||
|
{
|
||||||
|
int i, x, y, key = 0;
|
||||||
|
WINDOW *dialog;
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
print_autowrap (dialog, prompt, width - 2, 1, 2);
|
||||||
|
|
||||||
|
if (pause) {
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height - 3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
print_button (dialog, " Ok ",
|
||||||
|
height - 2, width / 2 - 4, TRUE);
|
||||||
|
|
||||||
|
wrefresh (dialog);
|
||||||
|
while (key != ESC && key != '\n' && key != ' ' &&
|
||||||
|
key != 'O' && key != 'o' && key != 'X' && key != 'x')
|
||||||
|
key = wgetch (dialog);
|
||||||
|
} else {
|
||||||
|
key = '\n';
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
return key == ESC ? -1 : 0;
|
||||||
|
}
|
771
package/config/symbol.c
Normal file
771
package/config/symbol.c
Normal file
@ -0,0 +1,771 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
struct symbol symbol_yes = {
|
||||||
|
.name = "y",
|
||||||
|
.curr = { "y", yes },
|
||||||
|
.flags = SYMBOL_YES|SYMBOL_VALID,
|
||||||
|
}, symbol_mod = {
|
||||||
|
.name = "m",
|
||||||
|
.curr = { "m", mod },
|
||||||
|
.flags = SYMBOL_MOD|SYMBOL_VALID,
|
||||||
|
}, symbol_no = {
|
||||||
|
.name = "n",
|
||||||
|
.curr = { "n", no },
|
||||||
|
.flags = SYMBOL_NO|SYMBOL_VALID,
|
||||||
|
}, symbol_empty = {
|
||||||
|
.name = "",
|
||||||
|
.curr = { "", no },
|
||||||
|
.flags = SYMBOL_VALID,
|
||||||
|
};
|
||||||
|
|
||||||
|
int sym_change_count;
|
||||||
|
struct symbol *modules_sym;
|
||||||
|
tristate modules_val;
|
||||||
|
|
||||||
|
void sym_add_default(struct symbol *sym, const char *def)
|
||||||
|
{
|
||||||
|
struct property *prop = prop_alloc(P_DEFAULT, sym);
|
||||||
|
|
||||||
|
prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_init(void)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
char *p;
|
||||||
|
static bool inited = false;
|
||||||
|
|
||||||
|
if (inited)
|
||||||
|
return;
|
||||||
|
inited = true;
|
||||||
|
|
||||||
|
sym = sym_lookup("VERSION", 0);
|
||||||
|
sym->type = S_STRING;
|
||||||
|
sym->flags |= SYMBOL_AUTO;
|
||||||
|
p = getenv("VERSION");
|
||||||
|
if (p)
|
||||||
|
sym_add_default(sym, p);
|
||||||
|
|
||||||
|
sym = sym_lookup("TARGET_ARCH", 0);
|
||||||
|
sym->type = S_STRING;
|
||||||
|
sym->flags |= SYMBOL_AUTO;
|
||||||
|
p = getenv("TARGET_ARCH");
|
||||||
|
if (p)
|
||||||
|
sym_add_default(sym, p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
enum symbol_type sym_get_type(struct symbol *sym)
|
||||||
|
{
|
||||||
|
enum symbol_type type = sym->type;
|
||||||
|
|
||||||
|
if (type == S_TRISTATE) {
|
||||||
|
if (sym_is_choice_value(sym) && sym->visible == yes)
|
||||||
|
type = S_BOOLEAN;
|
||||||
|
else if (modules_val == no)
|
||||||
|
type = S_BOOLEAN;
|
||||||
|
}
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *sym_type_name(enum symbol_type type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
return "boolean";
|
||||||
|
case S_TRISTATE:
|
||||||
|
return "tristate";
|
||||||
|
case S_INT:
|
||||||
|
return "integer";
|
||||||
|
case S_HEX:
|
||||||
|
return "hex";
|
||||||
|
case S_STRING:
|
||||||
|
return "string";
|
||||||
|
case S_UNKNOWN:
|
||||||
|
return "unknown";
|
||||||
|
case S_OTHER:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
|
||||||
|
struct property *sym_get_choice_prop(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
for_all_choices(sym, prop)
|
||||||
|
return prop;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct property *sym_get_default_prop(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
for_all_defaults(sym, prop) {
|
||||||
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
|
if (prop->visible.tri != no)
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct property *sym_get_range_prop(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
for_all_properties(sym, prop, P_RANGE) {
|
||||||
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
|
if (prop->visible.tri != no)
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sym_calc_visibility(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
tristate tri;
|
||||||
|
|
||||||
|
/* any prompt visible? */
|
||||||
|
tri = no;
|
||||||
|
for_all_prompts(sym, prop) {
|
||||||
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
|
tri = E_OR(tri, prop->visible.tri);
|
||||||
|
}
|
||||||
|
if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
|
||||||
|
tri = yes;
|
||||||
|
if (sym->visible != tri) {
|
||||||
|
sym->visible = tri;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
|
if (sym_is_choice_value(sym))
|
||||||
|
return;
|
||||||
|
tri = no;
|
||||||
|
if (sym->rev_dep.expr)
|
||||||
|
tri = expr_calc_value(sym->rev_dep.expr);
|
||||||
|
if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
||||||
|
tri = yes;
|
||||||
|
if (sym->rev_dep.tri != tri) {
|
||||||
|
sym->rev_dep.tri = tri;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct symbol *sym_calc_choice(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol *def_sym;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
/* is the user choice visible? */
|
||||||
|
def_sym = sym->user.val;
|
||||||
|
if (def_sym) {
|
||||||
|
sym_calc_visibility(def_sym);
|
||||||
|
if (def_sym->visible != no)
|
||||||
|
return def_sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* any of the defaults visible? */
|
||||||
|
for_all_defaults(sym, prop) {
|
||||||
|
prop->visible.tri = expr_calc_value(prop->visible.expr);
|
||||||
|
if (prop->visible.tri == no)
|
||||||
|
continue;
|
||||||
|
def_sym = prop_get_symbol(prop);
|
||||||
|
sym_calc_visibility(def_sym);
|
||||||
|
if (def_sym->visible != no)
|
||||||
|
return def_sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* just get the first visible value */
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
for (e = prop->expr; e; e = e->left.expr) {
|
||||||
|
def_sym = e->right.sym;
|
||||||
|
sym_calc_visibility(def_sym);
|
||||||
|
if (def_sym->visible != no)
|
||||||
|
return def_sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no choice? reset tristate value */
|
||||||
|
sym->curr.tri = no;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_calc_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol_value newval, oldval;
|
||||||
|
struct property *prop;
|
||||||
|
struct expr *e;
|
||||||
|
|
||||||
|
if (!sym)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_VALID)
|
||||||
|
return;
|
||||||
|
sym->flags |= SYMBOL_VALID;
|
||||||
|
|
||||||
|
oldval = sym->curr;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_INT:
|
||||||
|
case S_HEX:
|
||||||
|
case S_STRING:
|
||||||
|
newval = symbol_empty.curr;
|
||||||
|
break;
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
newval = symbol_no.curr;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sym->curr.val = sym->name;
|
||||||
|
sym->curr.tri = no;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!sym_is_choice_value(sym))
|
||||||
|
sym->flags &= ~SYMBOL_WRITE;
|
||||||
|
|
||||||
|
sym_calc_visibility(sym);
|
||||||
|
|
||||||
|
/* set default if recursively called */
|
||||||
|
sym->curr = newval;
|
||||||
|
|
||||||
|
switch (sym_get_type(sym)) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
if (sym_is_choice_value(sym) && sym->visible == yes) {
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
|
||||||
|
} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
|
||||||
|
sym->flags |= SYMBOL_WRITE;
|
||||||
|
if (sym_has_value(sym))
|
||||||
|
newval.tri = sym->user.tri;
|
||||||
|
else if (!sym_is_choice(sym)) {
|
||||||
|
prop = sym_get_default_prop(sym);
|
||||||
|
if (prop)
|
||||||
|
newval.tri = expr_calc_value(prop->expr);
|
||||||
|
}
|
||||||
|
newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
|
||||||
|
} else if (!sym_is_choice(sym)) {
|
||||||
|
prop = sym_get_default_prop(sym);
|
||||||
|
if (prop) {
|
||||||
|
sym->flags |= SYMBOL_WRITE;
|
||||||
|
newval.tri = expr_calc_value(prop->expr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
|
||||||
|
newval.tri = yes;
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
case S_HEX:
|
||||||
|
case S_INT:
|
||||||
|
if (sym->visible != no) {
|
||||||
|
sym->flags |= SYMBOL_WRITE;
|
||||||
|
if (sym_has_value(sym)) {
|
||||||
|
newval.val = sym->user.val;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prop = sym_get_default_prop(sym);
|
||||||
|
if (prop) {
|
||||||
|
struct symbol *ds = prop_get_symbol(prop);
|
||||||
|
if (ds) {
|
||||||
|
sym->flags |= SYMBOL_WRITE;
|
||||||
|
sym_calc_value(ds);
|
||||||
|
newval.val = ds->curr.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym->curr = newval;
|
||||||
|
if (sym_is_choice(sym) && newval.tri == yes)
|
||||||
|
sym->curr.val = sym_calc_choice(sym);
|
||||||
|
|
||||||
|
if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
|
||||||
|
sym_set_changed(sym);
|
||||||
|
if (modules_sym == sym)
|
||||||
|
modules_val = modules_sym->curr.tri;
|
||||||
|
|
||||||
|
if (sym_is_choice(sym)) {
|
||||||
|
int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
|
||||||
|
prop = sym_get_choice_prop(sym);
|
||||||
|
for (e = prop->expr; e; e = e->left.expr) {
|
||||||
|
e->right.sym->flags |= flags;
|
||||||
|
if (flags & SYMBOL_CHANGED)
|
||||||
|
sym_set_changed(e->right.sym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_clear_all_valid(void)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym)
|
||||||
|
sym->flags &= ~SYMBOL_VALID;
|
||||||
|
sym_change_count++;
|
||||||
|
if (modules_sym)
|
||||||
|
sym_calc_value(modules_sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_set_changed(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
sym->flags |= SYMBOL_CHANGED;
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
if (prop->menu)
|
||||||
|
prop->menu->flags |= MENU_CHANGED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sym_set_all_changed(void)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym)
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_tristate_within_range(struct symbol *sym, tristate val)
|
||||||
|
{
|
||||||
|
int type = sym_get_type(sym);
|
||||||
|
|
||||||
|
if (sym->visible == no)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (type != S_BOOLEAN && type != S_TRISTATE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (type == S_BOOLEAN && val == mod)
|
||||||
|
return false;
|
||||||
|
if (sym->visible <= sym->rev_dep.tri)
|
||||||
|
return false;
|
||||||
|
if (sym_is_choice_value(sym) && sym->visible == yes)
|
||||||
|
return val == yes;
|
||||||
|
return val >= sym->rev_dep.tri && val <= sym->visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_set_tristate_value(struct symbol *sym, tristate val)
|
||||||
|
{
|
||||||
|
tristate oldval = sym_get_tristate_value(sym);
|
||||||
|
|
||||||
|
if (oldval != val && !sym_tristate_within_range(sym, val))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_NEW) {
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
|
if (sym_is_choice_value(sym) && val == yes) {
|
||||||
|
struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
|
||||||
|
|
||||||
|
cs->user.val = sym;
|
||||||
|
cs->flags &= ~SYMBOL_NEW;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym->user.tri = val;
|
||||||
|
if (oldval != val) {
|
||||||
|
sym_clear_all_valid();
|
||||||
|
if (sym == modules_sym)
|
||||||
|
sym_set_all_changed();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
tristate sym_toggle_tristate_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
tristate oldval, newval;
|
||||||
|
|
||||||
|
oldval = newval = sym_get_tristate_value(sym);
|
||||||
|
do {
|
||||||
|
switch (newval) {
|
||||||
|
case no:
|
||||||
|
newval = mod;
|
||||||
|
break;
|
||||||
|
case mod:
|
||||||
|
newval = yes;
|
||||||
|
break;
|
||||||
|
case yes:
|
||||||
|
newval = no;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sym_set_tristate_value(sym, newval))
|
||||||
|
break;
|
||||||
|
} while (oldval != newval);
|
||||||
|
return newval;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_string_valid(struct symbol *sym, const char *str)
|
||||||
|
{
|
||||||
|
char ch;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_STRING:
|
||||||
|
return true;
|
||||||
|
case S_INT:
|
||||||
|
ch = *str++;
|
||||||
|
if (ch == '-')
|
||||||
|
ch = *str++;
|
||||||
|
if (!isdigit(ch))
|
||||||
|
return false;
|
||||||
|
if (ch == '0' && *str != 0)
|
||||||
|
return false;
|
||||||
|
while ((ch = *str++)) {
|
||||||
|
if (!isdigit(ch))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case S_HEX:
|
||||||
|
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
|
||||||
|
str += 2;
|
||||||
|
ch = *str++;
|
||||||
|
do {
|
||||||
|
if (!isxdigit(ch))
|
||||||
|
return false;
|
||||||
|
} while ((ch = *str++));
|
||||||
|
return true;
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (str[0]) {
|
||||||
|
case 'y': case 'Y':
|
||||||
|
case 'm': case 'M':
|
||||||
|
case 'n': case 'N':
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_string_within_range(struct symbol *sym, const char *str)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
int val;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_STRING:
|
||||||
|
return sym_string_valid(sym, str);
|
||||||
|
case S_INT:
|
||||||
|
if (!sym_string_valid(sym, str))
|
||||||
|
return false;
|
||||||
|
prop = sym_get_range_prop(sym);
|
||||||
|
if (!prop)
|
||||||
|
return true;
|
||||||
|
val = strtol(str, NULL, 10);
|
||||||
|
return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
|
||||||
|
val <= strtol(prop->expr->right.sym->name, NULL, 10);
|
||||||
|
case S_HEX:
|
||||||
|
if (!sym_string_valid(sym, str))
|
||||||
|
return false;
|
||||||
|
prop = sym_get_range_prop(sym);
|
||||||
|
if (!prop)
|
||||||
|
return true;
|
||||||
|
val = strtol(str, NULL, 16);
|
||||||
|
return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
|
||||||
|
val <= strtol(prop->expr->right.sym->name, NULL, 16);
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (str[0]) {
|
||||||
|
case 'y': case 'Y':
|
||||||
|
return sym_tristate_within_range(sym, yes);
|
||||||
|
case 'm': case 'M':
|
||||||
|
return sym_tristate_within_range(sym, mod);
|
||||||
|
case 'n': case 'N':
|
||||||
|
return sym_tristate_within_range(sym, no);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_set_string_value(struct symbol *sym, const char *newval)
|
||||||
|
{
|
||||||
|
const char *oldval;
|
||||||
|
char *val;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
switch (newval[0]) {
|
||||||
|
case 'y': case 'Y':
|
||||||
|
return sym_set_tristate_value(sym, yes);
|
||||||
|
case 'm': case 'M':
|
||||||
|
return sym_set_tristate_value(sym, mod);
|
||||||
|
case 'n': case 'N':
|
||||||
|
return sym_set_tristate_value(sym, no);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sym_string_within_range(sym, newval))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_NEW) {
|
||||||
|
sym->flags &= ~SYMBOL_NEW;
|
||||||
|
sym_set_changed(sym);
|
||||||
|
}
|
||||||
|
|
||||||
|
oldval = sym->user.val;
|
||||||
|
size = strlen(newval) + 1;
|
||||||
|
if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
|
||||||
|
size += 2;
|
||||||
|
sym->user.val = val = malloc(size);
|
||||||
|
*val++ = '0';
|
||||||
|
*val++ = 'x';
|
||||||
|
} else if (!oldval || strcmp(oldval, newval))
|
||||||
|
sym->user.val = val = malloc(size);
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
|
||||||
|
strcpy(val, newval);
|
||||||
|
free((void *)oldval);
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *sym_get_string_value(struct symbol *sym)
|
||||||
|
{
|
||||||
|
tristate val;
|
||||||
|
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
val = sym_get_tristate_value(sym);
|
||||||
|
switch (val) {
|
||||||
|
case no:
|
||||||
|
return "n";
|
||||||
|
case mod:
|
||||||
|
return "m";
|
||||||
|
case yes:
|
||||||
|
return "y";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
return (const char *)sym->curr.val;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sym_is_changable(struct symbol *sym)
|
||||||
|
{
|
||||||
|
return sym->visible > sym->rev_dep.tri;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_lookup(const char *name, int isconst)
|
||||||
|
{
|
||||||
|
struct symbol *symbol;
|
||||||
|
const char *ptr;
|
||||||
|
char *new_name;
|
||||||
|
int hash = 0;
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
if (name[0] && !name[1]) {
|
||||||
|
switch (name[0]) {
|
||||||
|
case 'y': return &symbol_yes;
|
||||||
|
case 'm': return &symbol_mod;
|
||||||
|
case 'n': return &symbol_no;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (ptr = name; *ptr; ptr++)
|
||||||
|
hash += *ptr;
|
||||||
|
hash &= 0xff;
|
||||||
|
|
||||||
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
|
if (!strcmp(symbol->name, name)) {
|
||||||
|
if ((isconst && symbol->flags & SYMBOL_CONST) ||
|
||||||
|
(!isconst && !(symbol->flags & SYMBOL_CONST)))
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new_name = strdup(name);
|
||||||
|
} else {
|
||||||
|
new_name = NULL;
|
||||||
|
hash = 256;
|
||||||
|
}
|
||||||
|
|
||||||
|
symbol = malloc(sizeof(*symbol));
|
||||||
|
memset(symbol, 0, sizeof(*symbol));
|
||||||
|
symbol->name = new_name;
|
||||||
|
symbol->type = S_UNKNOWN;
|
||||||
|
symbol->flags = SYMBOL_NEW;
|
||||||
|
if (isconst)
|
||||||
|
symbol->flags |= SYMBOL_CONST;
|
||||||
|
|
||||||
|
symbol->next = symbol_hash[hash];
|
||||||
|
symbol_hash[hash] = symbol;
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_find(const char *name)
|
||||||
|
{
|
||||||
|
struct symbol *symbol = NULL;
|
||||||
|
const char *ptr;
|
||||||
|
int hash = 0;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (name[0] && !name[1]) {
|
||||||
|
switch (name[0]) {
|
||||||
|
case 'y': return &symbol_yes;
|
||||||
|
case 'm': return &symbol_mod;
|
||||||
|
case 'n': return &symbol_no;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (ptr = name; *ptr; ptr++)
|
||||||
|
hash += *ptr;
|
||||||
|
hash &= 0xff;
|
||||||
|
|
||||||
|
for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
|
||||||
|
if (!strcmp(symbol->name, name) &&
|
||||||
|
!(symbol->flags & SYMBOL_CONST))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_check_deps(struct symbol *sym);
|
||||||
|
|
||||||
|
static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
return NULL;
|
||||||
|
switch (e->type) {
|
||||||
|
case E_OR:
|
||||||
|
case E_AND:
|
||||||
|
sym = sym_check_expr_deps(e->left.expr);
|
||||||
|
if (sym)
|
||||||
|
return sym;
|
||||||
|
return sym_check_expr_deps(e->right.expr);
|
||||||
|
case E_NOT:
|
||||||
|
return sym_check_expr_deps(e->left.expr);
|
||||||
|
case E_EQUAL:
|
||||||
|
case E_UNEQUAL:
|
||||||
|
sym = sym_check_deps(e->left.sym);
|
||||||
|
if (sym)
|
||||||
|
return sym;
|
||||||
|
return sym_check_deps(e->right.sym);
|
||||||
|
case E_SYMBOL:
|
||||||
|
return sym_check_deps(e->left.sym);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
printf("Oops! How to check %d?\n", e->type);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *sym_check_deps(struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct symbol *sym2;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
if (sym->flags & SYMBOL_CHECK_DONE)
|
||||||
|
return NULL;
|
||||||
|
if (sym->flags & SYMBOL_CHECK) {
|
||||||
|
printf("Warning! Found recursive dependency: %s", sym->name);
|
||||||
|
return sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
|
||||||
|
sym2 = sym_check_expr_deps(sym->rev_dep.expr);
|
||||||
|
if (sym2)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
if (prop->type == P_CHOICE || prop->type == P_SELECT)
|
||||||
|
continue;
|
||||||
|
sym2 = sym_check_expr_deps(prop->visible.expr);
|
||||||
|
if (sym2)
|
||||||
|
goto out;
|
||||||
|
if (prop->type != P_DEFAULT || sym_is_choice(sym))
|
||||||
|
continue;
|
||||||
|
sym2 = sym_check_expr_deps(prop->expr);
|
||||||
|
if (sym2)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
if (sym2)
|
||||||
|
printf(" %s", sym->name);
|
||||||
|
sym->flags &= ~SYMBOL_CHECK;
|
||||||
|
return sym2;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct property *prop_alloc(enum prop_type type, struct symbol *sym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct property **propp;
|
||||||
|
|
||||||
|
prop = malloc(sizeof(*prop));
|
||||||
|
memset(prop, 0, sizeof(*prop));
|
||||||
|
prop->type = type;
|
||||||
|
prop->sym = sym;
|
||||||
|
prop->file = current_file;
|
||||||
|
prop->lineno = zconf_lineno();
|
||||||
|
|
||||||
|
/* append property to the prop list of symbol */
|
||||||
|
if (sym) {
|
||||||
|
for (propp = &sym->prop; *propp; propp = &(*propp)->next)
|
||||||
|
;
|
||||||
|
*propp = prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
return prop;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct symbol *prop_get_symbol(struct property *prop)
|
||||||
|
{
|
||||||
|
if (prop->expr && (prop->expr->type == E_SYMBOL ||
|
||||||
|
prop->expr->type == E_CHOICE))
|
||||||
|
return prop->expr->left.sym;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *prop_get_type_name(enum prop_type type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case P_PROMPT:
|
||||||
|
return "prompt";
|
||||||
|
case P_COMMENT:
|
||||||
|
return "comment";
|
||||||
|
case P_MENU:
|
||||||
|
return "menu";
|
||||||
|
case P_DEFAULT:
|
||||||
|
return "default";
|
||||||
|
case P_CHOICE:
|
||||||
|
return "choice";
|
||||||
|
case P_SELECT:
|
||||||
|
return "select";
|
||||||
|
case P_RANGE:
|
||||||
|
return "range";
|
||||||
|
case P_UNKNOWN:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "unknown";
|
||||||
|
}
|
556
package/config/textbox.c
Normal file
556
package/config/textbox.c
Normal file
@ -0,0 +1,556 @@
|
|||||||
|
/*
|
||||||
|
* textbox.c -- implements the text box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
static void back_lines (int n);
|
||||||
|
static void print_page (WINDOW * win, int height, int width);
|
||||||
|
static void print_line (WINDOW * win, int row, int width);
|
||||||
|
static char *get_line (void);
|
||||||
|
static void print_position (WINDOW * win, int height, int width);
|
||||||
|
|
||||||
|
static int hscroll, fd, file_size, bytes_read;
|
||||||
|
static int begin_reached = 1, end_reached, page_length;
|
||||||
|
static char *buf, *page;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display text from a file in a dialog box.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_textbox (const char *title, const char *file, int height, int width)
|
||||||
|
{
|
||||||
|
int i, x, y, cur_x, cur_y, fpos, key = 0;
|
||||||
|
int passed_end;
|
||||||
|
char search_term[MAX_LEN + 1];
|
||||||
|
WINDOW *dialog, *text;
|
||||||
|
|
||||||
|
search_term[0] = '\0'; /* no search term entered yet */
|
||||||
|
|
||||||
|
/* Open input file for reading */
|
||||||
|
if ((fd = open (file, O_RDONLY)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nCan't open input file in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
/* Get file size. Actually, 'file_size' is the real file size - 1,
|
||||||
|
since it's only the last byte offset from the beginning */
|
||||||
|
if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
/* Restore file pointer to beginning of file after getting file size */
|
||||||
|
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
/* Allocate space for read buffer */
|
||||||
|
if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError reading file in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0'; /* mark end of valid data */
|
||||||
|
page = buf; /* page is pointer to start of page to be displayed */
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
/* Create window for text region, used for scrolling text */
|
||||||
|
text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
|
||||||
|
wattrset (text, dialog_attr);
|
||||||
|
wbkgdset (text, dialog_attr & A_COLOR);
|
||||||
|
|
||||||
|
keypad (text, TRUE);
|
||||||
|
|
||||||
|
/* register the new window, along with its borders */
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
wbkgdset (dialog, dialog_attr & A_COLOR);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
|
||||||
|
wnoutrefresh (dialog);
|
||||||
|
getyx (dialog, cur_y, cur_x); /* Save cursor position */
|
||||||
|
|
||||||
|
/* Print first page of text */
|
||||||
|
attr_clear (text, height - 4, width - 2, dialog_attr);
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||||
|
wrefresh (dialog);
|
||||||
|
|
||||||
|
while ((key != ESC) && (key != '\n')) {
|
||||||
|
key = wgetch (dialog);
|
||||||
|
switch (key) {
|
||||||
|
case 'E': /* Exit */
|
||||||
|
case 'e':
|
||||||
|
case 'X':
|
||||||
|
case 'x':
|
||||||
|
delwin (dialog);
|
||||||
|
free (buf);
|
||||||
|
close (fd);
|
||||||
|
return 0;
|
||||||
|
case 'g': /* First page */
|
||||||
|
case KEY_HOME:
|
||||||
|
if (!begin_reached) {
|
||||||
|
begin_reached = 1;
|
||||||
|
/* First page not in buffer? */
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError moving file pointer in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if (fpos > bytes_read) { /* Yes, we have to read it in */
|
||||||
|
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in "
|
||||||
|
"dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError reading file in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0';
|
||||||
|
}
|
||||||
|
page = buf;
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'G': /* Last page */
|
||||||
|
case KEY_END:
|
||||||
|
|
||||||
|
end_reached = 1;
|
||||||
|
/* Last page not in buffer? */
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError moving file pointer in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if (fpos < file_size) { /* Yes, we have to read it in */
|
||||||
|
if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError moving file pointer in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError reading file in dialog_textbox().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0';
|
||||||
|
}
|
||||||
|
page = buf + bytes_read;
|
||||||
|
back_lines (height - 4);
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case 'K': /* Previous line */
|
||||||
|
case 'k':
|
||||||
|
case KEY_UP:
|
||||||
|
if (!begin_reached) {
|
||||||
|
back_lines (page_length + 1);
|
||||||
|
|
||||||
|
/* We don't call print_page() here but use scrolling to ensure
|
||||||
|
faster screen update. However, 'end_reached' and
|
||||||
|
'page_length' should still be updated, and 'page' should
|
||||||
|
point to start of next page. This is done by calling
|
||||||
|
get_line() in the following 'for' loop. */
|
||||||
|
scrollok (text, TRUE);
|
||||||
|
wscrl (text, -1); /* Scroll text region down one line */
|
||||||
|
scrollok (text, FALSE);
|
||||||
|
page_length = 0;
|
||||||
|
passed_end = 0;
|
||||||
|
for (i = 0; i < height - 4; i++) {
|
||||||
|
if (!i) {
|
||||||
|
/* print first line of page */
|
||||||
|
print_line (text, 0, width - 2);
|
||||||
|
wnoutrefresh (text);
|
||||||
|
} else
|
||||||
|
/* Called to update 'end_reached' and 'page' */
|
||||||
|
get_line ();
|
||||||
|
if (!passed_end)
|
||||||
|
page_length++;
|
||||||
|
if (end_reached && !passed_end)
|
||||||
|
passed_end = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'B': /* Previous page */
|
||||||
|
case 'b':
|
||||||
|
case KEY_PPAGE:
|
||||||
|
if (begin_reached)
|
||||||
|
break;
|
||||||
|
back_lines (page_length + height - 4);
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case 'J': /* Next line */
|
||||||
|
case 'j':
|
||||||
|
case KEY_DOWN:
|
||||||
|
if (!end_reached) {
|
||||||
|
begin_reached = 0;
|
||||||
|
scrollok (text, TRUE);
|
||||||
|
scroll (text); /* Scroll text region up one line */
|
||||||
|
scrollok (text, FALSE);
|
||||||
|
print_line (text, height - 5, width - 2);
|
||||||
|
wnoutrefresh (text);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x); /* Restore cursor position */
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case KEY_NPAGE: /* Next page */
|
||||||
|
case ' ':
|
||||||
|
if (end_reached)
|
||||||
|
break;
|
||||||
|
|
||||||
|
begin_reached = 0;
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
print_position (dialog, height, width);
|
||||||
|
wmove (dialog, cur_y, cur_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case '0': /* Beginning of line */
|
||||||
|
case 'H': /* Scroll left */
|
||||||
|
case 'h':
|
||||||
|
case KEY_LEFT:
|
||||||
|
if (hscroll <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (key == '0')
|
||||||
|
hscroll = 0;
|
||||||
|
else
|
||||||
|
hscroll--;
|
||||||
|
/* Reprint current page to scroll horizontally */
|
||||||
|
back_lines (page_length);
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
wmove (dialog, cur_y, cur_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case 'L': /* Scroll right */
|
||||||
|
case 'l':
|
||||||
|
case KEY_RIGHT:
|
||||||
|
if (hscroll >= MAX_LEN)
|
||||||
|
break;
|
||||||
|
hscroll++;
|
||||||
|
/* Reprint current page to scroll horizontally */
|
||||||
|
back_lines (page_length);
|
||||||
|
print_page (text, height - 4, width - 2);
|
||||||
|
wmove (dialog, cur_y, cur_x);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case ESC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
free (buf);
|
||||||
|
close (fd);
|
||||||
|
return 1; /* ESC pressed */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Go back 'n' lines in text file. Called by dialog_textbox().
|
||||||
|
* 'page' will be updated to point to the desired line in 'buf'.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
back_lines (int n)
|
||||||
|
{
|
||||||
|
int i, fpos;
|
||||||
|
|
||||||
|
begin_reached = 0;
|
||||||
|
/* We have to distinguish between end_reached and !end_reached
|
||||||
|
since at end of file, the line is not ended by a '\n'.
|
||||||
|
The code inside 'if' basically does a '--page' to move one
|
||||||
|
character backward so as to skip '\n' of the previous line */
|
||||||
|
if (!end_reached) {
|
||||||
|
/* Either beginning of buffer or beginning of file reached? */
|
||||||
|
if (page == buf) {
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in "
|
||||||
|
"back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if (fpos > bytes_read) { /* Not beginning of file yet */
|
||||||
|
/* We've reached beginning of buffer, but not beginning of
|
||||||
|
file yet, so read previous part of file into buffer.
|
||||||
|
Note that we only move backward for BUF_SIZE/2 bytes,
|
||||||
|
but not BUF_SIZE bytes to avoid re-reading again in
|
||||||
|
print_page() later */
|
||||||
|
/* Really possible to move backward BUF_SIZE/2 bytes? */
|
||||||
|
if (fpos < BUF_SIZE / 2 + bytes_read) {
|
||||||
|
/* No, move less then */
|
||||||
|
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in "
|
||||||
|
"back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
page = buf + fpos - bytes_read;
|
||||||
|
} else { /* Move backward BUF_SIZE/2 bytes */
|
||||||
|
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
|
||||||
|
== -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer "
|
||||||
|
"in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
page = buf + BUF_SIZE / 2;
|
||||||
|
}
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError reading file in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0';
|
||||||
|
} else { /* Beginning of file reached */
|
||||||
|
begin_reached = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*(--page) != '\n') { /* '--page' here */
|
||||||
|
/* Something's wrong... */
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nInternal error in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Go back 'n' lines */
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
do {
|
||||||
|
if (page == buf) {
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr,
|
||||||
|
"\nError moving file pointer in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if (fpos > bytes_read) {
|
||||||
|
/* Really possible to move backward BUF_SIZE/2 bytes? */
|
||||||
|
if (fpos < BUF_SIZE / 2 + bytes_read) {
|
||||||
|
/* No, move less then */
|
||||||
|
if (lseek (fd, 0, SEEK_SET) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer "
|
||||||
|
"in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
page = buf + fpos - bytes_read;
|
||||||
|
} else { /* Move backward BUF_SIZE/2 bytes */
|
||||||
|
if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
|
||||||
|
SEEK_CUR) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer"
|
||||||
|
" in back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
page = buf + BUF_SIZE / 2;
|
||||||
|
}
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError reading file in "
|
||||||
|
"back_lines().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0';
|
||||||
|
} else { /* Beginning of file reached */
|
||||||
|
begin_reached = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (*(--page) != '\n');
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a new page of text. Called by dialog_textbox().
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_page (WINDOW * win, int height, int width)
|
||||||
|
{
|
||||||
|
int i, passed_end = 0;
|
||||||
|
|
||||||
|
page_length = 0;
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
print_line (win, i, width);
|
||||||
|
if (!passed_end)
|
||||||
|
page_length++;
|
||||||
|
if (end_reached && !passed_end)
|
||||||
|
passed_end = 1;
|
||||||
|
}
|
||||||
|
wnoutrefresh (win);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a new line of text. Called by dialog_textbox() and print_page().
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_line (WINDOW * win, int row, int width)
|
||||||
|
{
|
||||||
|
int y, x;
|
||||||
|
char *line;
|
||||||
|
|
||||||
|
line = get_line ();
|
||||||
|
line += MIN (strlen (line), hscroll); /* Scroll horizontally */
|
||||||
|
wmove (win, row, 0); /* move cursor to correct line */
|
||||||
|
waddch (win, ' ');
|
||||||
|
waddnstr (win, line, MIN (strlen (line), width - 2));
|
||||||
|
|
||||||
|
getyx (win, y, x);
|
||||||
|
/* Clear 'residue' of previous line */
|
||||||
|
#if OLD_NCURSES
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < width - x; i++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
wclrtoeol(win);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return current line of text. Called by dialog_textbox() and print_line().
|
||||||
|
* 'page' should point to start of current line before calling, and will be
|
||||||
|
* updated to point to start of next line.
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
get_line (void)
|
||||||
|
{
|
||||||
|
int i = 0, fpos;
|
||||||
|
static char line[MAX_LEN + 1];
|
||||||
|
|
||||||
|
end_reached = 0;
|
||||||
|
while (*page != '\n') {
|
||||||
|
if (*page == '\0') {
|
||||||
|
/* Either end of file or end of buffer reached */
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in "
|
||||||
|
"get_line().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
if (fpos < file_size) { /* Not end of file yet */
|
||||||
|
/* We've reached end of buffer, but not end of file yet,
|
||||||
|
so read next part of file into buffer */
|
||||||
|
if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError reading file in get_line().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
buf[bytes_read] = '\0';
|
||||||
|
page = buf;
|
||||||
|
} else {
|
||||||
|
if (!end_reached)
|
||||||
|
end_reached = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (i < MAX_LEN)
|
||||||
|
line[i++] = *(page++);
|
||||||
|
else {
|
||||||
|
/* Truncate lines longer than MAX_LEN characters */
|
||||||
|
if (i == MAX_LEN)
|
||||||
|
line[i++] = '\0';
|
||||||
|
page++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i <= MAX_LEN)
|
||||||
|
line[i] = '\0';
|
||||||
|
if (!end_reached)
|
||||||
|
page++; /* move pass '\n' */
|
||||||
|
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print current position
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_position (WINDOW * win, int height, int width)
|
||||||
|
{
|
||||||
|
int fpos, percent;
|
||||||
|
|
||||||
|
if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
|
||||||
|
endwin ();
|
||||||
|
fprintf (stderr, "\nError moving file pointer in print_position().\n");
|
||||||
|
exit (-1);
|
||||||
|
}
|
||||||
|
wattrset (win, position_indicator_attr);
|
||||||
|
wbkgdset (win, position_indicator_attr & A_COLOR);
|
||||||
|
percent = !file_size ?
|
||||||
|
100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
|
||||||
|
wmove (win, height - 3, width - 9);
|
||||||
|
wprintw (win, "(%3d%%)", percent);
|
||||||
|
}
|
375
package/config/util.c
Normal file
375
package/config/util.c
Normal file
@ -0,0 +1,375 @@
|
|||||||
|
/*
|
||||||
|
* util.c
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* use colors by default? */
|
||||||
|
bool use_colors = 1;
|
||||||
|
|
||||||
|
char *backtitle = NULL;
|
||||||
|
|
||||||
|
const char *dialog_result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attribute values, default is for mono display
|
||||||
|
*/
|
||||||
|
chtype attributes[] =
|
||||||
|
{
|
||||||
|
A_NORMAL, /* screen_attr */
|
||||||
|
A_NORMAL, /* shadow_attr */
|
||||||
|
A_NORMAL, /* dialog_attr */
|
||||||
|
A_BOLD, /* title_attr */
|
||||||
|
A_NORMAL, /* border_attr */
|
||||||
|
A_REVERSE, /* button_active_attr */
|
||||||
|
A_DIM, /* button_inactive_attr */
|
||||||
|
A_REVERSE, /* button_key_active_attr */
|
||||||
|
A_BOLD, /* button_key_inactive_attr */
|
||||||
|
A_REVERSE, /* button_label_active_attr */
|
||||||
|
A_NORMAL, /* button_label_inactive_attr */
|
||||||
|
A_NORMAL, /* inputbox_attr */
|
||||||
|
A_NORMAL, /* inputbox_border_attr */
|
||||||
|
A_NORMAL, /* searchbox_attr */
|
||||||
|
A_BOLD, /* searchbox_title_attr */
|
||||||
|
A_NORMAL, /* searchbox_border_attr */
|
||||||
|
A_BOLD, /* position_indicator_attr */
|
||||||
|
A_NORMAL, /* menubox_attr */
|
||||||
|
A_NORMAL, /* menubox_border_attr */
|
||||||
|
A_NORMAL, /* item_attr */
|
||||||
|
A_REVERSE, /* item_selected_attr */
|
||||||
|
A_BOLD, /* tag_attr */
|
||||||
|
A_REVERSE, /* tag_selected_attr */
|
||||||
|
A_BOLD, /* tag_key_attr */
|
||||||
|
A_REVERSE, /* tag_key_selected_attr */
|
||||||
|
A_BOLD, /* check_attr */
|
||||||
|
A_REVERSE, /* check_selected_attr */
|
||||||
|
A_BOLD, /* uarrow_attr */
|
||||||
|
A_BOLD /* darrow_attr */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#include "colors.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Table of color values
|
||||||
|
*/
|
||||||
|
int color_table[][3] =
|
||||||
|
{
|
||||||
|
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
|
||||||
|
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
|
||||||
|
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
|
||||||
|
{TITLE_FG, TITLE_BG, TITLE_HL},
|
||||||
|
{BORDER_FG, BORDER_BG, BORDER_HL},
|
||||||
|
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
|
||||||
|
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
|
||||||
|
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
|
||||||
|
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
|
||||||
|
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
|
||||||
|
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
|
||||||
|
BUTTON_LABEL_INACTIVE_HL},
|
||||||
|
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
|
||||||
|
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
|
||||||
|
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
|
||||||
|
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
|
||||||
|
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
|
||||||
|
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
|
||||||
|
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
|
||||||
|
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
|
||||||
|
{ITEM_FG, ITEM_BG, ITEM_HL},
|
||||||
|
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
|
||||||
|
{TAG_FG, TAG_BG, TAG_HL},
|
||||||
|
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
|
||||||
|
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
|
||||||
|
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
|
||||||
|
{CHECK_FG, CHECK_BG, CHECK_HL},
|
||||||
|
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
|
||||||
|
{UARROW_FG, UARROW_BG, UARROW_HL},
|
||||||
|
{DARROW_FG, DARROW_BG, DARROW_HL},
|
||||||
|
}; /* color_table */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set window to attribute 'attr'
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
attr_clear (WINDOW * win, int height, int width, chtype attr)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
wattrset (win, attr);
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
wmove (win, i, 0);
|
||||||
|
for (j = 0; j < width; j++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
}
|
||||||
|
touchwin (win);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dialog_clear (void)
|
||||||
|
{
|
||||||
|
attr_clear (stdscr, LINES, COLS, screen_attr);
|
||||||
|
/* Display background title if it exists ... - SLH */
|
||||||
|
if (backtitle != NULL) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
wattrset (stdscr, screen_attr);
|
||||||
|
mvwaddstr (stdscr, 0, 1, (char *)backtitle);
|
||||||
|
wmove (stdscr, 1, 1);
|
||||||
|
for (i = 1; i < COLS - 1; i++)
|
||||||
|
waddch (stdscr, ACS_HLINE);
|
||||||
|
}
|
||||||
|
wnoutrefresh (stdscr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do some initialization for dialog
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
init_dialog (void)
|
||||||
|
{
|
||||||
|
initscr (); /* Init curses */
|
||||||
|
keypad (stdscr, TRUE);
|
||||||
|
cbreak ();
|
||||||
|
noecho ();
|
||||||
|
|
||||||
|
|
||||||
|
if (use_colors) /* Set up colors */
|
||||||
|
color_setup ();
|
||||||
|
|
||||||
|
|
||||||
|
dialog_clear ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup for color display
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
color_setup (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (has_colors ()) { /* Terminal supports color? */
|
||||||
|
start_color ();
|
||||||
|
|
||||||
|
/* Initialize color pairs */
|
||||||
|
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||||
|
init_pair (i + 1, color_table[i][0], color_table[i][1]);
|
||||||
|
|
||||||
|
/* Setup color attributes */
|
||||||
|
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||||
|
attributes[i] = C_ATTR (color_table[i][2], i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* End using dialog functions.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
end_dialog (void)
|
||||||
|
{
|
||||||
|
endwin ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a string of text in a window, automatically wrap around to the
|
||||||
|
* next line if the string is too long to fit on one line. Newline
|
||||||
|
* characters '\n' are replaced by spaces. We start on a new line
|
||||||
|
* if there is no room for at least 4 nonblanks following a double-space.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
|
||||||
|
{
|
||||||
|
int newl, cur_x, cur_y;
|
||||||
|
int i, prompt_len, room, wlen;
|
||||||
|
char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
|
||||||
|
|
||||||
|
strcpy (tempstr, prompt);
|
||||||
|
|
||||||
|
prompt_len = strlen(tempstr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove newlines
|
||||||
|
*/
|
||||||
|
for(i=0; i<prompt_len; i++) {
|
||||||
|
if(tempstr[i] == '\n') tempstr[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prompt_len <= width - x * 2) { /* If prompt is short */
|
||||||
|
wmove (win, y, (width - prompt_len) / 2);
|
||||||
|
waddstr (win, tempstr);
|
||||||
|
} else {
|
||||||
|
cur_x = x;
|
||||||
|
cur_y = y;
|
||||||
|
newl = 1;
|
||||||
|
word = tempstr;
|
||||||
|
while (word && *word) {
|
||||||
|
sp = index(word, ' ');
|
||||||
|
if (sp)
|
||||||
|
*sp++ = 0;
|
||||||
|
|
||||||
|
/* Wrap to next line if either the word does not fit,
|
||||||
|
or it is the first word of a new sentence, and it is
|
||||||
|
short, and the next word does not fit. */
|
||||||
|
room = width - cur_x;
|
||||||
|
wlen = strlen(word);
|
||||||
|
if (wlen > room ||
|
||||||
|
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
|
||||||
|
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
|
||||||
|
cur_y++;
|
||||||
|
cur_x = x;
|
||||||
|
}
|
||||||
|
wmove (win, cur_y, cur_x);
|
||||||
|
waddstr (win, word);
|
||||||
|
getyx (win, cur_y, cur_x);
|
||||||
|
cur_x++;
|
||||||
|
if (sp && *sp == ' ') {
|
||||||
|
cur_x++; /* double space */
|
||||||
|
while (*++sp == ' ');
|
||||||
|
newl = 1;
|
||||||
|
} else
|
||||||
|
newl = 0;
|
||||||
|
word = sp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a button
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
print_button (WINDOW * win, const char *label, int y, int x, int selected)
|
||||||
|
{
|
||||||
|
int i, temp;
|
||||||
|
|
||||||
|
wmove (win, y, x);
|
||||||
|
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||||
|
waddstr (win, "<");
|
||||||
|
temp = strspn (label, " ");
|
||||||
|
label += temp;
|
||||||
|
wattrset (win, selected ? button_label_active_attr
|
||||||
|
: button_label_inactive_attr);
|
||||||
|
for (i = 0; i < temp; i++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
wattrset (win, selected ? button_key_active_attr
|
||||||
|
: button_key_inactive_attr);
|
||||||
|
waddch (win, label[0]);
|
||||||
|
wattrset (win, selected ? button_label_active_attr
|
||||||
|
: button_label_inactive_attr);
|
||||||
|
waddstr (win, (char *)label + 1);
|
||||||
|
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||||
|
waddstr (win, ">");
|
||||||
|
wmove (win, y, x + temp + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw a rectangular box with line drawing characters
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_box (WINDOW * win, int y, int x, int height, int width,
|
||||||
|
chtype box, chtype border)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
wattrset (win, 0);
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
wmove (win, y + i, x);
|
||||||
|
for (j = 0; j < width; j++)
|
||||||
|
if (!i && !j)
|
||||||
|
waddch (win, border | ACS_ULCORNER);
|
||||||
|
else if (i == height - 1 && !j)
|
||||||
|
waddch (win, border | ACS_LLCORNER);
|
||||||
|
else if (!i && j == width - 1)
|
||||||
|
waddch (win, box | ACS_URCORNER);
|
||||||
|
else if (i == height - 1 && j == width - 1)
|
||||||
|
waddch (win, box | ACS_LRCORNER);
|
||||||
|
else if (!i)
|
||||||
|
waddch (win, border | ACS_HLINE);
|
||||||
|
else if (i == height - 1)
|
||||||
|
waddch (win, box | ACS_HLINE);
|
||||||
|
else if (!j)
|
||||||
|
waddch (win, border | ACS_VLINE);
|
||||||
|
else if (j == width - 1)
|
||||||
|
waddch (win, box | ACS_VLINE);
|
||||||
|
else
|
||||||
|
waddch (win, box | ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw shadows along the right and bottom edge to give a more 3D look
|
||||||
|
* to the boxes
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_shadow (WINDOW * win, int y, int x, int height, int width)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (has_colors ()) { /* Whether terminal supports color? */
|
||||||
|
wattrset (win, shadow_attr);
|
||||||
|
wmove (win, y + height, x + 2);
|
||||||
|
for (i = 0; i < width; i++)
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
for (i = y + 1; i < y + height + 1; i++) {
|
||||||
|
wmove (win, i, x + width);
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
}
|
||||||
|
wnoutrefresh (win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the position of the first alphabetic character in a string.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
first_alpha(const char *string, const char *exempt)
|
||||||
|
{
|
||||||
|
int i, in_paren=0, c;
|
||||||
|
|
||||||
|
for (i = 0; i < strlen(string); i++) {
|
||||||
|
c = tolower(string[i]);
|
||||||
|
|
||||||
|
if (strchr("<[(", c)) ++in_paren;
|
||||||
|
if (strchr(">])", c) && in_paren > 0) --in_paren;
|
||||||
|
|
||||||
|
if ((! in_paren) && isalpha(c) &&
|
||||||
|
strchr(exempt, c) == 0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the first selected item in the dialog_list_item list.
|
||||||
|
*/
|
||||||
|
struct dialog_list_item *
|
||||||
|
first_sel_item(int item_no, struct dialog_list_item ** items)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
if (items[i]->selected)
|
||||||
|
return items[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
118
package/config/yesno.c
Normal file
118
package/config/yesno.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* yesno.c -- implements the yes/no box
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* 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 the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display termination buttons
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
print_buttons(WINDOW *dialog, int height, int width, int selected)
|
||||||
|
{
|
||||||
|
int x = width / 2 - 10;
|
||||||
|
int y = height - 2;
|
||||||
|
|
||||||
|
print_button (dialog, " Yes ", y, x, selected == 0);
|
||||||
|
print_button (dialog, " No ", y, x + 13, selected == 1);
|
||||||
|
|
||||||
|
wmove(dialog, y, x+1 + 13*selected );
|
||||||
|
wrefresh (dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a dialog box with two buttons - Yes and No
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
dialog_yesno (const char *title, const char *prompt, int height, int width)
|
||||||
|
{
|
||||||
|
int i, x, y, key = 0, button = 0;
|
||||||
|
WINDOW *dialog;
|
||||||
|
|
||||||
|
/* center dialog box on screen */
|
||||||
|
x = (COLS - width) / 2;
|
||||||
|
y = (LINES - height) / 2;
|
||||||
|
|
||||||
|
draw_shadow (stdscr, y, x, height, width);
|
||||||
|
|
||||||
|
dialog = newwin (height, width, y, x);
|
||||||
|
keypad (dialog, TRUE);
|
||||||
|
|
||||||
|
draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
|
||||||
|
wattrset (dialog, border_attr);
|
||||||
|
mvwaddch (dialog, height-3, 0, ACS_LTEE);
|
||||||
|
for (i = 0; i < width - 2; i++)
|
||||||
|
waddch (dialog, ACS_HLINE);
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
waddch (dialog, ACS_RTEE);
|
||||||
|
|
||||||
|
if (title != NULL && strlen(title) >= width-2 ) {
|
||||||
|
/* truncate long title -- mec */
|
||||||
|
char * title2 = malloc(width-2+1);
|
||||||
|
memcpy( title2, title, width-2 );
|
||||||
|
title2[width-2] = '\0';
|
||||||
|
title = title2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (title != NULL) {
|
||||||
|
wattrset (dialog, title_attr);
|
||||||
|
mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
|
||||||
|
waddstr (dialog, (char *)title);
|
||||||
|
waddch (dialog, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
wattrset (dialog, dialog_attr);
|
||||||
|
print_autowrap (dialog, prompt, width - 2, 1, 3);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, 0);
|
||||||
|
|
||||||
|
while (key != ESC) {
|
||||||
|
key = wgetch (dialog);
|
||||||
|
switch (key) {
|
||||||
|
case 'Y':
|
||||||
|
case 'y':
|
||||||
|
delwin (dialog);
|
||||||
|
return 0;
|
||||||
|
case 'N':
|
||||||
|
case 'n':
|
||||||
|
delwin (dialog);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case TAB:
|
||||||
|
case KEY_LEFT:
|
||||||
|
case KEY_RIGHT:
|
||||||
|
button = ((key == KEY_LEFT ? --button : ++button) < 0)
|
||||||
|
? 1 : (button > 1 ? 0 : button);
|
||||||
|
|
||||||
|
print_buttons(dialog, height, width, button);
|
||||||
|
wrefresh (dialog);
|
||||||
|
break;
|
||||||
|
case ' ':
|
||||||
|
case '\n':
|
||||||
|
delwin (dialog);
|
||||||
|
return button;
|
||||||
|
case ESC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delwin (dialog);
|
||||||
|
return -1; /* ESC pressed */
|
||||||
|
}
|
366
package/config/zconf.l
Normal file
366
package/config/zconf.l
Normal file
@ -0,0 +1,366 @@
|
|||||||
|
%option backup nostdinit noyywrap never-interactive full ecs
|
||||||
|
%option 8bit backup nodefault perf-report perf-report
|
||||||
|
%x COMMAND HELP STRING PARAM
|
||||||
|
%{
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
#define START_STRSIZE 16
|
||||||
|
|
||||||
|
char *text;
|
||||||
|
static char *text_ptr;
|
||||||
|
static int text_size, text_asize;
|
||||||
|
|
||||||
|
struct buffer {
|
||||||
|
struct buffer *parent;
|
||||||
|
YY_BUFFER_STATE state;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct buffer *current_buf;
|
||||||
|
|
||||||
|
static int last_ts, first_ts;
|
||||||
|
|
||||||
|
static void zconf_endhelp(void);
|
||||||
|
static struct buffer *zconf_endfile(void);
|
||||||
|
|
||||||
|
void new_string(void)
|
||||||
|
{
|
||||||
|
text = malloc(START_STRSIZE);
|
||||||
|
text_asize = START_STRSIZE;
|
||||||
|
text_ptr = text;
|
||||||
|
text_size = 0;
|
||||||
|
*text_ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void append_string(const char *str, int size)
|
||||||
|
{
|
||||||
|
int new_size = text_size + size + 1;
|
||||||
|
if (new_size > text_asize) {
|
||||||
|
text = realloc(text, new_size);
|
||||||
|
text_asize = new_size;
|
||||||
|
text_ptr = text + text_size;
|
||||||
|
}
|
||||||
|
memcpy(text_ptr, str, size);
|
||||||
|
text_ptr += size;
|
||||||
|
text_size += size;
|
||||||
|
*text_ptr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void alloc_string(const char *str, int size)
|
||||||
|
{
|
||||||
|
text = malloc(size + 1);
|
||||||
|
memcpy(text, str, size);
|
||||||
|
text[size] = 0;
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
ws [ \n\t]
|
||||||
|
n [A-Za-z0-9_]
|
||||||
|
|
||||||
|
%%
|
||||||
|
int str = 0;
|
||||||
|
int ts, i;
|
||||||
|
|
||||||
|
[ \t]*#.*\n current_file->lineno++;
|
||||||
|
[ \t]*#.*
|
||||||
|
|
||||||
|
[ \t]*\n current_file->lineno++; return T_EOL;
|
||||||
|
|
||||||
|
[ \t]+ {
|
||||||
|
BEGIN(COMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
. {
|
||||||
|
unput(yytext[0]);
|
||||||
|
BEGIN(COMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
<COMMAND>{
|
||||||
|
"mainmenu" BEGIN(PARAM); return T_MAINMENU;
|
||||||
|
"menu" BEGIN(PARAM); return T_MENU;
|
||||||
|
"endmenu" BEGIN(PARAM); return T_ENDMENU;
|
||||||
|
"source" BEGIN(PARAM); return T_SOURCE;
|
||||||
|
"choice" BEGIN(PARAM); return T_CHOICE;
|
||||||
|
"endchoice" BEGIN(PARAM); return T_ENDCHOICE;
|
||||||
|
"comment" BEGIN(PARAM); return T_COMMENT;
|
||||||
|
"config" BEGIN(PARAM); return T_CONFIG;
|
||||||
|
"menuconfig" BEGIN(PARAM); return T_MENUCONFIG;
|
||||||
|
"help" BEGIN(PARAM); return T_HELP;
|
||||||
|
"if" BEGIN(PARAM); return T_IF;
|
||||||
|
"endif" BEGIN(PARAM); return T_ENDIF;
|
||||||
|
"depends" BEGIN(PARAM); return T_DEPENDS;
|
||||||
|
"requires" BEGIN(PARAM); return T_REQUIRES;
|
||||||
|
"optional" BEGIN(PARAM); return T_OPTIONAL;
|
||||||
|
"default" BEGIN(PARAM); return T_DEFAULT;
|
||||||
|
"prompt" BEGIN(PARAM); return T_PROMPT;
|
||||||
|
"tristate" BEGIN(PARAM); return T_TRISTATE;
|
||||||
|
"def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE;
|
||||||
|
"bool" BEGIN(PARAM); return T_BOOLEAN;
|
||||||
|
"boolean" BEGIN(PARAM); return T_BOOLEAN;
|
||||||
|
"def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN;
|
||||||
|
"def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN;
|
||||||
|
"int" BEGIN(PARAM); return T_INT;
|
||||||
|
"hex" BEGIN(PARAM); return T_HEX;
|
||||||
|
"string" BEGIN(PARAM); return T_STRING;
|
||||||
|
"select" BEGIN(PARAM); return T_SELECT;
|
||||||
|
"enable" BEGIN(PARAM); return T_SELECT;
|
||||||
|
"range" BEGIN(PARAM); return T_RANGE;
|
||||||
|
{n}+ {
|
||||||
|
alloc_string(yytext, yyleng);
|
||||||
|
zconflval.string = text;
|
||||||
|
return T_WORD;
|
||||||
|
}
|
||||||
|
.
|
||||||
|
\n current_file->lineno++; BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
<PARAM>{
|
||||||
|
"&&" return T_AND;
|
||||||
|
"||" return T_OR;
|
||||||
|
"(" return T_OPEN_PAREN;
|
||||||
|
")" return T_CLOSE_PAREN;
|
||||||
|
"!" return T_NOT;
|
||||||
|
"=" return T_EQUAL;
|
||||||
|
"!=" return T_UNEQUAL;
|
||||||
|
"if" return T_IF;
|
||||||
|
"on" return T_ON;
|
||||||
|
\"|\' {
|
||||||
|
str = yytext[0];
|
||||||
|
new_string();
|
||||||
|
BEGIN(STRING);
|
||||||
|
}
|
||||||
|
\n BEGIN(INITIAL); current_file->lineno++; return T_EOL;
|
||||||
|
--- /* ignore */
|
||||||
|
({n}|[-/.])+ {
|
||||||
|
alloc_string(yytext, yyleng);
|
||||||
|
zconflval.string = text;
|
||||||
|
return T_WORD;
|
||||||
|
}
|
||||||
|
#.* /* comment */
|
||||||
|
\\\n current_file->lineno++;
|
||||||
|
.
|
||||||
|
<<EOF>> {
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<STRING>{
|
||||||
|
[^'"\\\n]+/\n {
|
||||||
|
append_string(yytext, yyleng);
|
||||||
|
zconflval.string = text;
|
||||||
|
return T_WORD_QUOTE;
|
||||||
|
}
|
||||||
|
[^'"\\\n]+ {
|
||||||
|
append_string(yytext, yyleng);
|
||||||
|
}
|
||||||
|
\\.?/\n {
|
||||||
|
append_string(yytext + 1, yyleng - 1);
|
||||||
|
zconflval.string = text;
|
||||||
|
return T_WORD_QUOTE;
|
||||||
|
}
|
||||||
|
\\.? {
|
||||||
|
append_string(yytext + 1, yyleng - 1);
|
||||||
|
}
|
||||||
|
\'|\" {
|
||||||
|
if (str == yytext[0]) {
|
||||||
|
BEGIN(PARAM);
|
||||||
|
zconflval.string = text;
|
||||||
|
return T_WORD_QUOTE;
|
||||||
|
} else
|
||||||
|
append_string(yytext, 1);
|
||||||
|
}
|
||||||
|
\n {
|
||||||
|
printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
|
||||||
|
current_file->lineno++;
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
return T_EOL;
|
||||||
|
}
|
||||||
|
<<EOF>> {
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<HELP>{
|
||||||
|
[ \t]+ {
|
||||||
|
ts = 0;
|
||||||
|
for (i = 0; i < yyleng; i++) {
|
||||||
|
if (yytext[i] == '\t')
|
||||||
|
ts = (ts & ~7) + 8;
|
||||||
|
else
|
||||||
|
ts++;
|
||||||
|
}
|
||||||
|
last_ts = ts;
|
||||||
|
if (first_ts) {
|
||||||
|
if (ts < first_ts) {
|
||||||
|
zconf_endhelp();
|
||||||
|
return T_HELPTEXT;
|
||||||
|
}
|
||||||
|
ts -= first_ts;
|
||||||
|
while (ts > 8) {
|
||||||
|
append_string(" ", 8);
|
||||||
|
ts -= 8;
|
||||||
|
}
|
||||||
|
append_string(" ", ts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[ \t]*\n/[^ \t\n] {
|
||||||
|
current_file->lineno++;
|
||||||
|
zconf_endhelp();
|
||||||
|
return T_HELPTEXT;
|
||||||
|
}
|
||||||
|
[ \t]*\n {
|
||||||
|
current_file->lineno++;
|
||||||
|
append_string("\n", 1);
|
||||||
|
}
|
||||||
|
[^ \t\n].* {
|
||||||
|
append_string(yytext, yyleng);
|
||||||
|
if (!first_ts)
|
||||||
|
first_ts = last_ts;
|
||||||
|
}
|
||||||
|
<<EOF>> {
|
||||||
|
zconf_endhelp();
|
||||||
|
return T_HELPTEXT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
<<EOF>> {
|
||||||
|
if (current_buf) {
|
||||||
|
zconf_endfile();
|
||||||
|
return T_EOF;
|
||||||
|
}
|
||||||
|
fclose(yyin);
|
||||||
|
yyterminate();
|
||||||
|
}
|
||||||
|
|
||||||
|
%%
|
||||||
|
void zconf_starthelp(void)
|
||||||
|
{
|
||||||
|
new_string();
|
||||||
|
last_ts = first_ts = 0;
|
||||||
|
BEGIN(HELP);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void zconf_endhelp(void)
|
||||||
|
{
|
||||||
|
zconflval.string = text;
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to open specified file with following names:
|
||||||
|
* ./name
|
||||||
|
* $(srctree)/name
|
||||||
|
* The latter is used when srctree is separate from objtree
|
||||||
|
* when compiling the kernel.
|
||||||
|
* Return NULL if file is not found.
|
||||||
|
*/
|
||||||
|
FILE *zconf_fopen(const char *name)
|
||||||
|
{
|
||||||
|
char *env, fullname[PATH_MAX+1];
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
f = fopen(name, "r");
|
||||||
|
if (!f && name[0] != '/') {
|
||||||
|
env = getenv(SRCTREE);
|
||||||
|
if (env) {
|
||||||
|
sprintf(fullname, "%s/%s", env, name);
|
||||||
|
f = fopen(fullname, "r");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void zconf_initscan(const char *name)
|
||||||
|
{
|
||||||
|
yyin = zconf_fopen(name);
|
||||||
|
if (!yyin) {
|
||||||
|
printf("can't find file %s\n", name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
current_buf = malloc(sizeof(*current_buf));
|
||||||
|
memset(current_buf, 0, sizeof(*current_buf));
|
||||||
|
|
||||||
|
current_file = file_lookup(name);
|
||||||
|
current_file->lineno = 1;
|
||||||
|
current_file->flags = FILE_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void zconf_nextfile(const char *name)
|
||||||
|
{
|
||||||
|
struct file *file = file_lookup(name);
|
||||||
|
struct buffer *buf = malloc(sizeof(*buf));
|
||||||
|
memset(buf, 0, sizeof(*buf));
|
||||||
|
|
||||||
|
current_buf->state = YY_CURRENT_BUFFER;
|
||||||
|
yyin = zconf_fopen(name);
|
||||||
|
if (!yyin) {
|
||||||
|
printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
|
||||||
|
buf->parent = current_buf;
|
||||||
|
current_buf = buf;
|
||||||
|
|
||||||
|
if (file->flags & FILE_BUSY) {
|
||||||
|
printf("recursive scan (%s)?\n", name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (file->flags & FILE_SCANNED) {
|
||||||
|
printf("file %s already scanned?\n", name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
file->flags |= FILE_BUSY;
|
||||||
|
file->lineno = 1;
|
||||||
|
file->parent = current_file;
|
||||||
|
current_file = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct buffer *zconf_endfile(void)
|
||||||
|
{
|
||||||
|
struct buffer *parent;
|
||||||
|
|
||||||
|
current_file->flags |= FILE_SCANNED;
|
||||||
|
current_file->flags &= ~FILE_BUSY;
|
||||||
|
current_file = current_file->parent;
|
||||||
|
|
||||||
|
parent = current_buf->parent;
|
||||||
|
if (parent) {
|
||||||
|
fclose(yyin);
|
||||||
|
yy_delete_buffer(YY_CURRENT_BUFFER);
|
||||||
|
yy_switch_to_buffer(parent->state);
|
||||||
|
}
|
||||||
|
free(current_buf);
|
||||||
|
current_buf = parent;
|
||||||
|
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
int zconf_lineno(void)
|
||||||
|
{
|
||||||
|
if (current_buf)
|
||||||
|
return current_file->lineno - 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *zconf_curname(void)
|
||||||
|
{
|
||||||
|
if (current_buf)
|
||||||
|
return current_file->name;
|
||||||
|
else
|
||||||
|
return "<none>";
|
||||||
|
}
|
2127
package/config/zconf.tab.c_shipped
Normal file
2127
package/config/zconf.tab.c_shipped
Normal file
File diff suppressed because it is too large
Load Diff
125
package/config/zconf.tab.h_shipped
Normal file
125
package/config/zconf.tab.h_shipped
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/* A Bison parser, made from zconf.y, by GNU bison 1.75. */
|
||||||
|
|
||||||
|
/* Skeleton parser for Yacc-like parsing with Bison,
|
||||||
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, when this file is copied by Bison into a
|
||||||
|
Bison output file, you may use that output file without restriction.
|
||||||
|
This special exception was added by the Free Software Foundation
|
||||||
|
in version 1.24 of Bison. */
|
||||||
|
|
||||||
|
#ifndef BISON_ZCONF_TAB_H
|
||||||
|
# define BISON_ZCONF_TAB_H
|
||||||
|
|
||||||
|
/* Tokens. */
|
||||||
|
#ifndef YYTOKENTYPE
|
||||||
|
# define YYTOKENTYPE
|
||||||
|
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||||
|
know about them. */
|
||||||
|
enum yytokentype {
|
||||||
|
T_MAINMENU = 258,
|
||||||
|
T_MENU = 259,
|
||||||
|
T_ENDMENU = 260,
|
||||||
|
T_SOURCE = 261,
|
||||||
|
T_CHOICE = 262,
|
||||||
|
T_ENDCHOICE = 263,
|
||||||
|
T_COMMENT = 264,
|
||||||
|
T_CONFIG = 265,
|
||||||
|
T_HELP = 266,
|
||||||
|
T_HELPTEXT = 267,
|
||||||
|
T_IF = 268,
|
||||||
|
T_ENDIF = 269,
|
||||||
|
T_DEPENDS = 270,
|
||||||
|
T_REQUIRES = 271,
|
||||||
|
T_OPTIONAL = 272,
|
||||||
|
T_PROMPT = 273,
|
||||||
|
T_DEFAULT = 274,
|
||||||
|
T_TRISTATE = 275,
|
||||||
|
T_BOOLEAN = 276,
|
||||||
|
T_INT = 277,
|
||||||
|
T_HEX = 278,
|
||||||
|
T_WORD = 279,
|
||||||
|
T_STRING = 280,
|
||||||
|
T_UNEQUAL = 281,
|
||||||
|
T_EOF = 282,
|
||||||
|
T_EOL = 283,
|
||||||
|
T_CLOSE_PAREN = 284,
|
||||||
|
T_OPEN_PAREN = 285,
|
||||||
|
T_ON = 286,
|
||||||
|
T_OR = 287,
|
||||||
|
T_AND = 288,
|
||||||
|
T_EQUAL = 289,
|
||||||
|
T_NOT = 290
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#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_HELP 266
|
||||||
|
#define T_HELPTEXT 267
|
||||||
|
#define T_IF 268
|
||||||
|
#define T_ENDIF 269
|
||||||
|
#define T_DEPENDS 270
|
||||||
|
#define T_REQUIRES 271
|
||||||
|
#define T_OPTIONAL 272
|
||||||
|
#define T_PROMPT 273
|
||||||
|
#define T_DEFAULT 274
|
||||||
|
#define T_TRISTATE 275
|
||||||
|
#define T_BOOLEAN 276
|
||||||
|
#define T_INT 277
|
||||||
|
#define T_HEX 278
|
||||||
|
#define T_WORD 279
|
||||||
|
#define T_STRING 280
|
||||||
|
#define T_UNEQUAL 281
|
||||||
|
#define T_EOF 282
|
||||||
|
#define T_EOL 283
|
||||||
|
#define T_CLOSE_PAREN 284
|
||||||
|
#define T_OPEN_PAREN 285
|
||||||
|
#define T_ON 286
|
||||||
|
#define T_OR 287
|
||||||
|
#define T_AND 288
|
||||||
|
#define T_EQUAL 289
|
||||||
|
#define T_NOT 290
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef YYSTYPE
|
||||||
|
#line 33 "zconf.y"
|
||||||
|
typedef union {
|
||||||
|
int token;
|
||||||
|
char *string;
|
||||||
|
struct symbol *symbol;
|
||||||
|
struct expr *expr;
|
||||||
|
struct menu *menu;
|
||||||
|
} yystype;
|
||||||
|
/* Line 1281 of /usr/share/bison/yacc.c. */
|
||||||
|
#line 118 "zconf.tab.h"
|
||||||
|
# define YYSTYPE yystype
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern YYSTYPE zconflval;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* not BISON_ZCONF_TAB_H */
|
||||||
|
|
687
package/config/zconf.y
Normal file
687
package/config/zconf.y
Normal file
@ -0,0 +1,687 @@
|
|||||||
|
%{
|
||||||
|
/*
|
||||||
|
* 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 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 zconferror(const char *err);
|
||||||
|
static bool zconf_endtoken(int token, int starttoken, int endtoken);
|
||||||
|
|
||||||
|
struct symbol *symbol_hash[257];
|
||||||
|
|
||||||
|
#define YYERROR_VERBOSE
|
||||||
|
%}
|
||||||
|
%expect 40
|
||||||
|
|
||||||
|
%union
|
||||||
|
{
|
||||||
|
int token;
|
||||||
|
char *string;
|
||||||
|
struct symbol *symbol;
|
||||||
|
struct expr *expr;
|
||||||
|
struct menu *menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
%token T_MAINMENU
|
||||||
|
%token T_MENU
|
||||||
|
%token T_ENDMENU
|
||||||
|
%token T_SOURCE
|
||||||
|
%token T_CHOICE
|
||||||
|
%token T_ENDCHOICE
|
||||||
|
%token T_COMMENT
|
||||||
|
%token T_CONFIG
|
||||||
|
%token T_MENUCONFIG
|
||||||
|
%token T_HELP
|
||||||
|
%token <string> T_HELPTEXT
|
||||||
|
%token T_IF
|
||||||
|
%token T_ENDIF
|
||||||
|
%token T_DEPENDS
|
||||||
|
%token T_REQUIRES
|
||||||
|
%token T_OPTIONAL
|
||||||
|
%token T_PROMPT
|
||||||
|
%token T_DEFAULT
|
||||||
|
%token T_TRISTATE
|
||||||
|
%token T_DEF_TRISTATE
|
||||||
|
%token T_BOOLEAN
|
||||||
|
%token T_DEF_BOOLEAN
|
||||||
|
%token T_STRING
|
||||||
|
%token T_INT
|
||||||
|
%token T_HEX
|
||||||
|
%token <string> T_WORD
|
||||||
|
%token <string> T_WORD_QUOTE
|
||||||
|
%token T_UNEQUAL
|
||||||
|
%token T_EOF
|
||||||
|
%token T_EOL
|
||||||
|
%token T_CLOSE_PAREN
|
||||||
|
%token T_OPEN_PAREN
|
||||||
|
%token T_ON
|
||||||
|
%token T_SELECT
|
||||||
|
%token T_RANGE
|
||||||
|
|
||||||
|
%left T_OR
|
||||||
|
%left T_AND
|
||||||
|
%left T_EQUAL T_UNEQUAL
|
||||||
|
%nonassoc T_NOT
|
||||||
|
|
||||||
|
%type <string> prompt
|
||||||
|
%type <string> source
|
||||||
|
%type <symbol> symbol
|
||||||
|
%type <expr> expr
|
||||||
|
%type <expr> if_expr
|
||||||
|
%type <token> end
|
||||||
|
|
||||||
|
%{
|
||||||
|
#define LKC_DIRECT_LINK
|
||||||
|
#include "lkc.h"
|
||||||
|
%}
|
||||||
|
%%
|
||||||
|
input: /* empty */
|
||||||
|
| input block
|
||||||
|
;
|
||||||
|
|
||||||
|
block: common_block
|
||||||
|
| choice_stmt
|
||||||
|
| menu_stmt
|
||||||
|
| T_MAINMENU prompt nl_or_eof
|
||||||
|
| T_ENDMENU { zconfprint("unexpected 'endmenu' statement"); }
|
||||||
|
| T_ENDIF { zconfprint("unexpected 'endif' statement"); }
|
||||||
|
| T_ENDCHOICE { zconfprint("unexpected 'endchoice' statement"); }
|
||||||
|
| error nl_or_eof { zconfprint("syntax error"); yyerrok; }
|
||||||
|
;
|
||||||
|
|
||||||
|
common_block:
|
||||||
|
if_stmt
|
||||||
|
| comment_stmt
|
||||||
|
| config_stmt
|
||||||
|
| menuconfig_stmt
|
||||||
|
| source_stmt
|
||||||
|
| nl_or_eof
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* config/menuconfig entry */
|
||||||
|
|
||||||
|
config_entry_start: T_CONFIG T_WORD T_EOL
|
||||||
|
{
|
||||||
|
struct symbol *sym = sym_lookup($2, 0);
|
||||||
|
sym->flags |= SYMBOL_OPTIONAL;
|
||||||
|
menu_add_entry(sym);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
|
||||||
|
};
|
||||||
|
|
||||||
|
config_stmt: config_entry_start config_option_list
|
||||||
|
{
|
||||||
|
menu_end_entry();
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
|
||||||
|
{
|
||||||
|
struct symbol *sym = sym_lookup($2, 0);
|
||||||
|
sym->flags |= SYMBOL_OPTIONAL;
|
||||||
|
menu_add_entry(sym);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
|
||||||
|
};
|
||||||
|
|
||||||
|
menuconfig_stmt: menuconfig_entry_start config_option_list
|
||||||
|
{
|
||||||
|
if (current_entry->prompt)
|
||||||
|
current_entry->prompt->type = P_MENU;
|
||||||
|
else
|
||||||
|
zconfprint("warning: menuconfig statement without prompt");
|
||||||
|
menu_end_entry();
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option_list:
|
||||||
|
/* empty */
|
||||||
|
| config_option_list config_option
|
||||||
|
| config_option_list depends
|
||||||
|
| config_option_list help
|
||||||
|
| config_option_list T_EOL
|
||||||
|
;
|
||||||
|
|
||||||
|
config_option: T_TRISTATE prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_TRISTATE);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_DEF_TRISTATE expr if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_expr(P_DEFAULT, $2, $3);
|
||||||
|
menu_set_type(S_TRISTATE);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_BOOLEAN prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_BOOLEAN);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_DEF_BOOLEAN expr if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_expr(P_DEFAULT, $2, $3);
|
||||||
|
menu_set_type(S_BOOLEAN);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_INT prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_INT);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_HEX prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_HEX);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_STRING prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_STRING);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_PROMPT prompt if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_prompt(P_PROMPT, $2, $3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_DEFAULT expr if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_expr(P_DEFAULT, $2, $3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_SELECT T_WORD if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
config_option: T_RANGE symbol symbol if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
/* choice entry */
|
||||||
|
|
||||||
|
choice: T_CHOICE T_EOL
|
||||||
|
{
|
||||||
|
struct symbol *sym = sym_lookup(NULL, 0);
|
||||||
|
sym->flags |= SYMBOL_CHOICE;
|
||||||
|
menu_add_entry(sym);
|
||||||
|
menu_add_expr(P_CHOICE, NULL, NULL);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_entry: choice choice_option_list
|
||||||
|
{
|
||||||
|
menu_end_entry();
|
||||||
|
menu_add_menu();
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_end: end
|
||||||
|
{
|
||||||
|
if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
|
||||||
|
menu_end_menu();
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_stmt:
|
||||||
|
choice_entry choice_block choice_end
|
||||||
|
| choice_entry choice_block
|
||||||
|
{
|
||||||
|
printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
|
||||||
|
zconfnerrs++;
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_option_list:
|
||||||
|
/* empty */
|
||||||
|
| choice_option_list choice_option
|
||||||
|
| choice_option_list depends
|
||||||
|
| choice_option_list help
|
||||||
|
| choice_option_list T_EOL
|
||||||
|
;
|
||||||
|
|
||||||
|
choice_option: T_PROMPT prompt if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_prompt(P_PROMPT, $2, $3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_option: T_TRISTATE prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_TRISTATE);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
|
||||||
|
{
|
||||||
|
menu_set_type(S_BOOLEAN);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_option: T_OPTIONAL T_EOL
|
||||||
|
{
|
||||||
|
current_entry->sym->flags |= SYMBOL_OPTIONAL;
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_option: T_DEFAULT T_WORD if_expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
choice_block:
|
||||||
|
/* empty */
|
||||||
|
| choice_block common_block
|
||||||
|
;
|
||||||
|
|
||||||
|
/* if entry */
|
||||||
|
|
||||||
|
if: T_IF expr T_EOL
|
||||||
|
{
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
|
||||||
|
menu_add_entry(NULL);
|
||||||
|
menu_add_dep($2);
|
||||||
|
menu_end_entry();
|
||||||
|
menu_add_menu();
|
||||||
|
};
|
||||||
|
|
||||||
|
if_end: end
|
||||||
|
{
|
||||||
|
if (zconf_endtoken($1, T_IF, T_ENDIF)) {
|
||||||
|
menu_end_menu();
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if_stmt:
|
||||||
|
if if_block if_end
|
||||||
|
| if if_block
|
||||||
|
{
|
||||||
|
printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
|
||||||
|
zconfnerrs++;
|
||||||
|
};
|
||||||
|
|
||||||
|
if_block:
|
||||||
|
/* empty */
|
||||||
|
| if_block common_block
|
||||||
|
| if_block menu_stmt
|
||||||
|
| if_block choice_stmt
|
||||||
|
;
|
||||||
|
|
||||||
|
/* menu entry */
|
||||||
|
|
||||||
|
menu: T_MENU prompt T_EOL
|
||||||
|
{
|
||||||
|
menu_add_entry(NULL);
|
||||||
|
menu_add_prop(P_MENU, $2, NULL, NULL);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_entry: menu depends_list
|
||||||
|
{
|
||||||
|
menu_end_entry();
|
||||||
|
menu_add_menu();
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_end: end
|
||||||
|
{
|
||||||
|
if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
|
||||||
|
menu_end_menu();
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_stmt:
|
||||||
|
menu_entry menu_block menu_end
|
||||||
|
| menu_entry menu_block
|
||||||
|
{
|
||||||
|
printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
|
||||||
|
zconfnerrs++;
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_block:
|
||||||
|
/* empty */
|
||||||
|
| menu_block common_block
|
||||||
|
| menu_block menu_stmt
|
||||||
|
| menu_block choice_stmt
|
||||||
|
| menu_block error T_EOL { zconfprint("invalid menu option"); yyerrok; }
|
||||||
|
;
|
||||||
|
|
||||||
|
source: T_SOURCE prompt T_EOL
|
||||||
|
{
|
||||||
|
$$ = $2;
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
|
||||||
|
};
|
||||||
|
|
||||||
|
source_stmt: source
|
||||||
|
{
|
||||||
|
zconf_nextfile($1);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* comment entry */
|
||||||
|
|
||||||
|
comment: T_COMMENT prompt T_EOL
|
||||||
|
{
|
||||||
|
menu_add_entry(NULL);
|
||||||
|
menu_add_prop(P_COMMENT, $2, NULL, NULL);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
comment_stmt: comment depends_list
|
||||||
|
{
|
||||||
|
menu_end_entry();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* help option */
|
||||||
|
|
||||||
|
help_start: T_HELP T_EOL
|
||||||
|
{
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
|
||||||
|
zconf_starthelp();
|
||||||
|
};
|
||||||
|
|
||||||
|
help: help_start T_HELPTEXT
|
||||||
|
{
|
||||||
|
current_entry->sym->help = $2;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* depends option */
|
||||||
|
|
||||||
|
depends_list: /* empty */
|
||||||
|
| depends_list depends
|
||||||
|
| depends_list T_EOL
|
||||||
|
;
|
||||||
|
|
||||||
|
depends: T_DEPENDS T_ON expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_dep($3);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
|
||||||
|
}
|
||||||
|
| T_DEPENDS expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_dep($2);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
|
||||||
|
}
|
||||||
|
| T_REQUIRES expr T_EOL
|
||||||
|
{
|
||||||
|
menu_add_dep($2);
|
||||||
|
printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
|
||||||
|
};
|
||||||
|
|
||||||
|
/* prompt statement */
|
||||||
|
|
||||||
|
prompt_stmt_opt:
|
||||||
|
/* empty */
|
||||||
|
| prompt if_expr
|
||||||
|
{
|
||||||
|
menu_add_prop(P_PROMPT, $1, NULL, $2);
|
||||||
|
};
|
||||||
|
|
||||||
|
prompt: T_WORD
|
||||||
|
| T_WORD_QUOTE
|
||||||
|
;
|
||||||
|
|
||||||
|
end: T_ENDMENU nl_or_eof { $$ = T_ENDMENU; }
|
||||||
|
| T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; }
|
||||||
|
| T_ENDIF nl_or_eof { $$ = T_ENDIF; }
|
||||||
|
;
|
||||||
|
|
||||||
|
nl_or_eof:
|
||||||
|
T_EOL | T_EOF;
|
||||||
|
|
||||||
|
if_expr: /* empty */ { $$ = NULL; }
|
||||||
|
| T_IF expr { $$ = $2; }
|
||||||
|
;
|
||||||
|
|
||||||
|
expr: symbol { $$ = expr_alloc_symbol($1); }
|
||||||
|
| symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
|
||||||
|
| symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
|
||||||
|
| T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; }
|
||||||
|
| T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); }
|
||||||
|
| expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); }
|
||||||
|
| expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); }
|
||||||
|
;
|
||||||
|
|
||||||
|
symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); }
|
||||||
|
| T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); }
|
||||||
|
;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
void conf_parse(const char *name)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
zconf_initscan(name);
|
||||||
|
|
||||||
|
sym_init();
|
||||||
|
menu_init();
|
||||||
|
modules_sym = sym_lookup("MODULES", 0);
|
||||||
|
rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL);
|
||||||
|
|
||||||
|
//zconfdebug = 1;
|
||||||
|
zconfparse();
|
||||||
|
if (zconfnerrs)
|
||||||
|
exit(1);
|
||||||
|
menu_finalize(&rootmenu);
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
|
||||||
|
printf("\n");
|
||||||
|
else
|
||||||
|
sym->flags |= SYMBOL_CHECK_DONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym_change_count = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *zconf_tokenname(int token)
|
||||||
|
{
|
||||||
|
switch (token) {
|
||||||
|
case T_MENU: return "menu";
|
||||||
|
case T_ENDMENU: return "endmenu";
|
||||||
|
case T_CHOICE: return "choice";
|
||||||
|
case T_ENDCHOICE: return "endchoice";
|
||||||
|
case T_IF: return "if";
|
||||||
|
case T_ENDIF: return "endif";
|
||||||
|
}
|
||||||
|
return "<token>";
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool zconf_endtoken(int token, int starttoken, int endtoken)
|
||||||
|
{
|
||||||
|
if (token != endtoken) {
|
||||||
|
zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
|
||||||
|
zconfnerrs++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (current_menu->file != current_file) {
|
||||||
|
zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
|
||||||
|
zconfprint("location of the '%s'", zconf_tokenname(starttoken));
|
||||||
|
zconfnerrs++;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void zconfprint(const char *err, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
|
||||||
|
va_start(ap, err);
|
||||||
|
vfprintf(stderr, err, ap);
|
||||||
|
va_end(ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void zconferror(const char *err)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_quoted_string(FILE *out, const char *str)
|
||||||
|
{
|
||||||
|
const char *p;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
putc('"', out);
|
||||||
|
while ((p = strchr(str, '"'))) {
|
||||||
|
len = p - str;
|
||||||
|
if (len)
|
||||||
|
fprintf(out, "%.*s", len, str);
|
||||||
|
fputs("\\\"", out);
|
||||||
|
str = p + 1;
|
||||||
|
}
|
||||||
|
fputs(str, out);
|
||||||
|
putc('"', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_symbol(FILE *out, struct menu *menu)
|
||||||
|
{
|
||||||
|
struct symbol *sym = menu->sym;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
if (sym_is_choice(sym))
|
||||||
|
fprintf(out, "choice\n");
|
||||||
|
else
|
||||||
|
fprintf(out, "config %s\n", sym->name);
|
||||||
|
switch (sym->type) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
fputs(" boolean\n", out);
|
||||||
|
break;
|
||||||
|
case S_TRISTATE:
|
||||||
|
fputs(" tristate\n", out);
|
||||||
|
break;
|
||||||
|
case S_STRING:
|
||||||
|
fputs(" string\n", out);
|
||||||
|
break;
|
||||||
|
case S_INT:
|
||||||
|
fputs(" integer\n", out);
|
||||||
|
break;
|
||||||
|
case S_HEX:
|
||||||
|
fputs(" hex\n", out);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fputs(" ???\n", out);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (prop = sym->prop; prop; prop = prop->next) {
|
||||||
|
if (prop->menu != menu)
|
||||||
|
continue;
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_PROMPT:
|
||||||
|
fputs(" prompt ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
fputs(" if ", out);
|
||||||
|
expr_fprint(prop->visible.expr, out);
|
||||||
|
}
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_DEFAULT:
|
||||||
|
fputs( " default ", out);
|
||||||
|
expr_fprint(prop->expr, out);
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
fputs(" if ", out);
|
||||||
|
expr_fprint(prop->visible.expr, out);
|
||||||
|
}
|
||||||
|
fputc('\n', out);
|
||||||
|
break;
|
||||||
|
case P_CHOICE:
|
||||||
|
fputs(" #choice value\n", out);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(out, " unknown prop %d!\n", prop->type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sym->help) {
|
||||||
|
int len = strlen(sym->help);
|
||||||
|
while (sym->help[--len] == '\n')
|
||||||
|
sym->help[len] = 0;
|
||||||
|
fprintf(out, " help\n%s\n", sym->help);
|
||||||
|
}
|
||||||
|
fputc('\n', out);
|
||||||
|
}
|
||||||
|
|
||||||
|
void zconfdump(FILE *out)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct menu *menu;
|
||||||
|
|
||||||
|
menu = rootmenu.list;
|
||||||
|
while (menu) {
|
||||||
|
if ((sym = menu->sym))
|
||||||
|
print_symbol(out, menu);
|
||||||
|
else if ((prop = menu->prompt)) {
|
||||||
|
switch (prop->type) {
|
||||||
|
case P_COMMENT:
|
||||||
|
fputs("\ncomment ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputs("\n", out);
|
||||||
|
break;
|
||||||
|
case P_MENU:
|
||||||
|
fputs("\nmenu ", out);
|
||||||
|
print_quoted_string(out, prop->text);
|
||||||
|
fputs("\n", out);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
fputs(" depends ", out);
|
||||||
|
expr_fprint(prop->visible.expr, out);
|
||||||
|
fputc('\n', out);
|
||||||
|
}
|
||||||
|
fputs("\n", out);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (menu->list)
|
||||||
|
menu = menu->list;
|
||||||
|
else if (menu->next)
|
||||||
|
menu = menu->next;
|
||||||
|
else while ((menu = menu->parent)) {
|
||||||
|
if (menu->prompt && menu->prompt->type == P_MENU)
|
||||||
|
fputs("\nendmenu\n", out);
|
||||||
|
if (menu->next) {
|
||||||
|
menu = menu->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "lex.zconf.c"
|
||||||
|
#include "confdata.c"
|
||||||
|
#include "expr.c"
|
||||||
|
#include "symbol.c"
|
||||||
|
#include "menu.c"
|
8
package/dnsmasq/Config.in
Normal file
8
package/dnsmasq/Config.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
config BR2_PACKAGE_DNSMASQ
|
||||||
|
bool "dnsmasq"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
A lightweight DNS and DHCP server. It is intended to provide
|
||||||
|
coupled DNS and DHCP service to a LAN.
|
||||||
|
|
||||||
|
http://www.thekelleys.org.uk/dnsmasq/
|
3
package/dnsmasq/Makefile.in
Normal file
3
package/dnsmasq/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_DNSMASQ)),y)
|
||||||
|
TARGETS+=dnsmasq
|
||||||
|
endif
|
50
package/dnsmasq/dnsmasq.mk
Normal file
50
package/dnsmasq/dnsmasq.mk
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# dnsmasq
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
|
||||||
|
DNSMASQ_SITE=http://thekelleys.org.uk/dnsmasq
|
||||||
|
ifeq ($(filter $(TARGETS),dnsmasq1),)
|
||||||
|
DNSMASQ_SOURCE=dnsmasq-2.15.tar.gz
|
||||||
|
DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-2.15
|
||||||
|
DNSMASQ_VER=dnsmasq2
|
||||||
|
else
|
||||||
|
DNSMASQ_SOURCE=dnsmasq-1.18.tar.gz
|
||||||
|
DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-1.18
|
||||||
|
DNSMASQ_VER=dnsmasq1
|
||||||
|
endif
|
||||||
|
DNSMASQ_BINARY=dnsmasq
|
||||||
|
DNSMASQ_TARGET_BINARY=usr/sbin/dnsmasq
|
||||||
|
|
||||||
|
$(DL_DIR)/$(DNSMASQ_SOURCE):
|
||||||
|
$(WGET) -P $(DL_DIR) $(DNSMASQ_SITE)/$(DNSMASQ_SOURCE)
|
||||||
|
|
||||||
|
$(DNSMASQ_DIR)/.source: $(DL_DIR)/$(DNSMASQ_SOURCE)
|
||||||
|
zcat $(DL_DIR)/$(DNSMASQ_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
toolchain/patch-kernel.sh $(DNSMASQ_DIR) package/dnsmasq/ \
|
||||||
|
$(DNSMASQ_VER)-\*.patch
|
||||||
|
touch $(DNSMASQ_DIR)/.source
|
||||||
|
|
||||||
|
$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source
|
||||||
|
$(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR)
|
||||||
|
|
||||||
|
$(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY): $(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY)
|
||||||
|
$(MAKE) BINDIR=/usr/sbin MANDIR=/usr/man \
|
||||||
|
DESTDIR=$(TARGET_DIR) -C $(DNSMASQ_DIR) install
|
||||||
|
$(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
|
||||||
|
rm -rf $(TARGET_DIR)/usr/man
|
||||||
|
|
||||||
|
dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
|
||||||
|
|
||||||
|
dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
|
||||||
|
|
||||||
|
dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE)
|
||||||
|
|
||||||
|
dnsmasq-clean:
|
||||||
|
#$(MAKE) prefix=$(TARGET_DIR)/usr -C $(DNSMASQ_DIR) uninstall
|
||||||
|
-$(MAKE) -C $(DNSMASQ_DIR) clean
|
||||||
|
|
||||||
|
dnsmasq-dirclean:
|
||||||
|
rm -rf $(DNSMASQ_DIR)
|
25
package/dnsmasq/dnsmasq1-100-bugfix.patch
Normal file
25
package/dnsmasq/dnsmasq1-100-bugfix.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
--- dnsmasq-1.18/config.h.dist 2004-03-01 22:25:12.000000000 -0600
|
||||||
|
+++ dnsmasq-1.18/config.h 2004-03-01 22:26:50.000000000 -0600
|
||||||
|
@@ -126,7 +126,9 @@
|
||||||
|
|
||||||
|
/* Must preceed __linux__ since uClinux defines __linux__ too. */
|
||||||
|
#if defined(__uClinux__) || defined(__UCLIBC__)
|
||||||
|
+#ifndef __UCLIBC_HAS_IPV6__
|
||||||
|
#undef HAVE_LINUX_IPV6_PROC
|
||||||
|
+#endif
|
||||||
|
#define HAVE_GETOPT_LONG
|
||||||
|
#undef HAVE_ARC4RANDOM
|
||||||
|
#define HAVE_RANDOM
|
||||||
|
diff -x CVS -urN dnsmasq-1.18/option.c dnsmasq.old/option.c
|
||||||
|
--- dnsmasq-1.18/option.c 2003-11-05 08:22:18.000000000 -0600
|
||||||
|
+++ dnsmasq.old/option.c 2004-01-05 23:40:11.000000000 -0600
|
||||||
|
@@ -578,8 +578,8 @@
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
else if (tmp->source_addr.sa.sa_family == AF_INET6)
|
||||||
|
tmp->source_addr.in6.sin6_port = htons(*query_port);
|
||||||
|
- }
|
||||||
|
#endif
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*if_addrs)
|
49
package/dnsmasq/dnsmasq2-100-config.patch
Normal file
49
package/dnsmasq/dnsmasq2-100-config.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
diff -ur dnsmasq-2.15.orig/src/config.h dnsmasq-2.15/src/config.h
|
||||||
|
--- dnsmasq-2.15.orig/src/config.h 2004-10-08 11:41:34.757371880 -0400
|
||||||
|
+++ dnsmasq-2.15/src/config.h 2004-10-08 11:43:49.074952504 -0400
|
||||||
|
@@ -78,6 +78,11 @@
|
||||||
|
/* We assume that systems which don't have IPv6
|
||||||
|
headers don't have ntop and pton either */
|
||||||
|
|
||||||
|
+#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_IPV6__)
|
||||||
|
+# undef NO_IPV6
|
||||||
|
+# define NO_IPV6
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6)
|
||||||
|
# define HAVE_IPV6
|
||||||
|
# define ADDRSTRLEN INET6_ADDRSTRLEN
|
||||||
|
@@ -194,7 +199,7 @@
|
||||||
|
/* platform dependent options. */
|
||||||
|
|
||||||
|
/* Must preceed __linux__ since uClinux defines __linux__ too. */
|
||||||
|
-#if defined(__uClinux__) || defined(__UCLIBC__)
|
||||||
|
+#if defined(__uClinux__)
|
||||||
|
#undef HAVE_LINUX_IPV6_PROC
|
||||||
|
#define HAVE_GETOPT_LONG
|
||||||
|
#undef HAVE_ARC4RANDOM
|
||||||
|
@@ -208,6 +213,24 @@
|
||||||
|
# define NO_FORK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#elif defined(__linux__) && defined(__UCLIBC__)
|
||||||
|
+# define HAVE_LINUX_IPV6_PROC
|
||||||
|
+# if defined(__UCLIBC_HAS_GNU_GETOPT__) || \
|
||||||
|
+ ((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21))
|
||||||
|
+# define HAVE_GETOPT_LONG
|
||||||
|
+# else
|
||||||
|
+# undef HAVE_GETOPT_LONG
|
||||||
|
+# endif
|
||||||
|
+#undef HAVE_ARC4RANDOM
|
||||||
|
+#define HAVE_RANDOM
|
||||||
|
+#define HAVE_DEV_URANDOM
|
||||||
|
+#define HAVE_DEV_RANDOM
|
||||||
|
+#undef HAVE_SOCKADDR_SA_LEN
|
||||||
|
+#undef HAVE_PSELECT
|
||||||
|
+#if !defined(__ARCH_HAS_MMU__)
|
||||||
|
+# define NO_FORK
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* libc5 - must precede __linux__ too */
|
||||||
|
/* Note to build a libc5 binary on a modern Debian system:
|
||||||
|
install the packages altgcc libc5 and libc5-altdev
|
7
package/dropbear_sshd/Config.in
Normal file
7
package/dropbear_sshd/Config.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
config BR2_PACKAGE_DROPBEAR_SSHD
|
||||||
|
bool "dropbear_sshd"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
A small SSH 2 server designed for small memory environments.
|
||||||
|
|
||||||
|
http://matt.ucc.asn.au/dropbear/
|
3
package/dropbear_sshd/Makefile.in
Normal file
3
package/dropbear_sshd/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_DROPBEAR_SSHD)),y)
|
||||||
|
TARGETS+=dropbear_sshd
|
||||||
|
endif
|
59
package/dropbear_sshd/dropbear-init.patch
Normal file
59
package/dropbear_sshd/dropbear-init.patch
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
--- dropbear-0.42/S50dropbear
|
||||||
|
+++ dropbear-0.42/S50dropbear
|
||||||
|
@@ -0,0 +1,56 @@
|
||||||
|
+#!/bin/sh
|
||||||
|
+#
|
||||||
|
+# Starts dropbear sshd.
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+# Make sure the dropbearkey progam exists
|
||||||
|
+[ -f /usr/bin/dropbearkey ] || exit 0
|
||||||
|
+
|
||||||
|
+# Check for the Dropbear RSA key
|
||||||
|
+if [ ! -f /etc/dropbear/dropbear_rsa_host_key ] ; then
|
||||||
|
+ echo Generating RSA Key...
|
||||||
|
+ mkdir -p /etc/dropbear
|
||||||
|
+ /usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+# Check for the Dropbear DSS key
|
||||||
|
+if [ ! -f /etc/dropbear/dropbear_dss_host_key ] ; then
|
||||||
|
+ echo Generating DSS Key...
|
||||||
|
+ mkdir -p /etc/dropbear
|
||||||
|
+ /usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+umask 077
|
||||||
|
+
|
||||||
|
+start() {
|
||||||
|
+ echo -n "Starting dropbear sshd: "
|
||||||
|
+ start-stop-daemon --start --quiet --pidfile /var/run/dropbear.pid --exec /usr/sbin/dropbear
|
||||||
|
+ echo "OK"
|
||||||
|
+}
|
||||||
|
+stop() {
|
||||||
|
+ echo -n "Stopping sshd: "
|
||||||
|
+ start-stop-daemon --stop --quiet --pidfile /var/run/dropbear.pid
|
||||||
|
+ echo "OK"
|
||||||
|
+}
|
||||||
|
+restart() {
|
||||||
|
+ stop
|
||||||
|
+ start
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+case "$1" in
|
||||||
|
+ start)
|
||||||
|
+ start
|
||||||
|
+ ;;
|
||||||
|
+ stop)
|
||||||
|
+ stop
|
||||||
|
+ ;;
|
||||||
|
+ restart|reload)
|
||||||
|
+ restart
|
||||||
|
+ ;;
|
||||||
|
+ *)
|
||||||
|
+ echo $"Usage: $0 {start|stop|restart}"
|
||||||
|
+ exit 1
|
||||||
|
+esac
|
||||||
|
+
|
||||||
|
+exit $?
|
||||||
|
+
|
79
package/dropbear_sshd/dropbear_sshd.mk
Normal file
79
package/dropbear_sshd/dropbear_sshd.mk
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# dropbear_sshd
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
DROPBEAR_SSHD_SOURCE:=dropbear-0.44.tar.bz2
|
||||||
|
DROPBEAR_SSHD_SITE:=http://matt.ucc.asn.au/dropbear/releases/
|
||||||
|
DROPBEAR_SSHD_DIR:=$(BUILD_DIR)/dropbear-0.44
|
||||||
|
DROPBEAR_SSHD_CAT:=bzcat
|
||||||
|
DROPBEAR_SSHD_BINARY:=dropbearmulti
|
||||||
|
DROPBEAR_SSHD_TARGET_BINARY:=usr/sbin/dropbear
|
||||||
|
|
||||||
|
|
||||||
|
$(DL_DIR)/$(DROPBEAR_SSHD_SOURCE):
|
||||||
|
$(WGET) -P $(DL_DIR) $(DROPBEAR_SSHD_SITE)/$(DROPBEAR_SSHD_SOURCE)
|
||||||
|
|
||||||
|
dropbear_sshd-source: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE)
|
||||||
|
|
||||||
|
$(DROPBEAR_SSHD_DIR)/.unpacked: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE)
|
||||||
|
$(DROPBEAR_SSHD_CAT) $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
toolchain/patch-kernel.sh $(DROPBEAR_SSHD_DIR) package/dropbear_sshd/ dropbear-\*.patch
|
||||||
|
$(SED) 's,^/\* #define DROPBEAR_MULTI.*,#define DROPBEAR_MULTI,g' $(DROPBEAR_SSHD_DIR)/options.h
|
||||||
|
touch $(DROPBEAR_SSHD_DIR)/.unpacked
|
||||||
|
|
||||||
|
$(DROPBEAR_SSHD_DIR)/.configured: $(DROPBEAR_SSHD_DIR)/.unpacked
|
||||||
|
(cd $(DROPBEAR_SSHD_DIR); rm -rf config.cache; \
|
||||||
|
autoconf; \
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
CFLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
./configure \
|
||||||
|
--target=$(GNU_TARGET_NAME) \
|
||||||
|
--host=$(GNU_TARGET_NAME) \
|
||||||
|
--build=$(GNU_HOST_NAME) \
|
||||||
|
--prefix=/usr \
|
||||||
|
--exec-prefix=/usr \
|
||||||
|
--bindir=/usr/bin \
|
||||||
|
--sbindir=/usr/sbin \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--sysconfdir=/etc \
|
||||||
|
--datadir=/usr/share \
|
||||||
|
--localstatedir=/var \
|
||||||
|
--mandir=/usr/man \
|
||||||
|
--infodir=/usr/info \
|
||||||
|
$(DISABLE_NLS) \
|
||||||
|
--with-shared \
|
||||||
|
);
|
||||||
|
touch $(DROPBEAR_SSHD_DIR)/.configured
|
||||||
|
|
||||||
|
$(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY): $(DROPBEAR_SSHD_DIR)/.configured
|
||||||
|
$(MAKE) $(TARGET_CONFIGURE_OPTS) LD=$(TARGET_CC) \
|
||||||
|
PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" \
|
||||||
|
MULTI=1 SCPPROGRESS=1 -C $(DROPBEAR_SSHD_DIR)
|
||||||
|
|
||||||
|
$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY): $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY)
|
||||||
|
#$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \
|
||||||
|
# LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) install
|
||||||
|
#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
|
||||||
|
# $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc
|
||||||
|
install -d -m 755 $(TARGET_DIR)/usr/sbin
|
||||||
|
install -d -m 755 $(TARGET_DIR)/usr/bin
|
||||||
|
install -m 755 $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) \
|
||||||
|
$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY)
|
||||||
|
ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/scp
|
||||||
|
ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/ssh
|
||||||
|
ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearkey
|
||||||
|
ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearconvert
|
||||||
|
cp $(DROPBEAR_SSHD_DIR)/S50dropbear $(TARGET_DIR)/etc/init.d/
|
||||||
|
chmod a+x $(TARGET_DIR)/etc/init.d/S50dropbear
|
||||||
|
|
||||||
|
dropbear_sshd: uclibc zlib $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY)
|
||||||
|
|
||||||
|
dropbear_sshd-clean:
|
||||||
|
$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \
|
||||||
|
LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) uninstall
|
||||||
|
-$(MAKE) -C $(DROPBEAR_SSHD_DIR) clean
|
||||||
|
|
||||||
|
dropbear_sshd-dirclean:
|
||||||
|
rm -rf $(DROPBEAR_SSHD_DIR)
|
||||||
|
|
7
package/iptables/Config.in
Normal file
7
package/iptables/Config.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
config BR2_PACKAGE_IPTABLES
|
||||||
|
bool "iptables"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Linux kernel (2.4+) firewall, NAT, and packet mangling tools.
|
||||||
|
|
||||||
|
http://www.iptables.org/
|
3
package/iptables/Makefile.in
Normal file
3
package/iptables/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_IPTABLES)),y)
|
||||||
|
TARGETS+=iptables
|
||||||
|
endif
|
51
package/iptables/iptables.mk
Normal file
51
package/iptables/iptables.mk
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# iptables
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
IPTABLES_VER:=1.2.11
|
||||||
|
IPTABLES_SOURCE_URL:=http://www.netfilter.org/files
|
||||||
|
IPTABLES_SOURCE:=iptables-$(IPTABLES_VER).tar.bz2
|
||||||
|
IPTABLES_BUILD_DIR:=$(BUILD_DIR)/iptables-$(IPTABLES_VER)
|
||||||
|
|
||||||
|
$(DL_DIR)/$(IPTABLES_SOURCE):
|
||||||
|
$(WGET) -P $(DL_DIR) $(IPTABLES_SOURCE_URL)/$(IPTABLES_SOURCE)
|
||||||
|
|
||||||
|
$(IPTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(IPTABLES_SOURCE)
|
||||||
|
bzcat $(DL_DIR)/$(IPTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
touch $(IPTABLES_BUILD_DIR)/.unpacked
|
||||||
|
|
||||||
|
$(IPTABLES_BUILD_DIR)/.configured: $(IPTABLES_BUILD_DIR)/.unpacked
|
||||||
|
# Allow patches. Needed for openwrt for instance.
|
||||||
|
toolchain/patch-kernel.sh $(IPTABLES_BUILD_DIR) package/iptables/ iptables-\*.patch
|
||||||
|
#
|
||||||
|
$(SED) "s;\[ -f /usr/include/netinet/ip6.h \];grep -q '__UCLIBC_HAS_IPV6__ 1' \
|
||||||
|
$(BUILD_DIR)/uClibc/include/bits/uClibc_config.h;" $(IPTABLES_BUILD_DIR)/Makefile
|
||||||
|
touch $(IPTABLES_BUILD_DIR)/.configured
|
||||||
|
|
||||||
|
$(IPTABLES_BUILD_DIR)/iptables: $(IPTABLES_BUILD_DIR)/.configured
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
$(MAKE) -C $(IPTABLES_BUILD_DIR) \
|
||||||
|
KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \
|
||||||
|
CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)"
|
||||||
|
|
||||||
|
$(TARGET_DIR)/usr/sbin/iptables: $(IPTABLES_BUILD_DIR)/iptables
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
$(MAKE) -C $(IPTABLES_BUILD_DIR) \
|
||||||
|
KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \
|
||||||
|
CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
DESTDIR=$(TARGET_DIR) install
|
||||||
|
$(STRIP) $(TARGET_DIR)/usr/sbin/iptables*
|
||||||
|
$(STRIP) $(TARGET_DIR)/usr/lib/iptables/*.so
|
||||||
|
rm -rf $(TARGET_DIR)/usr/man
|
||||||
|
|
||||||
|
iptables: kernel-headers $(TARGET_DIR)/usr/sbin/iptables
|
||||||
|
|
||||||
|
iptables-source: $(DL_DIR)/$(IPTABLES_SOURCE)
|
||||||
|
|
||||||
|
iptables-clean:
|
||||||
|
$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPTABLES_BUILD_DIR) uninstall
|
||||||
|
-$(MAKE) -C $(IPTABLES_BUILD_DIR) clean
|
||||||
|
|
||||||
|
iptables-dirclean:
|
||||||
|
rm -rf $(IPTABLES_BUILD_DIR)
|
7
package/linux/Config.in
Normal file
7
package/linux/Config.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
config BR2_PACKAGE_LINUX
|
||||||
|
bool "linux"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
The Linux kernel.
|
||||||
|
|
||||||
|
http://www.kernel.org/
|
3
package/linux/Makefile.in
Normal file
3
package/linux/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_LINUX)),y)
|
||||||
|
TARGETS+=linux
|
||||||
|
endif
|
BIN
package/linux/kernel-patches/001-linux-2.4.patch.bz2
Normal file
BIN
package/linux/kernel-patches/001-linux-2.4.patch.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/003_kbuild_fixes.diff.bz2
Normal file
BIN
package/linux/kernel-patches/003_kbuild_fixes.diff.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/004_386_emu.diff.bz2
Normal file
BIN
package/linux/kernel-patches/004_386_emu.diff.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/005_modularize_vesafb.diff.bz2
Normal file
BIN
package/linux/kernel-patches/005_modularize_vesafb.diff.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/006_init_unshare.diff.bz2
Normal file
BIN
package/linux/kernel-patches/006_init_unshare.diff.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/007-scsi_add_remove_single.bz2
Normal file
BIN
package/linux/kernel-patches/007-scsi_add_remove_single.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/008-ieee1394-fix.bz2
Normal file
BIN
package/linux/kernel-patches/008-ieee1394-fix.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/009-always-inline.bz2
Normal file
BIN
package/linux/kernel-patches/009-always-inline.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/010-optimize-for-size.bz2
Normal file
BIN
package/linux/kernel-patches/010-optimize-for-size.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/012-x86-check_gcc.bz2
Normal file
BIN
package/linux/kernel-patches/012-x86-check_gcc.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/015_cramfs_initrd.diff.bz2
Normal file
BIN
package/linux/kernel-patches/015_cramfs_initrd.diff.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/017-printk.bz2
Normal file
BIN
package/linux/kernel-patches/017-printk.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/018-slab-loop-init.bz2
Normal file
BIN
package/linux/kernel-patches/018-slab-loop-init.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/041-changeloop.patch.bz2
Normal file
BIN
package/linux/kernel-patches/041-changeloop.patch.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/042-loopfixes.patch.bz2
Normal file
BIN
package/linux/kernel-patches/042-loopfixes.patch.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/044-streaming_io.bz2
Normal file
BIN
package/linux/kernel-patches/044-streaming_io.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/062-silence-blk-queue.bz2
Normal file
BIN
package/linux/kernel-patches/062-silence-blk-queue.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/063-silence.kbd.patch.bz2
Normal file
BIN
package/linux/kernel-patches/063-silence.kbd.patch.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/064-shutup-md.bz2
Normal file
BIN
package/linux/kernel-patches/064-shutup-md.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/067-squashfs2.patch.bz2
Normal file
BIN
package/linux/kernel-patches/067-squashfs2.patch.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/076-nmap-freak.bz2
Normal file
BIN
package/linux/kernel-patches/076-nmap-freak.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/077-orinoco-0.13e.bz2
Normal file
BIN
package/linux/kernel-patches/077-orinoco-0.13e.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/078-hostap.bz2
Normal file
BIN
package/linux/kernel-patches/078-hostap.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/079-jiffies64.bz2
Normal file
BIN
package/linux/kernel-patches/079-jiffies64.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/089-no-touch-makedep.bz2
Normal file
BIN
package/linux/kernel-patches/089-no-touch-makedep.bz2
Normal file
Binary file not shown.
BIN
package/linux/kernel-patches/100_VERSION.bz2
Normal file
BIN
package/linux/kernel-patches/100_VERSION.bz2
Normal file
Binary file not shown.
853
package/linux/linux.config
Normal file
853
package/linux/linux.config
Normal file
@ -0,0 +1,853 @@
|
|||||||
|
#
|
||||||
|
# Automatically generated by make menuconfig: don't edit
|
||||||
|
#
|
||||||
|
CONFIG_MIPS=y
|
||||||
|
CONFIG_MIPS32=y
|
||||||
|
# CONFIG_MIPS64 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Code maturity level options
|
||||||
|
#
|
||||||
|
CONFIG_EXPERIMENTAL=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Loadable module support
|
||||||
|
#
|
||||||
|
CONFIG_MODULES=y
|
||||||
|
# CONFIG_MODVERSIONS is not set
|
||||||
|
# CONFIG_KMOD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Machine selection
|
||||||
|
#
|
||||||
|
# CONFIG_ACER_PICA_61 is not set
|
||||||
|
# CONFIG_MIPS_DB1000 is not set
|
||||||
|
# CONFIG_MIPS_DB1100 is not set
|
||||||
|
# CONFIG_MIPS_DB1500 is not set
|
||||||
|
# CONFIG_MIPS_PB1000 is not set
|
||||||
|
# CONFIG_MIPS_PB1100 is not set
|
||||||
|
# CONFIG_MIPS_PB1500 is not set
|
||||||
|
# CONFIG_BAGET_MIPS is not set
|
||||||
|
# CONFIG_CASIO_E55 is not set
|
||||||
|
# CONFIG_MIPS_COBALT is not set
|
||||||
|
# CONFIG_DECSTATION is not set
|
||||||
|
# CONFIG_MIPS_EV64120 is not set
|
||||||
|
# CONFIG_MIPS_EV96100 is not set
|
||||||
|
# CONFIG_MIPS_IVR is not set
|
||||||
|
# CONFIG_HP_LASERJET is not set
|
||||||
|
# CONFIG_IBM_WORKPAD is not set
|
||||||
|
# CONFIG_LASAT is not set
|
||||||
|
# CONFIG_MIPS_ITE8172 is not set
|
||||||
|
# CONFIG_MIPS_ATLAS is not set
|
||||||
|
# CONFIG_MIPS_MAGNUM_4000 is not set
|
||||||
|
# CONFIG_MIPS_MALTA is not set
|
||||||
|
# CONFIG_MIPS_SEAD is not set
|
||||||
|
# CONFIG_MOMENCO_OCELOT is not set
|
||||||
|
# CONFIG_MOMENCO_OCELOT_G is not set
|
||||||
|
# CONFIG_DDB5074 is not set
|
||||||
|
# CONFIG_DDB5476 is not set
|
||||||
|
# CONFIG_DDB5477 is not set
|
||||||
|
# CONFIG_NEC_OSPREY is not set
|
||||||
|
# CONFIG_NEC_EAGLE is not set
|
||||||
|
# CONFIG_OLIVETTI_M700 is not set
|
||||||
|
# CONFIG_NINO is not set
|
||||||
|
# CONFIG_SGI_IP22 is not set
|
||||||
|
# CONFIG_SGI_IP27 is not set
|
||||||
|
# CONFIG_SGI_IP32 is not set
|
||||||
|
# CONFIG_SIBYTE_SB1xxx_SOC is not set
|
||||||
|
CONFIG_MIPS_BRCM=y
|
||||||
|
CONFIG_BCM947XX=y
|
||||||
|
CONFIG_BCM4710=y
|
||||||
|
CONFIG_BCM4310=y
|
||||||
|
CONFIG_BCM4704=y
|
||||||
|
# CONFIG_BCM5365 is not set
|
||||||
|
# CONFIG_SNI_RM200_PCI is not set
|
||||||
|
# CONFIG_TOSHIBA_JMR3927 is not set
|
||||||
|
# CONFIG_VICTOR_MPC30X is not set
|
||||||
|
# CONFIG_ZAO_CAPCELLA is not set
|
||||||
|
# CONFIG_HIGHMEM is not set
|
||||||
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
|
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
|
||||||
|
CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit noinitrd console=ttyS0,115200"
|
||||||
|
CONFIG_PCI=y
|
||||||
|
CONFIG_NONCOHERENT_IO=y
|
||||||
|
CONFIG_NEW_TIME_C=y
|
||||||
|
CONFIG_NEW_IRQ=y
|
||||||
|
CONFIG_HND=y
|
||||||
|
# CONFIG_MIPS_AU1000 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# CPU selection
|
||||||
|
#
|
||||||
|
CONFIG_CPU_MIPS32=y
|
||||||
|
# CONFIG_CPU_MIPS64 is not set
|
||||||
|
# CONFIG_CPU_R3000 is not set
|
||||||
|
# CONFIG_CPU_TX39XX is not set
|
||||||
|
# CONFIG_CPU_VR41XX is not set
|
||||||
|
# CONFIG_CPU_R4300 is not set
|
||||||
|
# CONFIG_CPU_R4X00 is not set
|
||||||
|
# CONFIG_CPU_TX49XX is not set
|
||||||
|
# CONFIG_CPU_R5000 is not set
|
||||||
|
# CONFIG_CPU_R5432 is not set
|
||||||
|
# CONFIG_CPU_R6000 is not set
|
||||||
|
# CONFIG_CPU_NEVADA is not set
|
||||||
|
# CONFIG_CPU_R8000 is not set
|
||||||
|
# CONFIG_CPU_R10000 is not set
|
||||||
|
# CONFIG_CPU_RM7000 is not set
|
||||||
|
# CONFIG_CPU_SB1 is not set
|
||||||
|
CONFIG_CPU_HAS_PREFETCH=y
|
||||||
|
# CONFIG_VTAG_ICACHE is not set
|
||||||
|
# CONFIG_64BIT_PHYS_ADDR is not set
|
||||||
|
# CONFIG_CPU_ADVANCED is not set
|
||||||
|
CONFIG_CPU_HAS_LLSC=y
|
||||||
|
# CONFIG_CPU_HAS_LLDSCD is not set
|
||||||
|
# CONFIG_CPU_HAS_WB is not set
|
||||||
|
CONFIG_CPU_HAS_SYNC=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# General setup
|
||||||
|
#
|
||||||
|
CONFIG_CPU_LITTLE_ENDIAN=y
|
||||||
|
CONFIG_NET=y
|
||||||
|
# CONFIG_PCI_NAMES is not set
|
||||||
|
# CONFIG_ISA is not set
|
||||||
|
# CONFIG_EISA is not set
|
||||||
|
# CONFIG_TC is not set
|
||||||
|
# CONFIG_MCA is not set
|
||||||
|
# CONFIG_SBUS is not set
|
||||||
|
CONFIG_HOTPLUG=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# PCMCIA/CardBus support
|
||||||
|
#
|
||||||
|
# CONFIG_PCMCIA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# PCI Hotplug Support
|
||||||
|
#
|
||||||
|
# CONFIG_HOTPLUG_PCI is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
|
||||||
|
# CONFIG_HOTPLUG_PCI_ACPI is not set
|
||||||
|
CONFIG_SYSVIPC=y
|
||||||
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||||
|
CONFIG_SYSCTL=y
|
||||||
|
# CONFIG_PRINT_SYSCALLS is not set
|
||||||
|
CONFIG_KCORE_ELF=y
|
||||||
|
# CONFIG_KCORE_AOUT is not set
|
||||||
|
# CONFIG_BINFMT_AOUT is not set
|
||||||
|
CONFIG_BINFMT_ELF=y
|
||||||
|
# CONFIG_MIPS32_COMPAT is not set
|
||||||
|
# CONFIG_MIPS32_O32 is not set
|
||||||
|
# CONFIG_MIPS32_N32 is not set
|
||||||
|
# CONFIG_BINFMT_ELF32 is not set
|
||||||
|
# CONFIG_BINFMT_MISC is not set
|
||||||
|
# CONFIG_PM is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Memory Technology Devices (MTD)
|
||||||
|
#
|
||||||
|
CONFIG_MTD=y
|
||||||
|
# CONFIG_MTD_DEBUG is not set
|
||||||
|
CONFIG_MTD_PARTITIONS=y
|
||||||
|
# CONFIG_MTD_CONCAT is not set
|
||||||
|
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||||
|
CONFIG_MTD_CHAR=y
|
||||||
|
# CONFIG_MTD_BLOCK is not set
|
||||||
|
CONFIG_MTD_BLOCK_RO=y
|
||||||
|
# CONFIG_FTL is not set
|
||||||
|
# CONFIG_NFTL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# RAM/ROM/Flash chip drivers
|
||||||
|
#
|
||||||
|
CONFIG_MTD_CFI=y
|
||||||
|
# CONFIG_MTD_JEDECPROBE is not set
|
||||||
|
CONFIG_MTD_GEN_PROBE=y
|
||||||
|
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||||
|
CONFIG_MTD_CFI_NOSWAP=y
|
||||||
|
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
|
||||||
|
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
|
||||||
|
CONFIG_MTD_CFI_GEOMETRY=y
|
||||||
|
# CONFIG_MTD_CFI_B1 is not set
|
||||||
|
CONFIG_MTD_CFI_B2=y
|
||||||
|
# CONFIG_MTD_CFI_B4 is not set
|
||||||
|
CONFIG_MTD_CFI_I1=y
|
||||||
|
# CONFIG_MTD_CFI_I2 is not set
|
||||||
|
# CONFIG_MTD_CFI_I4 is not set
|
||||||
|
CONFIG_MTD_CFI_INTELEXT=y
|
||||||
|
CONFIG_MTD_CFI_AMDSTD=y
|
||||||
|
CONFIG_MTD_CFI_SSTSTD=y
|
||||||
|
# CONFIG_MTD_RAM is not set
|
||||||
|
# CONFIG_MTD_ROM is not set
|
||||||
|
# CONFIG_MTD_ABSENT is not set
|
||||||
|
# CONFIG_MTD_OBSOLETE_CHIPS is not set
|
||||||
|
# CONFIG_MTD_AMDSTD is not set
|
||||||
|
# CONFIG_MTD_SHARP is not set
|
||||||
|
# CONFIG_MTD_JEDEC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Mapping drivers for chip access
|
||||||
|
#
|
||||||
|
# CONFIG_MTD_PHYSMAP is not set
|
||||||
|
CONFIG_MTD_BCM947XX=y
|
||||||
|
# CONFIG_MTD_PB1000 is not set
|
||||||
|
# CONFIG_MTD_PB1500 is not set
|
||||||
|
# CONFIG_MTD_PB1100 is not set
|
||||||
|
# CONFIG_MTD_CSTM_MIPS_IXX is not set
|
||||||
|
# CONFIG_MTD_OCELOT is not set
|
||||||
|
# CONFIG_MTD_LASAT is not set
|
||||||
|
# CONFIG_MTD_PCI is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Self-contained MTD device drivers
|
||||||
|
#
|
||||||
|
CONFIG_MTD_SFLASH=y
|
||||||
|
# CONFIG_MTD_PMC551 is not set
|
||||||
|
# CONFIG_MTD_SLRAM is not set
|
||||||
|
# CONFIG_MTD_MTDRAM is not set
|
||||||
|
# CONFIG_MTD_BLKMTD is not set
|
||||||
|
# CONFIG_MTD_DOC1000 is not set
|
||||||
|
# CONFIG_MTD_DOC2000 is not set
|
||||||
|
# CONFIG_MTD_DOC2001 is not set
|
||||||
|
# CONFIG_MTD_DOCPROBE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# NAND Flash Device Drivers
|
||||||
|
#
|
||||||
|
# CONFIG_MTD_NAND is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Parallel port support
|
||||||
|
#
|
||||||
|
# CONFIG_PARPORT is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Plug and Play configuration
|
||||||
|
#
|
||||||
|
# CONFIG_PNP is not set
|
||||||
|
# CONFIG_ISAPNP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Block devices
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_MSYS is not set
|
||||||
|
# CONFIG_NOROOT is not set
|
||||||
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
# CONFIG_BLK_DEV_XD is not set
|
||||||
|
# CONFIG_PARIDE is not set
|
||||||
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
|
# CONFIG_CISS_SCSI_TAPE is not set
|
||||||
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
# CONFIG_BLK_DEV_UMEM is not set
|
||||||
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_NBD=m
|
||||||
|
# CONFIG_BLK_DEV_RAM is not set
|
||||||
|
# CONFIG_BLK_DEV_INITRD is not set
|
||||||
|
# CONFIG_BLK_STATS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multi-device support (RAID and LVM)
|
||||||
|
#
|
||||||
|
# CONFIG_MD is not set
|
||||||
|
# CONFIG_BLK_DEV_MD is not set
|
||||||
|
# CONFIG_MD_LINEAR is not set
|
||||||
|
# CONFIG_MD_RAID0 is not set
|
||||||
|
# CONFIG_MD_RAID1 is not set
|
||||||
|
# CONFIG_MD_RAID5 is not set
|
||||||
|
# CONFIG_MD_MULTIPATH is not set
|
||||||
|
# CONFIG_BLK_DEV_LVM is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Networking options
|
||||||
|
#
|
||||||
|
CONFIG_PACKET=y
|
||||||
|
CONFIG_PACKET_MMAP=y
|
||||||
|
CONFIG_NETLINK_DEV=m
|
||||||
|
CONFIG_NETFILTER=y
|
||||||
|
# CONFIG_NETFILTER_DEBUG is not set
|
||||||
|
# CONFIG_FILTER is not set
|
||||||
|
CONFIG_UNIX=y
|
||||||
|
CONFIG_NETSWAP=y
|
||||||
|
CONFIG_INET=y
|
||||||
|
# CONFIG_IP_MULTICAST is not set
|
||||||
|
CONFIG_IP_ADVANCED_ROUTER=y
|
||||||
|
CONFIG_IP_MULTIPLE_TABLES=y
|
||||||
|
CONFIG_IP_ROUTE_FWMARK=y
|
||||||
|
CONFIG_IP_ROUTE_NAT=y
|
||||||
|
CONFIG_IP_ROUTE_MULTIPATH=y
|
||||||
|
CONFIG_IP_ROUTE_TOS=y
|
||||||
|
# CONFIG_IP_ROUTE_VERBOSE is not set
|
||||||
|
# CONFIG_IP_ROUTE_LARGE_TABLES is not set
|
||||||
|
# CONFIG_IP_PNP is not set
|
||||||
|
CONFIG_NET_IPIP=m
|
||||||
|
CONFIG_NET_IPGRE=m
|
||||||
|
# CONFIG_ARPD is not set
|
||||||
|
# CONFIG_INET_ECN is not set
|
||||||
|
# CONFIG_SYN_COOKIES is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# IP: Netfilter Configuration
|
||||||
|
#
|
||||||
|
CONFIG_IP_NF_CONNTRACK=y
|
||||||
|
CONFIG_IP_NF_FTP=y
|
||||||
|
CONFIG_IP_NF_H323=y
|
||||||
|
CONFIG_IP_NF_CONNTRACK_MARK=y
|
||||||
|
# CONFIG_IP_NF_AMANDA is not set
|
||||||
|
CONFIG_IP_NF_TFTP=y
|
||||||
|
CONFIG_IP_NF_IRC=y
|
||||||
|
CONFIG_IP_NF_CT_PROTO_GRE=y
|
||||||
|
CONFIG_IP_NF_PPTP=y
|
||||||
|
CONFIG_IP_NF_MMS=y
|
||||||
|
CONFIG_IP_NF_QUEUE=m
|
||||||
|
CONFIG_IP_NF_IPTABLES=y
|
||||||
|
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||||
|
CONFIG_IP_NF_SET=m
|
||||||
|
CONFIG_IP_NF_SET_MAX=256
|
||||||
|
CONFIG_IP_NF_SET_IPMAP=m
|
||||||
|
CONFIG_IP_NF_SET_PORTMAP=m
|
||||||
|
CONFIG_IP_NF_SET_MACIPMAP=m
|
||||||
|
CONFIG_IP_NF_SET_IPHASH=m
|
||||||
|
CONFIG_IP_NF_MATCH_QUOTA=m
|
||||||
|
CONFIG_IP_NF_POOL=m
|
||||||
|
CONFIG_IP_POOL_STATISTICS=y
|
||||||
|
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||||
|
CONFIG_IP_NF_MATCH_DSTLIMIT=m
|
||||||
|
CONFIG_IP_NF_MATCH_MAC=m
|
||||||
|
CONFIG_IP_NF_MATCH_PKTTYPE=m
|
||||||
|
CONFIG_IP_NF_MATCH_MARK=y
|
||||||
|
CONFIG_IP_NF_MATCH_MULTIPORT=y
|
||||||
|
CONFIG_IP_NF_MATCH_TOS=m
|
||||||
|
CONFIG_IP_NF_MATCH_CONDITION=m
|
||||||
|
# CONFIG_IP_NF_MATCH_RANDOM is not set
|
||||||
|
CONFIG_IP_NF_MATCH_PSD=m
|
||||||
|
# CONFIG_IP_NF_MATCH_OSF is not set
|
||||||
|
# CONFIG_IP_NF_MATCH_NTH is not set
|
||||||
|
CONFIG_IP_NF_MATCH_IPV4OPTIONS=m
|
||||||
|
# CONFIG_IP_NF_MATCH_FUZZY is not set
|
||||||
|
CONFIG_IP_NF_MATCH_RECENT=m
|
||||||
|
CONFIG_IP_NF_MATCH_ECN=m
|
||||||
|
CONFIG_IP_NF_MATCH_DSCP=m
|
||||||
|
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||||
|
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||||
|
# CONFIG_IP_NF_MATCH_U32 is not set
|
||||||
|
CONFIG_IP_NF_MATCH_TTL=m
|
||||||
|
CONFIG_IP_NF_MATCH_TCPMSS=y
|
||||||
|
# CONFIG_IP_NF_MATCH_REALM is not set
|
||||||
|
CONFIG_IP_NF_MATCH_HELPER=m
|
||||||
|
CONFIG_IP_NF_MATCH_STATE=y
|
||||||
|
CONFIG_IP_NF_MATCH_CONNMARK=m
|
||||||
|
CONFIG_IP_NF_MATCH_CONNLIMIT=m
|
||||||
|
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||||
|
CONFIG_IP_NF_MATCH_UNCLEAN=m
|
||||||
|
CONFIG_IP_NF_MATCH_STRING=m
|
||||||
|
# CONFIG_IP_NF_MATCH_OWNER is not set
|
||||||
|
CONFIG_IP_NF_MATCH_PHYSDEV=m
|
||||||
|
CONFIG_IP_NF_FILTER=y
|
||||||
|
CONFIG_IP_NF_TARGET_REJECT=y
|
||||||
|
CONFIG_IP_NF_TARGET_NETLINK=m
|
||||||
|
CONFIG_IP_NF_TARGET_IPV4OPTSSTRIP=m
|
||||||
|
CONFIG_IP_NF_TARGET_MIRROR=m
|
||||||
|
CONFIG_IP_NF_NAT=y
|
||||||
|
CONFIG_IP_NF_NAT_NEEDED=y
|
||||||
|
CONFIG_IP_NF_TARGET_MASQUERADE=y
|
||||||
|
CONFIG_IP_NF_TARGET_REDIRECT=y
|
||||||
|
CONFIG_IP_NF_NAT_H323=y
|
||||||
|
# CONFIG_IP_NF_TARGET_SAME is not set
|
||||||
|
# CONFIG_IP_NF_TARGET_NETMAP is not set
|
||||||
|
CONFIG_IP_NF_NAT_PPTP=y
|
||||||
|
CONFIG_IP_NF_NAT_PROTO_GRE=y
|
||||||
|
# CONFIG_IP_NF_NAT_LOCAL is not set
|
||||||
|
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||||
|
CONFIG_IP_NF_NAT_IRC=y
|
||||||
|
CONFIG_IP_NF_NAT_MMS=y
|
||||||
|
CONFIG_IP_NF_NAT_FTP=y
|
||||||
|
CONFIG_IP_NF_NAT_TFTP=y
|
||||||
|
CONFIG_IP_NF_MANGLE=y
|
||||||
|
CONFIG_IP_NF_TARGET_TOS=m
|
||||||
|
CONFIG_IP_NF_TARGET_ECN=m
|
||||||
|
CONFIG_IP_NF_TARGET_DSCP=m
|
||||||
|
CONFIG_IP_NF_TARGET_MARK=y
|
||||||
|
CONFIG_IP_NF_TARGET_IPMARK=m
|
||||||
|
CONFIG_IP_NF_TARGET_CLASSIFY=m
|
||||||
|
CONFIG_IP_NF_TARGET_LOG=y
|
||||||
|
CONFIG_IP_NF_TARGET_CONNMARK=m
|
||||||
|
CONFIG_IP_NF_TARGET_TTL=m
|
||||||
|
CONFIG_IP_NF_TARGET_ULOG=m
|
||||||
|
CONFIG_IP_NF_TARGET_TCPMSS=y
|
||||||
|
# CONFIG_IP_NF_RAW is not set
|
||||||
|
CONFIG_IP_NF_ARPTABLES=m
|
||||||
|
CONFIG_IP_NF_ARPFILTER=m
|
||||||
|
CONFIG_IP_NF_ARP_MANGLE=m
|
||||||
|
CONFIG_IPV6=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# IPv6: Netfilter Configuration
|
||||||
|
#
|
||||||
|
CONFIG_IP6_NF_QUEUE=m
|
||||||
|
CONFIG_IP6_NF_IPTABLES=m
|
||||||
|
CONFIG_IP6_NF_MATCH_LIMIT=m
|
||||||
|
CONFIG_IP6_NF_MATCH_MAC=m
|
||||||
|
# CONFIG_IP6_NF_MATCH_RANDOM is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_NTH is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_FUZZY is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_RT is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_OPTS is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_FRAG is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_HL is not set
|
||||||
|
CONFIG_IP6_NF_MATCH_MULTIPORT=m
|
||||||
|
CONFIG_IP6_NF_MATCH_OWNER=m
|
||||||
|
CONFIG_IP6_NF_MATCH_MARK=m
|
||||||
|
# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
|
||||||
|
# CONFIG_IP6_NF_MATCH_AHESP is not set
|
||||||
|
CONFIG_IP6_NF_MATCH_LENGTH=m
|
||||||
|
CONFIG_IP6_NF_MATCH_EUI64=m
|
||||||
|
CONFIG_IP6_NF_FILTER=m
|
||||||
|
CONFIG_IP6_NF_TARGET_REJECT=m
|
||||||
|
# CONFIG_IP6_NF_TARGET_HL is not set
|
||||||
|
CONFIG_IP6_NF_TARGET_LOG=m
|
||||||
|
CONFIG_IP6_NF_MANGLE=m
|
||||||
|
CONFIG_IP6_NF_TARGET_MARK=m
|
||||||
|
# CONFIG_KHTTPD is not set
|
||||||
|
# CONFIG_ATM is not set
|
||||||
|
CONFIG_VLAN_8021Q=y
|
||||||
|
# CONFIG_IPX is not set
|
||||||
|
# CONFIG_ATALK is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Appletalk devices
|
||||||
|
#
|
||||||
|
# CONFIG_DEV_APPLETALK is not set
|
||||||
|
# CONFIG_DECNET is not set
|
||||||
|
CONFIG_BRIDGE=y
|
||||||
|
CONFIG_BRIDGE_NF_EBTABLES=m
|
||||||
|
CONFIG_BRIDGE_EBT_T_FILTER=m
|
||||||
|
CONFIG_BRIDGE_EBT_T_NAT=m
|
||||||
|
CONFIG_BRIDGE_EBT_BROUTE=m
|
||||||
|
CONFIG_BRIDGE_EBT_LOG=m
|
||||||
|
CONFIG_BRIDGE_EBT_IPF=m
|
||||||
|
CONFIG_BRIDGE_EBT_ARPF=m
|
||||||
|
CONFIG_BRIDGE_EBT_AMONG=m
|
||||||
|
CONFIG_BRIDGE_EBT_LIMIT=m
|
||||||
|
CONFIG_BRIDGE_EBT_VLANF=m
|
||||||
|
CONFIG_BRIDGE_EBT_802_3=m
|
||||||
|
CONFIG_BRIDGE_EBT_PKTTYPE=m
|
||||||
|
CONFIG_BRIDGE_EBT_STP=m
|
||||||
|
CONFIG_BRIDGE_EBT_MARKF=m
|
||||||
|
CONFIG_BRIDGE_EBT_ARPREPLY=m
|
||||||
|
CONFIG_BRIDGE_EBT_SNAT=m
|
||||||
|
CONFIG_BRIDGE_EBT_DNAT=m
|
||||||
|
CONFIG_BRIDGE_EBT_REDIRECT=m
|
||||||
|
CONFIG_BRIDGE_EBT_MARK_T=m
|
||||||
|
# CONFIG_X25 is not set
|
||||||
|
# CONFIG_LAPB is not set
|
||||||
|
# CONFIG_LLC is not set
|
||||||
|
# CONFIG_NET_DIVERT is not set
|
||||||
|
# CONFIG_ECONET is not set
|
||||||
|
CONFIG_WAN_ROUTER=m
|
||||||
|
# CONFIG_NET_FASTROUTE is not set
|
||||||
|
# CONFIG_NET_HW_FLOWCONTROL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# QoS and/or fair queueing
|
||||||
|
#
|
||||||
|
CONFIG_NET_SCHED=y
|
||||||
|
CONFIG_NET_SCH_CBQ=m
|
||||||
|
CONFIG_NET_SCH_HTB=m
|
||||||
|
CONFIG_NET_SCH_CSZ=m
|
||||||
|
CONFIG_NET_SCH_PRIO=m
|
||||||
|
CONFIG_NET_SCH_RED=m
|
||||||
|
CONFIG_NET_SCH_SFQ=m
|
||||||
|
CONFIG_NET_SCH_TEQL=m
|
||||||
|
CONFIG_NET_SCH_TBF=m
|
||||||
|
CONFIG_NET_SCH_GRED=m
|
||||||
|
CONFIG_NET_SCH_DSMARK=m
|
||||||
|
CONFIG_NET_SCH_INGRESS=m
|
||||||
|
CONFIG_NET_QOS=y
|
||||||
|
CONFIG_NET_ESTIMATOR=y
|
||||||
|
CONFIG_NET_CLS=y
|
||||||
|
CONFIG_NET_CLS_TCINDEX=m
|
||||||
|
CONFIG_NET_CLS_ROUTE4=m
|
||||||
|
CONFIG_NET_CLS_ROUTE=y
|
||||||
|
CONFIG_NET_CLS_FW=m
|
||||||
|
CONFIG_NET_CLS_U32=m
|
||||||
|
CONFIG_NET_CLS_RSVP=m
|
||||||
|
CONFIG_NET_CLS_RSVP6=m
|
||||||
|
CONFIG_NET_CLS_POLICE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network testing
|
||||||
|
#
|
||||||
|
# CONFIG_NET_PKTGEN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Telephony Support
|
||||||
|
#
|
||||||
|
# CONFIG_PHONE is not set
|
||||||
|
# CONFIG_PHONE_IXJ is not set
|
||||||
|
# CONFIG_PHONE_IXJ_PCMCIA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# ATA/IDE/MFM/RLL support
|
||||||
|
#
|
||||||
|
# CONFIG_IDE is not set
|
||||||
|
# CONFIG_BLK_DEV_IDE_MODES is not set
|
||||||
|
# CONFIG_BLK_DEV_HD is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SCSI support
|
||||||
|
#
|
||||||
|
# CONFIG_SCSI is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2O device support
|
||||||
|
#
|
||||||
|
# CONFIG_I2O is not set
|
||||||
|
# CONFIG_I2O_PCI is not set
|
||||||
|
# CONFIG_I2O_BLOCK is not set
|
||||||
|
# CONFIG_I2O_LAN is not set
|
||||||
|
# CONFIG_I2O_SCSI is not set
|
||||||
|
# CONFIG_I2O_PROC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network device support
|
||||||
|
#
|
||||||
|
CONFIG_NETDEVICES=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Broadcom HND network devices
|
||||||
|
#
|
||||||
|
CONFIG_HND=y
|
||||||
|
# CONFIG_IL is not set
|
||||||
|
CONFIG_ET=m
|
||||||
|
# CONFIG_ET_4413 is not set
|
||||||
|
CONFIG_ET_47XX=y
|
||||||
|
CONFIG_WL=m
|
||||||
|
CONFIG_WL_AP=y
|
||||||
|
CONFIG_WL_STA=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# ARCnet devices
|
||||||
|
#
|
||||||
|
# CONFIG_ARCNET is not set
|
||||||
|
# CONFIG_DUMMY is not set
|
||||||
|
# CONFIG_BONDING is not set
|
||||||
|
# CONFIG_EQUALIZER is not set
|
||||||
|
CONFIG_TUN=m
|
||||||
|
# CONFIG_ETHERTAP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Ethernet (10 or 100Mbit)
|
||||||
|
#
|
||||||
|
CONFIG_NET_ETHERNET=y
|
||||||
|
# CONFIG_SUNLANCE is not set
|
||||||
|
# CONFIG_HAPPYMEAL is not set
|
||||||
|
# CONFIG_SUNBMAC is not set
|
||||||
|
# CONFIG_SUNQE is not set
|
||||||
|
# CONFIG_SUNGEM is not set
|
||||||
|
# CONFIG_NET_VENDOR_3COM is not set
|
||||||
|
# CONFIG_LANCE is not set
|
||||||
|
# CONFIG_NET_VENDOR_SMC is not set
|
||||||
|
# CONFIG_NET_VENDOR_RACAL is not set
|
||||||
|
# CONFIG_HP100 is not set
|
||||||
|
# CONFIG_NET_ISA is not set
|
||||||
|
# CONFIG_NET_PCI is not set
|
||||||
|
# CONFIG_NET_POCKET is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Ethernet (1000 Mbit)
|
||||||
|
#
|
||||||
|
# CONFIG_ACENIC is not set
|
||||||
|
# CONFIG_DL2K is not set
|
||||||
|
# CONFIG_E1000 is not set
|
||||||
|
# CONFIG_MYRI_SBUS is not set
|
||||||
|
# CONFIG_NS83820 is not set
|
||||||
|
# CONFIG_HAMACHI is not set
|
||||||
|
# CONFIG_YELLOWFIN is not set
|
||||||
|
# CONFIG_SK98LIN is not set
|
||||||
|
# CONFIG_TIGON3 is not set
|
||||||
|
# CONFIG_FDDI is not set
|
||||||
|
# CONFIG_HIPPI is not set
|
||||||
|
# CONFIG_PLIP is not set
|
||||||
|
CONFIG_PPP=y
|
||||||
|
# CONFIG_PPP_MULTILINK is not set
|
||||||
|
# CONFIG_PPP_FILTER is not set
|
||||||
|
CONFIG_PPP_ASYNC=m
|
||||||
|
# CONFIG_PPP_SYNC_TTY is not set
|
||||||
|
CONFIG_PPP_DEFLATE=m
|
||||||
|
CONFIG_PPP_BSDCOMP=m
|
||||||
|
CONFIG_PPP_MPPE=m
|
||||||
|
CONFIG_PPPOE=m
|
||||||
|
# CONFIG_SLIP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wireless LAN (non-hamradio)
|
||||||
|
#
|
||||||
|
CONFIG_NET_RADIO=y
|
||||||
|
# CONFIG_STRIP is not set
|
||||||
|
# CONFIG_WAVELAN is not set
|
||||||
|
# CONFIG_ARLAN is not set
|
||||||
|
# CONFIG_AIRONET4500 is not set
|
||||||
|
# CONFIG_AIRONET4500_NONCS is not set
|
||||||
|
# CONFIG_AIRONET4500_PROC is not set
|
||||||
|
# CONFIG_AIRO is not set
|
||||||
|
# CONFIG_HERMES is not set
|
||||||
|
# CONFIG_PLX_HERMES is not set
|
||||||
|
# CONFIG_PCI_HERMES is not set
|
||||||
|
CONFIG_NET_WIRELESS=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Token Ring devices
|
||||||
|
#
|
||||||
|
# CONFIG_TR is not set
|
||||||
|
# CONFIG_NET_FC is not set
|
||||||
|
# CONFIG_RCPCI is not set
|
||||||
|
CONFIG_SHAPER=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# Wan interfaces
|
||||||
|
#
|
||||||
|
# CONFIG_WAN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Amateur Radio support
|
||||||
|
#
|
||||||
|
# CONFIG_HAMRADIO is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# IrDA (infrared) support
|
||||||
|
#
|
||||||
|
# CONFIG_IRDA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# ISDN subsystem
|
||||||
|
#
|
||||||
|
# CONFIG_ISDN is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Input core support
|
||||||
|
#
|
||||||
|
# CONFIG_INPUT is not set
|
||||||
|
# CONFIG_INPUT_KEYBDEV is not set
|
||||||
|
# CONFIG_INPUT_MOUSEDEV is not set
|
||||||
|
# CONFIG_INPUT_JOYDEV is not set
|
||||||
|
# CONFIG_INPUT_EVDEV is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Character devices
|
||||||
|
#
|
||||||
|
# CONFIG_VT is not set
|
||||||
|
CONFIG_SERIAL=y
|
||||||
|
CONFIG_SERIAL_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_EXTENDED is not set
|
||||||
|
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||||
|
CONFIG_UNIX98_PTYS=y
|
||||||
|
CONFIG_UNIX98_PTY_COUNT=128
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2C support
|
||||||
|
#
|
||||||
|
# CONFIG_I2C is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Mice
|
||||||
|
#
|
||||||
|
# CONFIG_BUSMOUSE is not set
|
||||||
|
# CONFIG_MOUSE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Joysticks
|
||||||
|
#
|
||||||
|
# CONFIG_INPUT_GAMEPORT is not set
|
||||||
|
# CONFIG_QIC02_TAPE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Watchdog Cards
|
||||||
|
#
|
||||||
|
CONFIG_WATCHDOG=y
|
||||||
|
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||||
|
# CONFIG_ACQUIRE_WDT is not set
|
||||||
|
# CONFIG_ADVANTECH_WDT is not set
|
||||||
|
# CONFIG_ALIM7101_WDT is not set
|
||||||
|
# CONFIG_SC520_WDT is not set
|
||||||
|
# CONFIG_PCWATCHDOG is not set
|
||||||
|
# CONFIG_EUROTECH_WDT is not set
|
||||||
|
# CONFIG_IB700_WDT is not set
|
||||||
|
# CONFIG_WAFER_WDT is not set
|
||||||
|
# CONFIG_I810_TCO is not set
|
||||||
|
# CONFIG_MIXCOMWD is not set
|
||||||
|
# CONFIG_60XX_WDT is not set
|
||||||
|
# CONFIG_SC1200_WDT is not set
|
||||||
|
CONFIG_SOFT_WATCHDOG=y
|
||||||
|
# CONFIG_W83877F_WDT is not set
|
||||||
|
# CONFIG_WDT is not set
|
||||||
|
# CONFIG_WDTPCI is not set
|
||||||
|
# CONFIG_MACHZ_WDT is not set
|
||||||
|
# CONFIG_INDYDOG is not set
|
||||||
|
# CONFIG_AMD7XX_TCO is not set
|
||||||
|
# CONFIG_AMD_PM768 is not set
|
||||||
|
# CONFIG_NVRAM is not set
|
||||||
|
# CONFIG_RTC is not set
|
||||||
|
# CONFIG_DTLK is not set
|
||||||
|
# CONFIG_R3964 is not set
|
||||||
|
# CONFIG_APPLICOM is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Ftape, the floppy tape device driver
|
||||||
|
#
|
||||||
|
# CONFIG_FTAPE is not set
|
||||||
|
# CONFIG_AGP is not set
|
||||||
|
# CONFIG_DRM is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# File systems
|
||||||
|
#
|
||||||
|
CONFIG_BLKDEV_SWAP=m
|
||||||
|
# CONFIG_QUOTA is not set
|
||||||
|
# CONFIG_AUTOFS_FS is not set
|
||||||
|
# CONFIG_AUTOFS4_FS is not set
|
||||||
|
# CONFIG_REISERFS_FS is not set
|
||||||
|
# CONFIG_REISERFS_CHECK is not set
|
||||||
|
# CONFIG_REISERFS_PROC_INFO is not set
|
||||||
|
# CONFIG_ADFS_FS is not set
|
||||||
|
# CONFIG_ADFS_FS_RW is not set
|
||||||
|
# CONFIG_AFFS_FS is not set
|
||||||
|
# CONFIG_HFS_FS is not set
|
||||||
|
# CONFIG_BEFS_FS is not set
|
||||||
|
# CONFIG_BEFS_DEBUG is not set
|
||||||
|
# CONFIG_BFS_FS is not set
|
||||||
|
# CONFIG_EXT3_FS is not set
|
||||||
|
# CONFIG_JBD is not set
|
||||||
|
# CONFIG_JBD_DEBUG is not set
|
||||||
|
# CONFIG_FAT_FS is not set
|
||||||
|
# CONFIG_MSDOS_FS is not set
|
||||||
|
# CONFIG_UMSDOS_FS is not set
|
||||||
|
# CONFIG_VFAT_FS is not set
|
||||||
|
# CONFIG_EFS_FS is not set
|
||||||
|
# CONFIG_JFFS_FS is not set
|
||||||
|
CONFIG_JFFS2_FS=y
|
||||||
|
CONFIG_JFFS2_FS_DEBUG=0
|
||||||
|
# CONFIG_JFFS2_BBC_ARMLIB is not set
|
||||||
|
CONFIG_JFFS2_BBC_LZO=y
|
||||||
|
CONFIG_JFFS2_BBC_LZARI=y
|
||||||
|
CONFIG_JFFS2_BBC_LZHD=y
|
||||||
|
CONFIG_JFFS2_BBC_LZSS=y
|
||||||
|
# CONFIG_CRAMFS is not set
|
||||||
|
CONFIG_SQUASHFS=y
|
||||||
|
# CONFIG_TMPFS is not set
|
||||||
|
CONFIG_RAMFS=y
|
||||||
|
# CONFIG_ISO9660_FS is not set
|
||||||
|
# CONFIG_JOLIET is not set
|
||||||
|
# CONFIG_ZISOFS is not set
|
||||||
|
# CONFIG_JFS_FS is not set
|
||||||
|
# CONFIG_JFS_DEBUG is not set
|
||||||
|
# CONFIG_JFS_STATISTICS is not set
|
||||||
|
# CONFIG_MINIX_FS is not set
|
||||||
|
# CONFIG_VXFS_FS is not set
|
||||||
|
# CONFIG_NTFS_FS is not set
|
||||||
|
# CONFIG_NTFS_RW is not set
|
||||||
|
# CONFIG_HPFS_FS is not set
|
||||||
|
CONFIG_PROC_FS=y
|
||||||
|
CONFIG_DEVFS_FS=y
|
||||||
|
CONFIG_DEVFS_MOUNT=y
|
||||||
|
# CONFIG_DEVFS_DEBUG is not set
|
||||||
|
# CONFIG_DEVPTS_FS is not set
|
||||||
|
# CONFIG_QNX4FS_FS is not set
|
||||||
|
# CONFIG_QNX4FS_RW is not set
|
||||||
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
# CONFIG_EXT2_FS is not set
|
||||||
|
# CONFIG_SYSV_FS is not set
|
||||||
|
# CONFIG_UDF_FS is not set
|
||||||
|
# CONFIG_UDF_RW is not set
|
||||||
|
# CONFIG_UFS_FS is not set
|
||||||
|
# CONFIG_UFS_FS_WRITE is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Network File Systems
|
||||||
|
#
|
||||||
|
# CONFIG_CODA_FS is not set
|
||||||
|
# CONFIG_INTERMEZZO_FS is not set
|
||||||
|
CONFIG_NFS_FS=m
|
||||||
|
CONFIG_NFS_V3=y
|
||||||
|
# CONFIG_ROOT_NFS is not set
|
||||||
|
CONFIG_SWAP_VIA_NFS=m
|
||||||
|
CONFIG_NETSWAP=y
|
||||||
|
# CONFIG_NFSD is not set
|
||||||
|
# CONFIG_NFSD_V3 is not set
|
||||||
|
# CONFIG_NFSD_TCP is not set
|
||||||
|
CONFIG_SUNRPC=m
|
||||||
|
CONFIG_LOCKD=m
|
||||||
|
CONFIG_LOCKD_V4=y
|
||||||
|
# CONFIG_SMB_FS is not set
|
||||||
|
# CONFIG_NCP_FS is not set
|
||||||
|
# CONFIG_NCPFS_PACKET_SIGNING is not set
|
||||||
|
# CONFIG_NCPFS_IOCTL_LOCKING is not set
|
||||||
|
# CONFIG_NCPFS_STRONG is not set
|
||||||
|
# CONFIG_NCPFS_NFS_NS is not set
|
||||||
|
# CONFIG_NCPFS_OS2_NS is not set
|
||||||
|
# CONFIG_NCPFS_SMALLDOS is not set
|
||||||
|
# CONFIG_NCPFS_NLS is not set
|
||||||
|
# CONFIG_NCPFS_EXTRAS is not set
|
||||||
|
# CONFIG_ZISOFS_FS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Partition Types
|
||||||
|
#
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
# CONFIG_ACORN_PARTITION is not set
|
||||||
|
# CONFIG_OSF_PARTITION is not set
|
||||||
|
# CONFIG_AMIGA_PARTITION is not set
|
||||||
|
# CONFIG_ATARI_PARTITION is not set
|
||||||
|
# CONFIG_MAC_PARTITION is not set
|
||||||
|
# CONFIG_MSDOS_PARTITION is not set
|
||||||
|
# CONFIG_LDM_PARTITION is not set
|
||||||
|
# CONFIG_SGI_PARTITION is not set
|
||||||
|
# CONFIG_ULTRIX_PARTITION is not set
|
||||||
|
# CONFIG_SUN_PARTITION is not set
|
||||||
|
# CONFIG_EFI_PARTITION is not set
|
||||||
|
# CONFIG_SMB_NLS is not set
|
||||||
|
# CONFIG_NLS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multimedia devices
|
||||||
|
#
|
||||||
|
# CONFIG_VIDEO_DEV is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Sound
|
||||||
|
#
|
||||||
|
# CONFIG_SOUND is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# USB support
|
||||||
|
#
|
||||||
|
# CONFIG_USB is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Support for USB gadgets
|
||||||
|
#
|
||||||
|
# CONFIG_USB_GADGET is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bluetooth support
|
||||||
|
#
|
||||||
|
# CONFIG_BLUEZ is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Kernel hacking
|
||||||
|
#
|
||||||
|
CONFIG_CROSSCOMPILE=y
|
||||||
|
# CONFIG_KERNPROF is not set
|
||||||
|
# CONFIG_MCOUNT is not set
|
||||||
|
# CONFIG_DEBUG is not set
|
||||||
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
|
# CONFIG_MIPS_UNCACHED is not set
|
||||||
|
# CONFIG_KTRACE is not set
|
||||||
|
# CONFIG_HWSIM is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Library routines
|
||||||
|
#
|
||||||
|
CONFIG_ZLIB_INFLATE=y
|
||||||
|
CONFIG_ZLIB_DEFLATE=y
|
115
package/linux/linux.mk
Normal file
115
package/linux/linux.mk
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# Linux kernel targets
|
||||||
|
#
|
||||||
|
# Note: If you have any patches to apply, create the directory
|
||||||
|
# sources/kernel-patches and put your patches in there and number
|
||||||
|
# them in the order you wish to apply them... i.e.
|
||||||
|
#
|
||||||
|
# sources/kernel-patches/001-my-special-stuff.bz2
|
||||||
|
# sources/kernel-patches/003-gcc-Os.bz2
|
||||||
|
# sources/kernel-patches/004_no-warnings.bz2
|
||||||
|
# sources/kernel-patches/030-lowlatency-mini.bz2
|
||||||
|
# sources/kernel-patches/031-lowlatency-fixes-5.bz2
|
||||||
|
# sources/kernel-patches/099-shutup.bz2
|
||||||
|
# etc...
|
||||||
|
#
|
||||||
|
# these patches will all be applied by the patch-kernel.sh
|
||||||
|
# script (which will also abort the build if it finds rejects)
|
||||||
|
# -Erik
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
ifneq ($(filter $(TARGETS),linux),)
|
||||||
|
|
||||||
|
# Version of Linux to download and then apply patches to
|
||||||
|
DOWNLOAD_LINUX_VERSION=2.4.27
|
||||||
|
# Version of Linux AFTER patches
|
||||||
|
LINUX_VERSION=2.4.28-pre4-erik
|
||||||
|
|
||||||
|
LINUX_FORMAT=vmlinux
|
||||||
|
#LINUX_FORMAT=images/zImage.prep
|
||||||
|
LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \
|
||||||
|
-e 's/mipsel/mips/' \
|
||||||
|
-e 's/powerpc/ppc/' \
|
||||||
|
-e 's/sh[234]/sh/' \
|
||||||
|
)
|
||||||
|
LINUX_BINLOC=arch/$(LINUX_KARCH)/boot/$(LINUX_FORMAT)
|
||||||
|
|
||||||
|
LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION)
|
||||||
|
LINUX_SOURCE=linux-$(DOWNLOAD_LINUX_VERSION).tar.bz2
|
||||||
|
LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.4
|
||||||
|
LINUX_KCONFIG=package/linux/linux.config
|
||||||
|
LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel
|
||||||
|
# Used by pcmcia-cs and others
|
||||||
|
LINUX_SOURCE_DIR=$(LINUX_DIR)
|
||||||
|
|
||||||
|
|
||||||
|
$(DL_DIR)/$(LINUX_SOURCE):
|
||||||
|
-mkdir -p $(DL_DIR)
|
||||||
|
$(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE)
|
||||||
|
|
||||||
|
$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE)
|
||||||
|
-mkdir -p $(TOOL_BUILD_DIR)
|
||||||
|
-(cd $(TOOL_BUILD_DIR); ln -sf $(LINUX_DIR) linux)
|
||||||
|
bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
ifneq ($(DOWNLOAD_LINUX_VERSION),$(LINUX_VERSION))
|
||||||
|
# Rename the dir from the downloaded version to the AFTER patch version
|
||||||
|
mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX_VERSION) $(BUILD_DIR)/linux-$(LINUX_VERSION)
|
||||||
|
endif
|
||||||
|
mkdir -p package/linux/kernel-patches
|
||||||
|
toolchain/patch-kernel.sh $(LINUX_DIR) package/linux/kernel-patches
|
||||||
|
touch $(LINUX_DIR)/.unpacked
|
||||||
|
|
||||||
|
$(LINUX_KCONFIG):
|
||||||
|
@if [ ! -f "$(LINUX_KCONFIG)" ] ; then \
|
||||||
|
echo ""; \
|
||||||
|
echo "You should create a .config for your kernel"; \
|
||||||
|
echo "and install it as $(LINUX_KCONFIG)"; \
|
||||||
|
echo ""; \
|
||||||
|
sleep 5; \
|
||||||
|
fi;
|
||||||
|
|
||||||
|
$(LINUX_DIR)/.configured $(BUILD_DIR)/linux/.configured: $(LINUX_DIR)/.unpacked $(LINUX_KCONFIG)
|
||||||
|
$(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile
|
||||||
|
-cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config
|
||||||
|
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) oldconfig include/linux/version.h
|
||||||
|
touch $(LINUX_DIR)/.configured
|
||||||
|
|
||||||
|
$(LINUX_DIR)/.depend_done: $(LINUX_DIR)/.configured
|
||||||
|
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) dep
|
||||||
|
touch $(LINUX_DIR)/.depend_done
|
||||||
|
|
||||||
|
$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done
|
||||||
|
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) $(LINUX_FORMAT)
|
||||||
|
$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) modules
|
||||||
|
|
||||||
|
$(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC)
|
||||||
|
cp -fa $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_KERNEL)
|
||||||
|
touch -c $(LINUX_KERNEL)
|
||||||
|
|
||||||
|
$(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep: $(LINUX_KERNEL)
|
||||||
|
rm -rf $(TARGET_DIR)/lib/modules
|
||||||
|
rm -f $(TARGET_DIR)/sbin/cardmgr
|
||||||
|
$(MAKE) -C $(LINUX_DIR) INSTALL_MOD_PATH=$(TARGET_DIR) modules_install
|
||||||
|
(cd $(TARGET_DIR)/lib/modules; ln -s $(LINUX_VERSION)/kernel/drivers .)
|
||||||
|
|
||||||
|
$(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured
|
||||||
|
mkdir -p $(STAGING_DIR)/include
|
||||||
|
tar -ch -C $(LINUX_DIR)/include -f - linux | tar -xf - -C $(STAGING_DIR)/include/
|
||||||
|
tar -ch -C $(LINUX_DIR)/include -f - asm | tar -xf - -C $(STAGING_DIR)/include/
|
||||||
|
|
||||||
|
linux: $(STAGING_DIR)/include/linux/version.h $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep
|
||||||
|
|
||||||
|
linux-source: $(DL_DIR)/$(LINUX_SOURCE)
|
||||||
|
|
||||||
|
# This has been renamed so we do _NOT_ by default run this on 'make clean'
|
||||||
|
linuxclean: clean
|
||||||
|
rm -f $(LINUX_KERNEL)
|
||||||
|
-$(MAKE) -C $(LINUX_DIR) clean
|
||||||
|
|
||||||
|
linux-dirclean:
|
||||||
|
rm -rf $(LINUX_DIR)
|
||||||
|
|
||||||
|
linux-headers: $(LINUX_DIR)/.configured
|
||||||
|
|
||||||
|
endif
|
9
package/sed/Config.in
Normal file
9
package/sed/Config.in
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
config BR2_PACKAGE_SED
|
||||||
|
bool "sed"
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Super-useful stream editor.
|
||||||
|
|
||||||
|
http://sed.sourceforge.net/
|
||||||
|
|
||||||
|
Most people will answer Y.
|
3
package/sed/Makefile.in
Normal file
3
package/sed/Makefile.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
ifeq ($(strip $(BR2_PACKAGE_SED)),y)
|
||||||
|
TARGETS+=sed
|
||||||
|
endif
|
136
package/sed/sed.mk
Normal file
136
package/sed/sed.mk
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# sed
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
SED_VER:=4.1.2
|
||||||
|
SED_SOURCE:=sed-$(SED_VER).tar.gz
|
||||||
|
SED_SITE:=ftp://ftp.gnu.org/gnu/sed
|
||||||
|
SED_CAT:=zcat
|
||||||
|
SED_DIR1:=$(TOOL_BUILD_DIR)/sed-$(SED_VER)
|
||||||
|
SED_DIR2:=$(BUILD_DIR)/sed-$(SED_VER)
|
||||||
|
SED_BINARY:=sed/sed
|
||||||
|
SED_TARGET_BINARY:=bin/sed
|
||||||
|
ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true)
|
||||||
|
SED_CPPFLAGS=-D_FILE_OFFSET_BITS=64
|
||||||
|
endif
|
||||||
|
SED:=$(STAGING_DIR)/bin/sed -i -e
|
||||||
|
HOST_SED_TARGET=$(shell package/sed/sedcheck.sh)
|
||||||
|
|
||||||
|
$(DL_DIR)/$(SED_SOURCE):
|
||||||
|
mkdir -p $(DL_DIR)
|
||||||
|
$(WGET) -P $(DL_DIR) $(SED_SITE)/$(SED_SOURCE)
|
||||||
|
|
||||||
|
sed-source: $(DL_DIR)/$(SED_SOURCE)
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# build sed for use on the host system
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
$(SED_DIR1)/.unpacked: $(DL_DIR)/$(SED_SOURCE)
|
||||||
|
mkdir -p $(TOOL_BUILD_DIR)
|
||||||
|
mkdir -p $(STAGING_DIR)/bin;
|
||||||
|
$(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
touch $(SED_DIR1)/.unpacked
|
||||||
|
|
||||||
|
$(SED_DIR1)/.configured: $(SED_DIR1)/.unpacked
|
||||||
|
(cd $(SED_DIR1); rm -rf config.cache; \
|
||||||
|
./configure \
|
||||||
|
--prefix=$(STAGING_DIR) \
|
||||||
|
--prefix=/usr \
|
||||||
|
);
|
||||||
|
touch $(SED_DIR1)/.configured
|
||||||
|
|
||||||
|
$(SED_DIR1)/$(SED_BINARY): $(SED_DIR1)/.configured
|
||||||
|
$(MAKE) -C $(SED_DIR1)
|
||||||
|
|
||||||
|
# This stuff is needed to work around GNU make deficiencies
|
||||||
|
build-sed-host-binary: $(SED_DIR1)/$(SED_BINARY)
|
||||||
|
@if [ -L $(STAGING_DIR)/$(SED_TARGET_BINARY) ] ; then \
|
||||||
|
rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); fi;
|
||||||
|
@if [ ! -f $(STAGING_DIR)/$(SED_TARGET_BINARY) -o $(STAGING_DIR)/$(SED_TARGET_BINARY) \
|
||||||
|
-ot $(SED_DIR1)/$(SED_BINARY) ] ; then \
|
||||||
|
set -x; \
|
||||||
|
mkdir -p $(STAGING_DIR)/bin; \
|
||||||
|
$(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) install; \
|
||||||
|
mv $(STAGING_DIR)/usr/bin/sed $(STAGING_DIR)/bin/; \
|
||||||
|
rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/usr/info \
|
||||||
|
$(STAGING_DIR)/usr/man $(STAGING_DIR)/usr/share/doc; fi
|
||||||
|
|
||||||
|
use-sed-host-binary:
|
||||||
|
@if [ -x /usr/bin/sed ]; then SED="/usr/bin/sed"; else \
|
||||||
|
if [ -x /bin/sed ]; then SED="/bin/sed"; fi; fi; \
|
||||||
|
mkdir -p $(STAGING_DIR)/bin; \
|
||||||
|
rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); \
|
||||||
|
ln -s $$SED $(STAGING_DIR)/$(SED_TARGET_BINARY)
|
||||||
|
|
||||||
|
host-sed: $(HOST_SED_TARGET)
|
||||||
|
|
||||||
|
host-sed-clean:
|
||||||
|
$(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) uninstall
|
||||||
|
-$(MAKE) -C $(SED_DIR1) clean
|
||||||
|
|
||||||
|
host-sed-dirclean:
|
||||||
|
rm -rf $(SED_DIR1)
|
||||||
|
|
||||||
|
|
||||||
|
#############################################################
|
||||||
|
#
|
||||||
|
# build sed for use on the target system
|
||||||
|
#
|
||||||
|
#############################################################
|
||||||
|
$(SED_DIR2)/.unpacked: $(DL_DIR)/$(SED_SOURCE)
|
||||||
|
$(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
|
||||||
|
touch $(SED_DIR2)/.unpacked
|
||||||
|
|
||||||
|
$(SED_DIR2)/.configured: $(SED_DIR2)/.unpacked
|
||||||
|
(cd $(SED_DIR2); rm -rf config.cache; \
|
||||||
|
$(TARGET_CONFIGURE_OPTS) \
|
||||||
|
CFLAGS="$(TARGET_CFLAGS)" \
|
||||||
|
CPPFLAGS="$(SED_CFLAGS)" \
|
||||||
|
./configure \
|
||||||
|
--target=$(GNU_TARGET_NAME) \
|
||||||
|
--host=$(GNU_TARGET_NAME) \
|
||||||
|
--build=$(GNU_HOST_NAME) \
|
||||||
|
--prefix=/usr \
|
||||||
|
--exec-prefix=/usr \
|
||||||
|
--bindir=/usr/bin \
|
||||||
|
--sbindir=/usr/sbin \
|
||||||
|
--libexecdir=/usr/lib \
|
||||||
|
--sysconfdir=/etc \
|
||||||
|
--datadir=/usr/share \
|
||||||
|
--localstatedir=/var \
|
||||||
|
--mandir=/usr/man \
|
||||||
|
--infodir=/usr/info \
|
||||||
|
$(DISABLE_NLS) \
|
||||||
|
);
|
||||||
|
touch $(SED_DIR2)/.configured
|
||||||
|
|
||||||
|
$(SED_DIR2)/$(SED_BINARY): $(SED_DIR2)/.configured
|
||||||
|
$(MAKE) CC=$(TARGET_CC) -C $(SED_DIR2)
|
||||||
|
|
||||||
|
# This stuff is needed to work around GNU make deficiencies
|
||||||
|
sed-target_binary: $(SED_DIR2)/$(SED_BINARY)
|
||||||
|
@if [ -L $(TARGET_DIR)/$(SED_TARGET_BINARY) ] ; then \
|
||||||
|
rm -f $(TARGET_DIR)/$(SED_TARGET_BINARY); fi;
|
||||||
|
|
||||||
|
@if [ ! -f $(SED_DIR2)/$(SED_BINARY) -o $(TARGET_DIR)/$(SED_TARGET_BINARY) \
|
||||||
|
-ot $(SED_DIR2)/$(SED_BINARY) ] ; then \
|
||||||
|
set -x; \
|
||||||
|
$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) install; \
|
||||||
|
mv $(TARGET_DIR)/usr/bin/sed $(TARGET_DIR)/bin/; \
|
||||||
|
rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
|
||||||
|
$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi
|
||||||
|
|
||||||
|
sed: uclibc sed-target_binary
|
||||||
|
|
||||||
|
sed-clean:
|
||||||
|
$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) uninstall
|
||||||
|
-$(MAKE) -C $(SED_DIR2) clean
|
||||||
|
|
||||||
|
sed-dirclean:
|
||||||
|
rm -rf $(SED_DIR2)
|
||||||
|
|
||||||
|
|
21
package/sed/sedcheck.sh
Executable file
21
package/sed/sedcheck.sh
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if [ -x /usr/bin/sed ]; then
|
||||||
|
SED="/usr/bin/sed";
|
||||||
|
else
|
||||||
|
if [ -x /bin/sed ]; then
|
||||||
|
SED="/bin/sed";
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
echo "HELLO" > .sedtest
|
||||||
|
$SED -i -e "s/HELLO/GOODBYE/" .sedtest >/dev/null 2>&1
|
||||||
|
|
||||||
|
if [ $? != 0 ] ; then
|
||||||
|
echo build-sed-host-binary
|
||||||
|
else
|
||||||
|
echo use-sed-host-binary
|
||||||
|
fi;
|
||||||
|
rm -f .sedtest
|
||||||
|
|
||||||
|
|
8
target/Config.in
Normal file
8
target/Config.in
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#
|
||||||
|
|
||||||
|
menu "Target Filesystem"
|
||||||
|
|
||||||
|
source "target/jffs2/Config.in"
|
||||||
|
|
||||||
|
endmenu
|
||||||
|
|
1
target/Makefile.in
Normal file
1
target/Makefile.in
Normal file
@ -0,0 +1 @@
|
|||||||
|
# Nothing
|
162
target/default/device_table.txt
Normal file
162
target/default/device_table.txt
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
# When building a target filesystem, it is desirable to not have to
|
||||||
|
# become root and then run 'mknod' a thousand times. Using a device
|
||||||
|
# table you can create device nodes and directories "on the fly".
|
||||||
|
#
|
||||||
|
# This is a sample device table file for use with genext2fs. You can
|
||||||
|
# do all sorts of interesting things with a device table file. For
|
||||||
|
# example, if you want to adjust the permissions on a particular file
|
||||||
|
# you can just add an entry like:
|
||||||
|
# /sbin/foobar f 2755 0 0 - - - - -
|
||||||
|
# and (assuming the file /sbin/foobar exists) it will be made setuid
|
||||||
|
# root (regardless of what its permissions are on the host filesystem.
|
||||||
|
# Furthermore, you can use a single table entry to create a many device
|
||||||
|
# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15]
|
||||||
|
# I could just use the following two table entries:
|
||||||
|
# /dev/hda b 640 0 0 3 0 0 0 -
|
||||||
|
# /dev/hda b 640 0 0 3 1 1 1 15
|
||||||
|
#
|
||||||
|
# Device table entries take the form of:
|
||||||
|
# <name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
|
||||||
|
# where name is the file name, type can be one of:
|
||||||
|
# f A regular file
|
||||||
|
# d Directory
|
||||||
|
# c Character special device file
|
||||||
|
# b Block special device file
|
||||||
|
# p Fifo (named pipe)
|
||||||
|
# uid is the user id for the target file, gid is the group id for the
|
||||||
|
# target file. The rest of the entries (major, minor, etc) apply only
|
||||||
|
# to device special files.
|
||||||
|
|
||||||
|
# Have fun
|
||||||
|
# -Erik Andersen <andersen@codepoet.org>
|
||||||
|
#
|
||||||
|
|
||||||
|
#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
|
||||||
|
/dev d 755 0 0 - - - - -
|
||||||
|
/dev/pts d 755 0 0 - - - - -
|
||||||
|
/tmp d 1777 0 0 - - - - -
|
||||||
|
/etc d 755 0 0 - - - - -
|
||||||
|
/home/default d 2755 1000 1000 - - - - -
|
||||||
|
#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count>
|
||||||
|
/bin/busybox f 4755 0 0 - - - - -
|
||||||
|
/etc/shadow f 600 0 0 - - - - -
|
||||||
|
/etc/passwd f 644 0 0 - - - - -
|
||||||
|
/etc/network/if-up.d d 755 0 0 - - - - -
|
||||||
|
/etc/network/if-pre-up.d d 755 0 0 - - - - -
|
||||||
|
/etc/network/if-down.d d 755 0 0 - - - - -
|
||||||
|
/etc/network/if-post-down.d d 755 0 0 - - - - -
|
||||||
|
/usr/share/udhcpc/default.script f 755 0 0 - - - - -
|
||||||
|
# uncomment this to allow starting x as non-root
|
||||||
|
#/usr/X11R6/bin/Xfbdev f 4755 0 0 - - - - -
|
||||||
|
# Normal system devices
|
||||||
|
/dev/mem c 640 0 0 1 1 0 0 -
|
||||||
|
/dev/kmem c 640 0 0 1 2 0 0 -
|
||||||
|
/dev/null c 666 0 0 1 3 0 0 -
|
||||||
|
/dev/zero c 666 0 0 1 5 0 0 -
|
||||||
|
/dev/random c 666 0 0 1 8 0 0 -
|
||||||
|
/dev/urandom c 666 0 0 1 9 0 0 -
|
||||||
|
/dev/ram b 640 0 0 1 1 0 0 -
|
||||||
|
/dev/ram b 640 0 0 1 0 0 1 4
|
||||||
|
/dev/loop b 640 0 0 7 0 0 1 2
|
||||||
|
/dev/rtc c 640 0 0 10 135 - - -
|
||||||
|
/dev/console c 666 0 0 5 1 - - -
|
||||||
|
/dev/tty c 666 0 0 5 0 - - -
|
||||||
|
/dev/tty c 666 0 0 4 0 0 1 8
|
||||||
|
/dev/ttyp c 666 0 0 3 0 0 1 10
|
||||||
|
/dev/ptyp c 666 0 0 2 0 0 1 10
|
||||||
|
/dev/ptmx c 666 0 0 5 2 - - -
|
||||||
|
/dev/ttyP c 666 0 0 57 0 0 1 4
|
||||||
|
/dev/ttyS c 666 0 0 4 64 0 1 4
|
||||||
|
/dev/fb c 640 0 5 29 0 0 32 4
|
||||||
|
#/dev/ttySA c 666 0 0 204 5 0 1 3
|
||||||
|
/dev/psaux c 666 0 0 10 1 0 0 -
|
||||||
|
#/dev/ppp c 666 0 0 108 0 - - -
|
||||||
|
|
||||||
|
# MTD stuff
|
||||||
|
/dev/mtd c 640 0 0 90 0 0 2 4
|
||||||
|
/dev/mtdblock b 640 0 0 31 0 0 1 4
|
||||||
|
|
||||||
|
#Tun/tap driver
|
||||||
|
/dev/net d 755 0 0 - - - - -
|
||||||
|
/dev/net/tun c 660 0 0 10 200 - - -
|
||||||
|
|
||||||
|
# Audio stuff
|
||||||
|
#/dev/audio c 666 0 29 14 4 - - -
|
||||||
|
#/dev/audio1 c 666 0 29 14 20 - - -
|
||||||
|
#/dev/dsp c 666 0 29 14 3 - - -
|
||||||
|
#/dev/dsp1 c 666 0 29 14 19 - - -
|
||||||
|
#/dev/sndstat c 666 0 29 14 6 - - -
|
||||||
|
|
||||||
|
# User-mode Linux stuff
|
||||||
|
/dev/ubda b 640 0 0 98 0 0 0 -
|
||||||
|
/dev/ubda b 640 0 0 98 1 1 1 15
|
||||||
|
|
||||||
|
# IDE Devices
|
||||||
|
/dev/hda b 640 0 0 3 0 0 0 -
|
||||||
|
/dev/hda b 640 0 0 3 1 1 1 15
|
||||||
|
/dev/hdb b 640 0 0 3 64 0 0 -
|
||||||
|
/dev/hdb b 640 0 0 3 65 1 1 15
|
||||||
|
#/dev/hdc b 640 0 0 22 0 0 0 -
|
||||||
|
#/dev/hdc b 640 0 0 22 1 1 1 15
|
||||||
|
#/dev/hdd b 640 0 0 22 64 0 0 -
|
||||||
|
#/dev/hdd b 640 0 0 22 65 1 1 15
|
||||||
|
#/dev/hde b 640 0 0 33 0 0 0 -
|
||||||
|
#/dev/hde b 640 0 0 33 1 1 1 15
|
||||||
|
#/dev/hdf b 640 0 0 33 64 0 0 -
|
||||||
|
#/dev/hdf b 640 0 0 33 65 1 1 15
|
||||||
|
#/dev/hdg b 640 0 0 34 0 0 0 -
|
||||||
|
#/dev/hdg b 640 0 0 34 1 1 1 15
|
||||||
|
#/dev/hdh b 640 0 0 34 64 0 0 -
|
||||||
|
#/dev/hdh b 640 0 0 34 65 1 1 15
|
||||||
|
|
||||||
|
# SCSI Devices
|
||||||
|
#/dev/sda b 640 0 0 8 0 0 0 -
|
||||||
|
#/dev/sda b 640 0 0 8 1 1 1 15
|
||||||
|
#/dev/sdb b 640 0 0 8 16 0 0 -
|
||||||
|
#/dev/sdb b 640 0 0 8 17 1 1 15
|
||||||
|
#/dev/sdc b 640 0 0 8 32 0 0 -
|
||||||
|
#/dev/sdc b 640 0 0 8 33 1 1 15
|
||||||
|
#/dev/sdd b 640 0 0 8 48 0 0 -
|
||||||
|
#/dev/sdd b 640 0 0 8 49 1 1 15
|
||||||
|
#/dev/sde b 640 0 0 8 64 0 0 -
|
||||||
|
#/dev/sde b 640 0 0 8 65 1 1 15
|
||||||
|
#/dev/sdf b 640 0 0 8 80 0 0 -
|
||||||
|
#/dev/sdf b 640 0 0 8 81 1 1 15
|
||||||
|
#/dev/sdg b 640 0 0 8 96 0 0 -
|
||||||
|
#/dev/sdg b 640 0 0 8 97 1 1 15
|
||||||
|
#/dev/sdh b 640 0 0 8 112 0 0 -
|
||||||
|
#/dev/sdh b 640 0 0 8 113 1 1 15
|
||||||
|
#/dev/sg c 640 0 0 21 0 0 1 15
|
||||||
|
#/dev/scd b 640 0 0 11 0 0 1 15
|
||||||
|
#/dev/st c 640 0 0 9 0 0 1 8
|
||||||
|
#/dev/nst c 640 0 0 9 128 0 1 8
|
||||||
|
#/dev/st c 640 0 0 9 32 1 1 4
|
||||||
|
#/dev/st c 640 0 0 9 64 1 1 4
|
||||||
|
#/dev/st c 640 0 0 9 96 1 1 4
|
||||||
|
|
||||||
|
# Floppy disk devices
|
||||||
|
#/dev/fd b 640 0 0 2 0 0 1 2
|
||||||
|
#/dev/fd0d360 b 640 0 0 2 4 0 0 -
|
||||||
|
#/dev/fd1d360 b 640 0 0 2 5 0 0 -
|
||||||
|
#/dev/fd0h1200 b 640 0 0 2 8 0 0 -
|
||||||
|
#/dev/fd1h1200 b 640 0 0 2 9 0 0 -
|
||||||
|
#/dev/fd0u1440 b 640 0 0 2 28 0 0 -
|
||||||
|
#/dev/fd1u1440 b 640 0 0 2 29 0 0 -
|
||||||
|
#/dev/fd0u2880 b 640 0 0 2 32 0 0 -
|
||||||
|
#/dev/fd1u2880 b 640 0 0 2 33 0 0 -
|
||||||
|
|
||||||
|
# All the proprietary cdrom devices in the world
|
||||||
|
#/dev/aztcd b 640 0 0 29 0 0 0 -
|
||||||
|
#/dev/bpcd b 640 0 0 41 0 0 0 -
|
||||||
|
#/dev/capi20 c 640 0 0 68 0 0 1 2
|
||||||
|
#/dev/cdu31a b 640 0 0 15 0 0 0 -
|
||||||
|
#/dev/cdu535 b 640 0 0 24 0 0 0 -
|
||||||
|
#/dev/cm206cd b 640 0 0 32 0 0 0 -
|
||||||
|
#/dev/sjcd b 640 0 0 18 0 0 0 -
|
||||||
|
#/dev/sonycd b 640 0 0 15 0 0 0 -
|
||||||
|
#/dev/gscd b 640 0 0 16 0 0 0 -
|
||||||
|
#/dev/sbpcd b 640 0 0 25 0 0 0 -
|
||||||
|
#/dev/sbpcd b 640 0 0 25 0 0 1 4
|
||||||
|
#/dev/mcd b 640 0 0 23 0 0 0 -
|
||||||
|
#/dev/optcd b 640 0 0 17 0 0 0 -
|
||||||
|
|
BIN
target/default/skel.tar.gz
Normal file
BIN
target/default/skel.tar.gz
Normal file
Binary file not shown.
1
target/default/target_skeleton/etc/TZ
Normal file
1
target/default/target_skeleton/etc/TZ
Normal file
@ -0,0 +1 @@
|
|||||||
|
MST7MDT
|
8
target/default/target_skeleton/etc/fstab
Normal file
8
target/default/target_skeleton/etc/fstab
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# /etc/fstab: static file system information.
|
||||||
|
#
|
||||||
|
# <file system> <mount pt> <type> <options> <dump> <pass>
|
||||||
|
/dev/root / ext2 rw,noauto 0 1
|
||||||
|
proc /proc proc defaults 0 0
|
||||||
|
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
|
||||||
|
tmpfs /tmp tmpfs defaults 0 0
|
||||||
|
|
10
target/default/target_skeleton/etc/group
Normal file
10
target/default/target_skeleton/etc/group
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
root:x:0:
|
||||||
|
daemon:x:1:
|
||||||
|
bin:x:2:
|
||||||
|
sys:x:3:
|
||||||
|
adm:x:4:
|
||||||
|
tty:x:5:
|
||||||
|
disk:x:6:
|
||||||
|
utmp:x:43:
|
||||||
|
staff:x:50:
|
||||||
|
default:x:1000:
|
1
target/default/target_skeleton/etc/hostname
Normal file
1
target/default/target_skeleton/etc/hostname
Normal file
@ -0,0 +1 @@
|
|||||||
|
uclibc
|
1
target/default/target_skeleton/etc/hosts
Normal file
1
target/default/target_skeleton/etc/hosts
Normal file
@ -0,0 +1 @@
|
|||||||
|
127.0.0.1 localhost
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user