#!/bin/sh
#
# Configure 1.229 2003/01/12 17:52:42
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.1 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and
# limitations under the License.
#
# The initial developer of the original code is David A. Hinds
# <dhinds@pcmcia.sourceforge.org>.  Portions created by David A. Hinds
# are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
#
# Alternatively, the contents of this file may be used under the terms
# of the GNU General Public License version 2 (the "GPL"), in which case
# the provisions of the GPL are applicable instead of the above.  If you
# wish to allow the use of your version of this file only under the
# terms of the GPL and not to allow others to use your version of this
# file under the MPL, indicate your decision by deleting the provisions
# above and replace them with the notice and other provisions required
# by the GPL.  If you do not delete the provisions above, a recipient
# may use your version of this file under either the MPL or the GPL.
#
#=======================================================================

fail ()
{
    echo ""
    echo "Configuration failed."
    echo ""
    exit 1
}

qgrep ()
{
    grep $* >/dev/null 2>&1
}

# Minimal requirements for sanity
if [ ! -L include/linux/config.h ] ; then
    echo "Ack!  The PCMCIA distribution is incomplete/damaged!"
    echo "    Unpack again -- and try using a Linux filesystem this time."
    fail
fi

if ! make -v >/dev/null ; then
    echo "Ack!  This system does not have a 'make' command!"
    echo "    Install a normal set of Linux development tools and try again."
    fail
fi
if ! gcc -v >/dev/null 2>&1 ; then
    echo "Ack!  Your system does not have 'gcc' installed!"
    echo "    Install a normal set of Linux development tools and try again."
    fail
fi

if [ -r config.out ] ; then
    . ./config.out 2>/dev/null
else
    if [ ! -r config.in ] ; then
	echo "config.in does not exist!"
	fail
    fi
    . ./config.in
fi

#=======================================================================

PROMPT=y

arg () {
    VALUE="`echo X"$2" | sed -e 's/^X--[a-zA-Z_]*=//'`"
    eval $1=\"$VALUE\"
}

usage () {
    echo "usage: $0 [-n|--noprompt] [--kernel=src-dir] [--target=dir]"
    echo "    [--moddir=dir] [--arch={i386|alpha|arm|ppc] [--ucc=path]"
    echo "    [--kcc=path] [--ld=path] [--uflags=flags] [--kflags=flags]"
    echo "    [--debug=flags] [--{no}trust] [--{no}cardbus] [--{no}pnp]"
    echo "    [--{no}apm] [--force] [--current] [--srctree] [--sysv]"
    echo "    [--bsd] [--rcdir=dir] [--extraver=ver]"
    echo ""
    echo "  -n, --noprompt     non-interactive mode: no prompting"
    echo "  --kernel=DIR       use kernel source tree at DIR"
    echo "  --target=DIR       install all files using DIR as root"
    echo "  --moddir=DIR       install modules under DIR"
    echo "  --arch=ARCH        select target architecture for build"
    echo "  --ucc=PATH         specify C compiler for user code"
    echo "  --kcc=PATH         specify C compiler for kernel code"
    echo "  --ld=PATH          use another linker"
    echo "  --uflags=FLAGS     set compiler flags for user-mode tools"
    echo "  --kflags=FLAGS     set compiler flags for kernel modules"
    echo "  --debug=FLAGS      set compiler flags for debugging"
    echo "  --{no}trust        disable or enable trusted user tools"
    echo "  --{no}cardbus      disable or enable CardBus card support"
    echo "  --{no}pnp          disable or enable PnP BIOS support"
    echo "  --{no}apm          disable or enable power management support"
    echo "  --force            ignore presence of 2.4 kernel drivers"
    echo "  --current          read configuration of current kernel"
    echo "  --srctree          read kernel configuration from source tree"
    echo "  --sysv             target has SysV init script layout"
    echo "  --bsd              target uses BSD init scripts"
    echo "  --rcdir=DIR        SysV init scripts are under DIR"
    echo "  --extraver=VER     overrides EXTRAVERSION in kernel Makefile"
    exit 1
}

while [ $# -gt 0 ] ; do
    case "$1" in
    -n|--noprompt)	PROMPT=n		;;
    --kernel=*)		arg LINUX $1 		;;
    --target=*)		arg PREFIX $1		;;
    --moddir=*)		arg MODDIR $1		;;
    --cc=*)		arg UCC "$1"		;;
    --ucc=*)		arg UCC "$1"		;;
    --kcc=*)		arg KCC "$1"		;;
    --ld=*)		arg LD "$1"		;;
    --debug=*)		arg PCDEBUG "$1"	;;
    --kflags=*)		arg KFLAGS "$1"		;;
    --uflags=*)		arg UFLAGS "$1"		;;
    --arch=*)		arg ARCH "$1"		;;
    --trust)		UNSAFE_TOOLS=y		;;
    --notrust)		UNSAFE_TOOLS=n		;;
    --cardbus)		CONFIG_CARDBUS=y	;;
    --nocardbus)	CONFIG_CARDBUS=n	;;
    --pnp)		CONFIG_PNP_BIOS=y	;;
    --nopnp)		CONFIG_PNP_BIOS=n	;;
    --apm)		USE_PM=y		;;
    --noapm)		USE_PM=n		;;
    --force)		FORCE=y			;;
    --current)		CONF_SRC=1		;;
    --srctree)		CONF_SRC=2		;;
    --sysv)		SYSV_INIT=y		;;
    --bsd)		SYSV_INIT=n		;;
    --rcdir=*)		arg RC_DIR "$1"		;;
    --extraver=*)	arg EXTRAVER "$1"	;;
    *)			usage			;;
    esac
    shift
done

#=======================================================================

CONFIG=config.new
CONFIG_H=include/pcmcia/config.h
CONFIG_MK=config.mk
MODVER=include/linux/modversions.h
rm -f .prereq.ok $CONFIG $CONFIG_H $CONFIG_MK $MODVER

cat << 'EOF' > $CONFIG
#
# Automatically generated by 'make config' -- don't edit!
#
EOF

cat << 'EOF' > $CONFIG_H
/*
  Automatically generated by 'make config' -- don't edit!
*/
#ifndef _PCMCIA_CONFIG_H
#define _PCMCIA_CONFIG_H

#define AUTOCONF_INCLUDED
#define __IN_PCMCIA_PACKAGE__

EOF

write_bool() {
    value=`eval echo '$'$1`
    if [ "$value" = "y" ] ; then
	echo "$1=y" >> $CONFIG
	echo "$1=y" >> $CONFIG_MK
	echo "#define $1 1" >> $CONFIG_H
    else
	echo "# $1 is not defined" >> $CONFIG
	echo "# $1 is not defined" >> $CONFIG_MK
	echo "#undef  $1" >> $CONFIG_H
    fi
}

write_int () {
    value=`eval echo '$'$1`
    echo "$1"=$value >> $CONFIG
    echo "$1=$value" >> $CONFIG_MK
    echo "#define $1 $value" >> $CONFIG_H
}

write_str () {
    value=`eval echo '$'$1`
    echo "$1"=\"$value\" >> $CONFIG
    echo "$1=$value" >> $CONFIG_MK
    echo "#define $1 \"$value\"" >> $CONFIG_H
}

prompt () {
    eval $3=\"$2\"
    if [ "$PROMPT" = "y" ] ; then
	/bin/echo -e "$1 [$2]: \c"
	read tmp
	if [ ! -t 1 ] ; then echo $tmp ; fi
	if [ -n "$tmp" ] ; then eval $3=\"$tmp\" ; fi
    else
	/bin/echo "$1 [$2]"
    fi
}

ask_bool () {
    default=`eval echo '$'$2`
    if [ ! "$default" ] ; then default=n ; fi
    answer=""
    while [ "$answer" != "n" -a "$answer" != "y" ] ; do
	prompt "$1 (y/n)" "$default" answer
    done
    eval "$2=$answer"
    write_bool $2
}

ask_str () {
    default=`eval echo '$'$2`
    prompt "$1" "`echo $default`" answer
    eval $2=\"$answer\"
    write_str $2
}

#=======================================================================

echo ""
echo "    -------- Linux PCMCIA Configuration Script --------"
echo ""
echo "The default responses for each question are correct for most users."
echo "Consult the PCMCIA-HOWTO for additional info about each option."
echo ""

ask_str "Linux kernel source directory" LINUX

match () { case "$1" in $2) return 0; ;; *) return 1;; esac ; }
if ! match "$LINUX" "/*" ; then
    echo "$LINUX is not an absolute path!"
    fail
fi

if [ ! -f $LINUX/kernel/Makefile ] ; then
    echo "Linux source tree '$LINUX' is incomplete or missing!"
    if [ -d $LINUX/include/linux ] ; then
	echo "    The kernel header files are present, but not " \
	     "the full source code."
    fi
    echo "    See the HOWTO for a list of FTP sites for current" \
	 "kernel sources."
    fail
fi

# What kernel are we compiling for?

version () {
    expr $1 \* 65536 + $2 \* 256 + $3
}

echo ""
for TAG in VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION ; do
    eval `sed -ne "/^$TAG/s/[ 	]//gp" $LINUX/Makefile`
done
if [ "$EXTRAVER" != "" ] ; then
    EXTRAVERSION=$EXTRAVER
    write_str EXTRAVER
fi
SRC_RELEASE=$VERSION.$PATCHLEVEL.$SUBLEVEL$EXTRAVERSION
SRC_BASE=$VERSION.$PATCHLEVEL.$SUBLEVEL
VERSION_CODE=`version $VERSION $PATCHLEVEL $SUBLEVEL`
echo "The kernel source tree is version $SRC_RELEASE."

if [ $VERSION_CODE -lt `version 2 0 0` ] ; then
    echo "This package requires at least a 2.0 series kernel."
    fail
elif [ $VERSION_CODE -ge `version 2 1 0` -a \
     $VERSION_CODE -lt `version 2 2 0` ] ; then
    echo "2.1 kernels are not supported.  Upgrade to 2.2."
    fail
elif [ $VERSION_CODE -ge `version 2 3 0` -a \
     $VERSION_CODE -lt `version 2 4 0` ] ; then
    echo "2.3 kernels are not supported.  Upgrade to 2.4."
    fail
fi

HOST_ARCH=`uname -m | sed -e 's/i.86/i386/'`
if [ ! "$ARCH" ] ; then ARCH=$HOST_ARCH ; fi
CUR_RELEASE=`uname -r`
CUR_VERSION=`uname -v`
CUR_BASE=`uname -r | sed -e "s/^\([0-9]\.[0-9]\.[0-9]*\).*/\1/"`
MATCH=0 # default: different releases and/or architectures
if [ $ARCH = $HOST_ARCH ] ; then
    if [ $CUR_RELEASE = $SRC_RELEASE ] ; then
	MATCH=1 # same release, perfect match
    elif [ $CUR_BASE = $SRC_BASE ] ; then
	MATCH=1 # well, maybe same source tree
	echo "  WARNING: the current kernel is sublevel $CUR_RELEASE."
    else
	echo "  WARNING: the current kernel is version $CUR_RELEASE."
    fi
fi

# Check for consistent kernel build dates

CUR_D=`uname -v | sed -e 's/^#[0-9]* //;s/SMP //'`
CUR_D=`echo $CUR_D | sed -e 's/\(:[0-9][0-9]\) .* \([12][90]\)/\1 \2/'`
echo "The current kernel build date is $CUR_D."
SRC_VERSION="unknown";
if [ -f $LINUX/include/linux/compile.h ] ; then
    SRC_VERSION=`grep UTS_VERSION $LINUX/include/linux/compile.h |
	sed -e 's/.*"\(.*\)"/\1/'`
    SRC_D=`echo $SRC_VERSION | sed -e 's/^#[0-9]* //;s/SMP //'`
    SRC_D=`echo $SRC_D | sed -e 's/\(:[0-9][0-9]\) .* \([12][90]\)/\1 \2/'`
    if [ $MATCH = 1 -a "$SRC_D" != "$CUR_D" ] ; then
	echo "  WARNING: the source tree has a build date of $SRC_D."
	if [ `date -d "$SRC_D" +%s` -gt `date -d "$CUR_D" +%s` ] ; then
	    echo "  Did you forget to install your new kernel?"
	fi
    elif [ $MATCH = 1 ] ; then
	MATCH=2 # same release & date
    fi
fi
echo ""

if [ ! "$UCC" ] ; then UCC=cc ; fi
if [ ! "$KCC" ] ; then
    if which kgcc >/dev/null 2>&1 ; then KCC=kgcc ; else KCC="$UCC" ; fi
fi
for x in PREFIX KCC UCC LD KFLAGS UFLAGS PCDEBUG ; do
    write_str $x
done
write_bool USE_PM

ask_bool "Build 'trusting' versions of card utilities" UNSAFE_TOOLS
ask_bool "Include 32-bit (CardBus) card support" CONFIG_CARDBUS
if [ $ARCH = "i386" -a $VERSION_CODE -gt `version 2 2 0` ] ; then
    ask_bool "Include PnP BIOS resource checking" CONFIG_PNP_BIOS
else
    CONFIG_PNP_BIOS=n
    write_bool CONFIG_PNP_BIOS
fi

if [ $MATCH = 0 ] ; then
    CONF_SRC=2 # Use source tree when required to do so
elif [ $MATCH = 2 ] ; then
    CONF_SRC=3 # Use source tree when safe to do so
elif [ $MATCH = 1 -a ! -r $LINUX/.config ] ; then
    CONF_SRC=1 # Use running kernel if tree is not configured
elif [ "$PROMPT" = "y" ] ; then
    echo ""
    echo "The PCMCIA drivers need to be compiled to match the kernel they"
    echo "will be used with, or some or all of the modules may fail to load."
    echo "If you are not sure what to do, please consult the PCMCIA-HOWTO."
    echo ""
    echo "How would you like to set kernel-specific options?"
    echo "    1 - Read from the currently running kernel"
    echo "    2 - Read from the Linux source tree"

    ans=""
    while [ "$ans" != 1 -a "$ans" != 2 ] ; do
	prompt "Enter option (1-2)" "$CONF_SRC" ans
    done
    CONF_SRC=$ans
    echo ""
fi
echo "CONF_SRC=$CONF_SRC" >> $CONFIG

if [ $CONF_SRC = 1 ] ; then
    UTS_VERSION=$CUR_VERSION ; UTS_RELEASE=$CUR_RELEASE
else
    UTS_VERSION=$SRC_VERSION ; UTS_RELEASE=$SRC_RELEASE
fi

if [ ! "$MODDIR" ] ; then
    if [ -d /lib/modules/preferred ] ; then
	MODDIR=/lib/modules/preferred
    else
	MODDIR=/lib/modules/$UTS_RELEASE
    fi
else
    MODDIR=`echo $MODDIR | \
        sed -e "s/[0-9]\.[0-9]\.[0-9]*.*/$UTS_RELEASE/"`
fi

ask_str "Module install directory" MODDIR
if ! match "$MODDIR" "/lib/modules/*" ; then
    if match "$MODDIR" "[yY]" ; then
	echo "Selected directory '$MODDIR' is bogus!"
	fail
    fi
    echo "WARNING: '$MODDIR' is an unusual target.  Be careful!"
fi

echo ""

#=======================================================================

symcheck () {
    eval "CONFIG_$1=n"
    if $KSYMS | qgrep "$2" ; then eval "CONFIG_$1=y" ; fi
    if [ "$3" ] ; then
	/sbin/insmod $3 > /dev/null 2>&1
	if $KSYMS | qgrep "$2" ; then eval "CONFIG_$1=y" ; fi
    fi
}

configcheck () {
    eval "CONFIG_$1=n"
    if qgrep "^CONFIG_$1=y" $AUTOCONF ; then
	eval "CONFIG_$1=y"
    elif qgrep "^CONFIG_$1=m" $AUTOCONF ; then
	eval "CONFIG_$1=y"
    fi
}

printflag() {
    value=`eval echo '$'$2`
    /bin/echo -e "    $1 is \c"
    if [ "$value" = "y" ] ; then
	echo "enabled."
    else
	echo "disabled."
    fi
    write_bool $2
}

x86_config_tweak () {
    CONFIG_X86_L1_CACHE_BYTES=32
    write_int CONFIG_X86_L1_CACHE_BYTES
    CONFIG_X86_L1_CACHE_SHIFT=5
    write_int CONFIG_X86_L1_CACHE_SHIFT
    if [ $VERSION_CODE -ge `version 2 2 0` ] ; then
	if [ $CONFIG_SMP = "y" ] ; then
	    CONFIG_X86_LOCAL_APIC=y
	    CONFIG_X86_IO_APIC=y
	    write_bool CONFIG_X86_LOCAL_APIC
	    write_bool CONFIG_X86_IO_APIC
	fi
	if [ $CONFIG_PCI = "y" ] ; then
	    CONFIG_PCI_QUIRKS=y
	    write_bool CONFIG_PCI_QUIRKS
	fi
    fi
    if [ $VERSION_CODE -ge `version 2 4 0` ] ; then
	write_bool CONFIG_EISA
	CONFIG_X86_CMPXCHG=y
	if [ "$CONFIG_RWSEM_GENERIC_SPINLOCK" = "y" ] ; then
	    CONFIG_X86_CMPXCHG=n
	fi
	write_bool CONFIG_X86_CMPXCHG
    fi
    if [ "$BIGMEM" ] ; then
	if [ "$CONFIG_3GB" = "y" ] ; then MEMMAX=3GB
	elif [ "$CONFIG_2GB" = "y" ] ; then MEMMAX=2GB
	else MEMMAX=1GB ; fi
	echo "    Maximum physical memory: $MEMMAX"
	echo "MEMMAX=$MEMMAX" >> $CONFIG
	write_bool CONFIG_1GB
	write_bool CONFIG_2GB
	write_bool CONFIG_3GB
    fi
    printflag "PAE support" CONFIG_X86_PAE
}

alpha_config_tweak () {
    if [ $VERSION_CODE -lt `version 2 2 0` ] ; then
	CONFIG_ALPHA_LCA=y
	write_bool CONFIG_ALPHA_LCA
    else
	CONFIG_ALPHA_GENERIC=y
	write_bool CONFIG_ALPHA_GENERIC
    fi
}

ppc_config_tweak () {
    printflag "MPC8xx architecture" CONFIG_8xx
    printflag "IBM 4xx processor" CONFIG_4xx
    printflag "Embedded Planet LITE platform" CONFIG_RPXLITE
    printflag "Embedded Planet CLASSIC platfom" CONFIG_RPXCLASSIC
    printflag "MPC823 processor" CONFIG_MPC823
    printflag "MPC850 processor" CONFIG_MPC850
    printflag "MPC860 processor" CONFIG_MPC860
    printflag "MPC860T processor" CONFIG_MPC860T
    if [ $VERSION_CODE -gt `version 2 4 0` ] ; then
	CONFIG_ALL_PPC=y
	write_bool CONFIG_ALL_PPC
    fi
}

arm_config_tweak () {
    printflag "Brutus architecture" CONFIG_ARCH_BRUTUS
    printflag "Itsy target platform" CONFIG_ITSY
}

printconfig () {
    echo "Kernel configuration options:"
    if [ $VERSION_CODE -ge `version 2 3 18` ] ; then
	printflag "Kernel-tree PCMCIA support" CONFIG_PCMCIA
    fi
    printflag "Symmetric multiprocessing support" CONFIG_SMP
    if [ "$CONFIG_SMP" = "y" ] ; then
	echo "#define __SMP__ 1" >> $CONFIG_H
    fi
    printflag "Preemptive kernel support" CONFIG_PREEMPT
    printflag "High memory support" CONFIG_HIGHMEM
    if [ "$NEED_HZ" = "y" ] ; then
	echo "    Timer frequency (HZ) for the kernel is $CONFIG_HZ."
	write_int CONFIG_HZ
    fi
    printflag "PCI BIOS support" CONFIG_PCI
    printflag "Power management (APM) support" CONFIG_PM
    printflag "SCSI support" CONFIG_SCSI
    printflag "IEEE 1394 (FireWire) support" CONFIG_IEEE1394
    printflag "Networking support" CONFIG_INET
    printflag " Radio network interface support" CONFIG_NET_PCMCIA_RADIO
    printflag " Token Ring device support" CONFIG_TR
    printflag " Fast switching" CONFIG_NET_FASTROUTE
    printflag " Frame Diverter" CONFIG_NET_DIVERT
    printflag "Module version checking" CONFIG_MODVERSIONS
    printflag "Kernel debugging support" CONFIG_DEBUG_KERNEL
    if [ "$CONFIG_DEBUG_KERNEL" = "y" ] ; then
	printflag " Memory leak detection support" CONFIG_MEMLEAK
	printflag " Spinlock debugging" CONFIG_DEBUG_SPINLOCK
    fi
    printflag "Preemptive kernel patch" CONFIG_PREEMPT
    if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	printflag "PCMCIA IDE device support" CONFIG_BLK_DEV_IDE_PCMCIA
    fi
    printflag "/proc filesystem support" CONFIG_PROC_FS
    case $ARCH in
    i386)	x86_config_tweak	; ;;
    alpha)	alpha_config_tweak	; ;;
    ppc)	ppc_config_tweak	; ;;
    esac
    if [ $VERSION_CODE -ge `version 2 4 0` ] ; then
	write_bool CONFIG_RWSEM_GENERIC_SPINLOCK
	write_bool CONFIG_RWSEM_XCHGADD_ALGORITHM
    fi
}

echo "" >> $CONFIG
echo "" >> $CONFIG_MK
echo "" >> $CONFIG_H

if [ $ARCH = "i386" ] ; then
    qgrep CONFIG_1GB $LINUX/include/asm-i386/page_offset.h && BIGMEM=y
    qgrep CONFIG_HZ $LINUX/include/asm-i386/param.h && NEED_HZ=y
fi

CONFIG_PCMCIA=n

case $CONF_SRC in
    1)
	if [ -x /sbin/ksyms ] ; then
	    KSYMS="/sbin/ksyms -a"
	else
	    echo "Hmmm... /sbin/ksyms is broken.  Using /proc/ksyms..."
	    KSYMS="cat /proc/ksyms"
	fi
	echo "# Options from current kernel" >> $CONFIG
	echo "# Options from current kernel" >> $CONFIG_MK
	echo "/* Options from current kernel */" >> $CONFIG_H
	echo "CHECK=\"/proc/version\"" >> $CONFIG
	echo "CKSUM=\"`cksum < /proc/version`\"" >> $CONFIG
	echo "#define CONFIG_MODULES 1" >> $CONFIG_H
	if [ $VERSION_CODE -lt `version 2 3 37` ] ; then
	    if $KSYMS | grep CardServices | qgrep -v pcmcia ; then
		CONFIG_PCMCIA=y
	    fi
	else
	    symcheck PCMCIA dead_socket pcmcia_core
	fi
	if [ $VERSION_CODE -lt `version 2 2 0` ] ; then
	    symcheck SMP smp_invalidate_needed
	else
	    symcheck SMP smp_num_cpus
	fi
	symcheck PREEMPT preempt_schedule
	symcheck PCI pcibios
	if [ $VERSION_CODE -lt `version 2 3 43` ] ; then
	    symcheck PM apm_register_callback
	else
	    symcheck PM pm_register
	fi
	symcheck SCSI scsi_register scsi_mod
	symcheck IEEE1394 hpsb_register_lowlevel ieee1394
	symcheck SERIAL register_serial serial
	symcheck PARPORT parport_register parport
	symcheck PARPORT_PC parport_pc_ops parport_pc
	symcheck PARPORT_PC_PCMCIA parport_pc_probe_port parport_pc
	symcheck INET register_netdev
	symcheck NET_FASTROUTE dev_fastroute_stat
	symcheck NET_DIVERT divert_ioctl
	if [ -r /proc/net/wireless ] ; then
	    CONFIG_NET_PCMCIA_RADIO=y
	else
	    CONFIG_NET_PCMCIA_RADIO=n
	fi
	symcheck MODVERSIONS printk_R
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    symcheck BLK_DEV_IDE_PCMCIA ide_register
	fi
	symcheck TR tr_setup
	symcheck HIGHMEM kmap_high
	if [ "$BIGMEM" ] ; then
	    symcheck 1GB ^c01
	    symcheck 2GB ^801
	    symcheck 3GB ^401
	fi
	symcheck PROC_FS proc_root
	symcheck PREEMPT preempt_schedule
	symcheck KDB kdb_
	symcheck DEBUG_MCOUNT mcount
	symcheck MEMLEAK kmalloc_wrap
	if [ $CONFIG_KDB = "y" -o $CONFIG_DEBUG_MCOUNT = "y" -o \
	     $CONFIG_MEMLEAK = "y" ] ; then
	    CONFIG_DEBUG_KERNEL=y
	fi
	if [ $ARCH = "i386" ] ; then
	    CONFIG_X86_PAE=n
	    if qgrep pae_pgd /proc/slabinfo ; then
		CONFIG_X86_PAE=y
	    fi
	    symcheck EISA_bus EISA
	elif [ $ARCH = "ppc" ] ; then
	    symcheck _prep_type ALL_PPC
	fi
	if [ $VERSION_CODE -ge `version 2 4 0` ] ; then
	    symcheck RWSEM_GENERIC_SPINLOCK __down_read
	    symcheck RWSEM_XCHGADD_ALGORITHM rwsem_wake
	fi
	echo "#ifndef __LINUX_MODVERSIONS_H" > $MODVER
	echo "#define __LINUX_MODVERSIONS_H" >> $MODVER
	H='[0-9a-f][0-9a-f]'
	$KSYMS | sed -ne 's/.* \(.*\)_R\(.*'$H$H$H$H'\)/\1 \2/p' | \
	    awk '{ printf "#define %s\t%s_R%s\n", $1, $1, $2 }' \
	    >> $MODVER
	echo "#endif" >> $MODVER
	if [ "$NEED_HZ" = "y" ] ; then
	    echo "#include <linux/module.h>" > tmp.c
	    echo "#include <linux/sched.h>" >> tmp.c
	    echo "int init_module(void)" >> tmp.c
	    echo '{printk("<7>jif=%lu\n",jiffies);return-1;}' >> tmp.c
	    $KCC -DMODULE -D__KERNEL__ -Iinclude -I$LINUX/include -c tmp.c
	    /sbin/insmod tmp.o >/dev/null 2>&1
	    TICKS=`dmesg | sed -ne 's/^jif=//p' | tail -1`
	    CONFIG_HZ=`awk '{printf "%.0f",'$TICKS'/$1}' /proc/uptime`
	fi
	;;
    2|3)
	AUTOCONF=$LINUX/.config
	if [ ! -r $AUTOCONF ] ; then
	    echo "Config file $AUTOCONF not present!"
	    echo "    To fix, run 'make config' in $LINUX."
	    fail
	fi
	echo "# Options from $AUTOCONF" >> $CONFIG
	echo "# Options from $AUTOCONF" >> $CONFIG_MK
	echo "/* Options from $AUTOCONF */" >> $CONFIG_H
	echo "CHECK=\"$AUTOCONF\"" >> $CONFIG
	echo "CKSUM=\"`cksum < $AUTOCONF`\"" >> $CONFIG
	echo "#define CONFIG_MODULES 1" >> $CONFIG_H
	configcheck PCMCIA
	if qgrep "^ *SMP *= *1" $LINUX/Makefile ; then
	    CONFIG_SMP=y
	else
	    configcheck SMP
	fi
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    configcheck BLK_DEV_IDE_PCMCIA
	fi
	if [ $VERSION_CODE -lt `version 2 3 43` ] ; then
	    configcheck APM ; CONFIG_PM=$CONFIG_APM
	else
	    configcheck PM
	fi
	if [ $VERSION_CODE -ge `version 2 4 0` ] ; then
	    configcheck RWSEM_GENERIC_SPINLOCK
	    configcheck RWSEM_XCHGADD_ALGORITHM
	fi
	for C in PCI SCSI SERIAL INET NET_FASTROUTE NET_RADIO NET_DIVERT \
	    TR MODVERSIONS PROC_FS PARPORT PARPORT_PC PARPORT_PC_PCMCIA \
	    IEEE1394 NET_PCMCIA_RADIO KERNEL_DEBUGGING MEMLEAK PREEMPT \
	    DEBUG_KERNEL DEBUG_SPINLOCK PREEMPT HIGHMEM X86_PAE ; do
	    configcheck $C
	done
	if [ "$NEED_HZ" = "y" ] ; then
	    eval `grep "^CONFIG_HZ=" $AUTOCONF`
	fi
	if qgrep "^CONFIG_PARPORT_PC=y" $AUTOCONF ; then
	    CONFIG_PARPORT_PC=n
	fi
	if [ $CONFIG_KERNEL_DEBUGGING = "y" ] ; then
	    CONFIG_DEBUG_KERNEL=y
	fi
	if [ $CONFIG_NET_RADIO = "y" ] ; then
	    CONFIG_NET_PCMCIA_RADIO=y
	fi
	if [ $ARCH = "i386" ] ; then
	    configcheck EISA
	elif [ $ARCH = "arm" ] ; then
	    configcheck ARCH_BRUTUS
	    configcheck ITSY
	elif [ $ARCH = "ppc" ] ; then
	    for C in 8xx 4xx RPXLITE RPXCLASSIC MPC823 MPC850 MPC860 \
		MPC860T ALL_PPC ; do
		configcheck $C
	    done
	fi
	if [ "$BIGMEM" ] ; then
	    configcheck 1GB
	    configcheck 2GB
	    configcheck 3GB
	fi
	;;
esac

if [ "$FORCE" = "y" -a "$CONFIG_PCMCIA" = "y" ] ; then
    CONFIG_PCMCIA=n
fi
if [ "$USE_PM" != "y" ] ; then CONFIG_PM=n ; fi
if [ ! -r $LINUX/include/linux/wireless.h ] ; then
    CONFIG_NET_PCMCIA_RADIO=n
fi
if ! qgrep get_lynx_template $LINUX/drivers/ieee1394/pcilynx.c ; then
    CONFIG_IEEE1394=n
fi
printconfig
echo ""

#=======================================================================

if [ "$CONFIG_PCI" != "y" -a "$CONFIG_CARDBUS" = "y" ] ; then
    echo "Cardbus support requires kernel PCI bus support!"
    echo "    To fix, re-run 'make config' and disable Cardbus support."
    fail
fi

if [ $VERSION_CODE -ge `version 2 5 0` -a "$CONFIG_PCMCIA" != "y" ] ; then
    echo "2.5.0 and later kernels require that PCMCIA be configured in the"
    echo "    kernel source tree.  To fix, reconfigure and rebuild your"
    echo "    kernel with PCMCIA enabled."
    fail
fi

if [ ! -r $LINUX/include/asm ] ; then
    cd $LINUX/include ; ln -s asm-$ARCH asm 2>/dev/null
fi
if [ ! -r $LINUX/include/asm ] ; then
    echo "$LINUX/include/asm does not exist!"
    echo "    To fix, do 'ln -s asm-$ARCH asm' in $LINUX/include."
    fail
fi

AFLAGS=
CONFIG_ISA=y
CONFIG_UID16=y
if [ $ARCH = "ppc" ] ; then
    CONFIG_ISA=n
    AFLAGS="-fno-builtin -msoft-float"
    if [ $VERSION_CODE -ge `version 2 1 26` ] ; then
	AFLAGS="$AFLAGS -ffixed-r2"
    fi
elif [ $ARCH = "alpha" ] ; then
    AFLAGS="-mno-fp-regs"
    if [ $VERSION_CODE -ge `version 2 1 26` ] ; then
	AFLAGS="$AFLAGS -ffixed-8"
    fi
    CONFIG_UID16=n
fi
write_str ARCH
write_str HOST_ARCH
write_str AFLAGS
write_bool CONFIG_ISA
if [ $VERSION_CODE -ge `version 2 3 40` ] ; then
    write_bool CONFIG_UID16
fi

if [ $CONF_SRC != 1 -a "$CONFIG_MODVERSIONS" = "y" ] ; then
    MODVER="$LINUX/$MODVER"
    if [ ! -r $MODVER ] ; then
	echo "$MODVER does not exist!"
	echo "    To fix, run 'make dep' in $LINUX."
	fail
    fi
else
    # We may need at least an empty modversions.h file
    touch $MODVER
fi


echo "" >> $CONFIG
echo "" >> $CONFIG_MK
echo "" >> $CONFIG_H

#=======================================================================

if [ "$CONFIG_PCMCIA" = "y" ] ; then
    # Use our kernel config, then kernel headers, then our headers
    CPPFLAGS="-I../include/static -I\$(LINUX)/include -I../include"
else
    # Use our kernel config and headers, then kernel headers
    CPPFLAGS="-I../include -I\$(LINUX)/include"
fi
echo "CPPFLAGS=$CPPFLAGS" >> $CONFIG_MK
echo "" > tmp.c
WFLAG=-Wa,--no-warn ; $KCC $WFLAG -c tmp.c 2>/dev/null || WFLAG=
echo "WFLAG=$WFLAG" >> $CONFIG_MK

write_str UTS_RELEASE
write_str UTS_VERSION
echo "LINUX_VERSION_CODE=$VERSION_CODE" >> $CONFIG
echo "LINUX_VERSION_CODE=$VERSION_CODE" >> $CONFIG_MK
echo "#define LINUX_VERSION_CODE $VERSION_CODE" >> $CONFIG_H
echo "#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))" \
    >> $CONFIG_H
echo "" >> $CONFIG
echo "" >> $CONFIG_MK
echo "" >> $CONFIG_H

HAS_PROC_BUS=n
if [ $VERSION_CODE -ge `version 2 2 0` ] ; then
    HAS_PROC_BUS=y
fi
write_bool HAS_PROC_BUS

if [ $VERSION_CODE -ge `version 2 1 7` -o \
     "$CONFIG_BLK_DEV_IDE_PCMCIA" = "y" ] ; then
    echo "DO_IDE=y" >> $CONFIG_MK
fi

if [ $VERSION_CODE -ge `version 2 3 6` ] ; then
    CONFIG_PARPORT_PC=$CONFIG_PARPORT_PC_PCMCIA
fi
if [ $CONFIG_PARPORT_PC = "y" -a $VERSION_CODE -ge `version 2 2 0` ] ; then
    echo "DO_PARPORT=y" >> $CONFIG_MK
fi

if [ $CONFIG_NET_PCMCIA_RADIO = "y" ] ; then
    VER=`gcc -E -dM ${LINUX}/include/linux/wireless.h | \
	sed -ne 's/#define WIRELESS_EXT //p'`
    if [ $VER -ge 10 ] ; then
	echo "DO_ORINOCO=y" >> $CONFIG_MK
    fi
fi

SCSI=$LINUX/drivers/scsi
if [ "$CONFIG_SCSI" = "y" -a "$CONFIG_CARDBUS" = "y" ] ; then
    if qgrep ADAPTEC_1480A $SCSI/aic7xxx.c ; then
	echo "DO_APA1480=y" >> $CONFIG_MK
	NEW_AIC7XXX=n
    elif [ -r $SCSI/aic7xxx/aic7xxx.c ] ; then
	echo "DO_APA1480=y" >> $CONFIG_MK
	NEW_AIC7XXX=y
    elif [ "$CONFIG_PCMCIA" = "n" ] ; then
	echo "The standalone Adaptec APA1480 CardBus driver is not" \
	     "supported with"
	echo "    this kernel.  If you need it, use the kernel" \
	     "PCMCIA subsystem."
	echo ""
    fi
    write_bool NEW_AIC7XXX
    for f in aic7xxx.h aic7xxx/aic7xxx{,_linux,_osm}.h ; do
	if [ -r $SCSI/$f ] ; then AIC7XXX_H=$f ; fi
    done
    echo "#define AIC7XXX_H <../drivers/scsi/$AIC7XXX_H>" >> $CONFIG_H
fi

if ! qgrep get_lynx_template $LINUX/drivers/ieee1394/pcilynx.c \
    && [ "$CONFIG_PCMCIA" = "n" ] ; then
    echo "The standalone IEEE 1394 CardBus drivers are not" \
	 "supported with this"
    echo "    kernel.  If you need them, use the kernel" \
	 "PCMCIA subsystem."
    echo ""
fi

#=======================================================================

# Check out the module stuff

if [ ! -x /sbin/insmod -o ! -x /sbin/rmmod -o ! -x /sbin/lsmod ] ; then
    echo "Your module utilities (insmod, rmmod) are missing from /sbin!"
    echo "    To fix, you should build and install the latest set" \
         "of module tools,"
    echo "    available from FTP sites listed in the HOWTO."
    fail
fi

MOD_RELEASE=`/sbin/insmod -V 2>&1 | \
    sed -n -e 's/.*[Vv]ersion \([0-9][0-9.]*[0-9]\).*/\1/p'`
X=`echo $MOD_RELEASE | sed -e 's/\./ /g'`
MOD_CODE=`version $X`
if [ $VERSION_CODE -ge `version 2 1 85` ] ; then
    NEED=`version 2 1 85` ; T=2.1.85
elif [ $VERSION_CODE -ge `version 2 1 18` ] ; then
    NEED=`version 2 1 23` ; T=2.1.23
else
    NEED=`version 2 0 0` ; T=2.0.0
fi

if [ $NEED -gt $MOD_CODE ] ; then
    echo "Your module utilities are version $MOD_RELEASE.  That is too old"
    echo "    for this kernel!  To fix, upgrade to at least version $T."
    fail
fi

#=======================================================================

# Is the boot setup OK?

if [ "$PREFIX" = "" ] ; then
    if [ -f /etc/lilo.conf -a -f /boot/map ] ; then
	if [ /vmlinuz -nt /boot/map ] ; then
	    echo "Your boot map file is older than /vmlinuz. "\
		 "If you installed /vmlinuz"
	    echo "by hand, please run 'lilo' to update your boot"\
		 "data, and then reboot."
#	else
#	    echo "Your 'lilo' installation appears to be OK."
	fi
#   else
#	echo "It doesn't look like you are using 'lilo'."
    fi
fi

#=======================================================================

# How should the startup scripts be configured?

if [ -z "$PREFIX" -a -z "$RC_DIR" ] ; then
    if [ -d /sbin/init.d -o -d /etc/rc.d/init.d -o -d /etc/init.d ] ; then
	echo "It looks like you have a System V init file setup."
	SYSV_INIT=y
	if [ -d /sbin/init.d ] ; then
	    RC_DIR=/sbin/init.d
	elif [ -d /etc/rc.d/init.d ] ; then
	    RC_DIR=/etc/rc.d
	else
	    RC_DIR=/etc
	fi
    else
	echo "It looks like you have a BSD-ish init file setup."
	if ! qgrep rc.pcmcia /etc/rc.d/rc.S ; then
	    echo "    You'll need to edit /etc/rc.d/rc.S to invoke" \
		 "/etc/rc.d/rc.pcmcia"
	    echo "    so that PCMCIA services will start at boot time."
	fi
	SYSV_INIT=
    fi
    write_bool SYSV_INIT
    if [ "$SYSV_INIT" = "y" ] ; then write_str RC_DIR ; fi
elif [ -z "$PREFIX" ] ; then
    write_str RC_DIR
else
    ask_bool "System V init script layout" SYSV_INIT
    if [ "$SYSV_INIT" = "y" ] ; then
	ask_str "Top-level directory for RC scripts" RC_DIR
    fi
fi

#=======================================================================

# Optional stuff

HAS_FORMS=n
echo "#include <forms.h>" > tmp.c
echo "int main(void) { void *x = &fl_initialize; return 0; }" >> tmp.c
XINCS="-I/usr/X11R6/include -I/usr/X11/include -I/usr/X11R6/include/X11"
FLIBS="-L/usr/X11R6/lib -L/usr/X11/lib -lforms -lX11 -lm"
if $UCC $UFLAGS $XINCS tmp.c $FLIBS 2>/dev/null ; then
    HAS_FORMS=y
elif $UCC $UFLAGS $XINCS tmp.c $FLIBS -lXpm 2>/dev/null ; then
    FLIBS="$FLIBS -lXpm"
    HAS_FORMS=y
fi
write_bool HAS_FORMS
if [ "$HAS_FORMS" = "y" ] ; then write_str FLIBS ; fi
if [ "$HAS_FORMS" != "y" ] ; then
    echo "The Forms library is not available."
fi

HAS_XAW=n
echo "#include <X11/Xaw/XawInit.h>" > tmp.c
echo "int main() { void *x = &XawInitializeWidgetSet; return 0; }" >> tmp.c
if $UCC $UFLAGS $XINCS tmp.c -L/usr/X11R6/lib -L/usr/X11/lib \
    -lX11 -lXaw 2>/dev/null ; then
    HAS_XAW=y
else
    echo "The X11/Xaw libraries are not available."
fi
write_bool HAS_XAW

HAS_GTK=n
echo "#include <gtk/gtk.h>" > tmp.c
echo "int main(void) { void *x = &gtk_init; return 0; }" >> tmp.c
if $UCC $UFLAGS `gtk-config --cflags 2>/dev/null` tmp.c \
    `gtk-config --libs 2>/dev/null` 2>/dev/null ; then
    HAS_GTK=y
else
    echo "The GTK+ library is not available."
fi
write_bool HAS_GTK

HAS_WORDEXP=n
echo "#include <wordexp.h>" > tmp.c
$UCC $UFLAGS -c tmp.c 2>/dev/null && HAS_WORDEXP=y
write_bool HAS_WORDEXP
if [ "$HAS_WORDEXP" != "y" ] ; then
    echo ""
    echo "Your libc does not support wordexp()."
    echo "    Without wordexp(), cardmgr will not do command" \
         "substitution or"
    echo "    environment variable expansion when parsing 'source'" \
	 "commands in"
    echo "    config files.  To gain this feature, upgrade to a" \
	 "more recent"
    echo "    version of glibc."
fi
rm -f tmp.c tmp.o a.out

if [ ! -d /var/run ] ; then
    echo "WARNING: /var/run not found."
    echo "    To fix, do 'mkdir /var/run'."
fi

#=======================================================================

# Where do man pages go?

md ()
{
    L=`env LANG=en_US man -w $1 2>/dev/null | sed -ne 's+/man/.*+/man/+p'`
    if [ -d "$L" ] ; then echo $L ; else echo $2 ; fi
}

MANDIR=`md ls /usr/man`
write_str MANDIR
XMANDIR=`md xterm /usr/X11R6/man`
write_str XMANDIR

#=======================================================================

echo "" >> $CONFIG_H
echo "#endif /* _PCMCIA_CONFIG_H */" >> $CONFIG_H

mv -f $CONFIG config.out

touch .prereq.ok

echo ""
echo "Configuration successful."
echo ""

if [ "$CONFIG_PCMCIA" = "y" ] ; then
    echo "Your kernel is configured with PCMCIA driver support.  Therefore,"
    echo "'make all' will compile the PCMCIA utilities but not the drivers."
    echo ""
fi
