#!/bin/sh
#
# Configure 1.172 2000/11/07 19:00:37
#
# 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 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
}

# 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 [ -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] [--cc=path] [--ld=path] [--debug=debug-flags]"
    echo "    [--uflags=user-flags] [--kflags=kernel-flags] [--{no}trust]"
    echo "    [--{no}cardbus] [--{no}pnp] [--{no}apm] [--current] [--srctree]"
    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 "  --cc=PATH          use another C compiler"
    echo "  --ld=PATH          use another linker"
    echo "  --debug=FLAGS      set compiler flags for debugging"
    echo "  --uflags=FLAGS     set compiler flags for user-mode tools"
    echo "  --kflags=FLAGS     set compiler flags for kernel modules"
    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 "  --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"
    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 CC "$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		;;
    --current)		CONF_SRC=1		;;
    --srctree)		CONF_SRC=2		;;
    --sysv)		SYSV_INIT=y		;;
    --bsd)		SYSV_INIT=n		;;
    --rcdir=*)		arg RC_DIR "$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 source directory" LINUX

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
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
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 ""

for x in PREFIX CC 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` -a \
     $VERSION_CODE -lt `version 2 3 37` ] ; 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
else
    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
echo ""

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

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

configcheck () {
    eval "$1=n"
    if grep "^$1=y" $AUTOCONF >/dev/null ; then
	eval "$1=y"
    elif grep "^$1=m" $AUTOCONF >/dev/null ; then
	eval "$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 () {
    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
}

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
    printflag "PCI BIOS support" CONFIG_PCI
    x86_config_tweak
    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
    if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	printflag "PCMCIA IDE device support" CONFIG_BLK_DEV_IDE_PCMCIA
    fi
    if [ $ARCH = "i386" ] ; then
	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
    fi
    if [ $ARCH = "alpha" ] ; then
	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
    fi
    if [ $ARCH = "arm" ] ; then
	printflag "Brutus architecture" CONFIG_ARCH_BRUTUS
	printflag "Itsy target platform" CONFIG_ITSY
    fi
    if [ $ARCH = "ppc" ] ; then
    	printflag "MPC8xx architecture" CONFIG_8xx
    	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
    fi
    printflag "/proc filesystem support" CONFIG_PROC_FS
    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
}

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

if [ $ARCH = "i386" ] && \
    grep -qs CONFIG_1GB $LINUX/include/asm-i386/page_offset.h ; then
    BIGMEM=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 | grep -v pcmcia > /dev/null ; then
		CONFIG_PCMCIA=y
	    fi
	else
	    symcheck CONFIG_PCMCIA CardServices pcmcia_core
	fi
	symcheck CONFIG_SMP smp_invalidate_needed
	symcheck CONFIG_PCI pcibios
	if [ $VERSION_CODE -lt `version 2 3 43` ] ; then
	    symcheck CONFIG_PM apm_register_callback
	else
	    symcheck CONFIG_PM pm_register
	fi
	symcheck CONFIG_SCSI scsi_register scsi_mod
	symcheck CONFIG_IEEE1394 hpsb_register_lowlevel ieee1394
	symcheck CONFIG_SERIAL register_serial serial
	symcheck CONFIG_PARPORT parport_register parport
	symcheck CONFIG_PARPORT_PC parport_pc_ops parport_pc
	symcheck CONFIG_PARPORT_PC_PCMCIA parport_pc_probe_port parport_pc
	symcheck CONFIG_INET register_netdev
	symcheck CONFIG_NET_FASTROUTE dev_fastroute_stat
	symcheck CONFIG_NET_DIVERT divert_ioctl
	if [ -r /proc/net/wireless ] ; then
	    CONFIG_NET_PCMCIA_RADIO=y
	else
	    CONFIG_NET_PCMCIA_RADIO=n
	fi
	symcheck CONFIG_MODVERSIONS printk_R
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    symcheck CONFIG_BLK_DEV_IDE_PCMCIA ide_register
	fi
	symcheck CONFIG_TR tr_setup
	if [ "$BIGMEM" ] ; then
	    symcheck CONFIG_1GB ^c01
	    symcheck CONFIG_2GB ^801
	    symcheck CONFIG_3GB ^401
	fi
	symcheck CONFIG_PROC_FS proc_root
	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
	;;
    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
	if [ $VERSION_CODE -lt `version 2 3 37` ] ; then
	    if grep "^CONFIG_PCMCIA=y" $AUTOCONF >/dev/null ; then
		CONFIG_PCMCIA=y
	    fi
	else
	    configcheck CONFIG_PCMCIA
	fi
	if grep "^ *SMP *= *1" $LINUX/Makefile >/dev/null ; then
	    CONFIG_SMP=y
	else
	    configcheck CONFIG_SMP
	fi
	if [ $VERSION_CODE -lt `version 2 1 7` ] ; then
	    configcheck CONFIG_BLK_DEV_IDE_PCMCIA
	fi
	if [ $VERSION_CODE -lt `version 2 3 43` ] ; then
	    configcheck CONFIG_APM ; CONFIG_PM=$CONFIG_APM
	else
	    configcheck CONFIG_PM
	fi
	for C in CONFIG_PCI CONFIG_SCSI CONFIG_SERIAL CONFIG_INET \
	    CONFIG_NET_FASTROUTE CONFIG_NET_RADIO CONFIG_NET_DIVERT \
	    CONFIG_TR CONFIG_MODVERSIONS CONFIG_PROC_FS CONFIG_PARPORT \
	    CONFIG_PARPORT_PC CONFIG_PARPORT_PC_PCMCIA \
	    CONFIG_NET_PCMCIA_RADIO CONFIG_IEEE1394 ; do
	    configcheck $C
	done
	if [ $CONFIG_NET_RADIO = "y" ] ; then
	    CONFIG_NET_PCMCIA_RADIO=y
	fi
	if [ $ARCH = "arm" ] ; then
	    configcheck CONFIG_ARCH_BRUTUS
	    configcheck CONFIG_ITSY
	fi
	if [ $ARCH = "ppc" ] ; then
	    configcheck CONFIG_8xx
	    configcheck CONFIG_RPXLITE
	    configcheck CONFIG_RPXCLASSIC
	    configcheck CONFIG_MPC823
	    configcheck CONFIG_MPC850
	    configcheck CONFIG_MPC860
	    configcheck CONFIG_MPC860T
	fi
	if [ "$BIGMEM" ] ; then
	    configcheck CONFIG_1GB
	    configcheck CONFIG_2GB
	    configcheck CONFIG_3GB
	fi
	;;
esac

if [ "$USE_PM" != "y" ] ; then CONFIG_PM=n ; fi
if [ ! -r ${LINUX}/include/linux/wireless.h ] ; then
    CONFIG_NET_PCMCIA_RADIO=n
fi
printconfig
echo ""

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

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

#if [ $VERSION_CODE -ge `version 2 3 37` -a "$CONFIG_PCMCIA" != "y" ] ; then
#    echo "2.3.37 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
    MODVER="../$MODVER"
fi

if [ "$CONFIG_SMP" = "y" ] ; then
    echo "#define __SMP__ 1" >> $CONFIG_H
fi

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

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

HAS_PROC_BUS=n
if [ "$CONFIG_MODVERSIONS" = "y" ] ; then
    echo "MFLAG=-DMODVERSIONS -include $MODVER" >> $CONFIG_MK
else
    echo "MFLAG=" >> $CONFIG_MK
fi
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

if [ $VERSION_CODE -ge `version 2 1 31` -a \
     $VERSION_CODE -le `version 2 1 34` ] ; then
    echo "Kernel versions 2.1.31-33 are broken.  Upgrade to 2.1.34."
    fail
fi
if [ $VERSION_CODE -ge `version 2 1 90` -a \
     $VERSION_CODE -le `version 2 1 102` ] ; then
    echo "Kernel versions 2.1.90-2.1.102 are broken.  Upgrade to 2.2."
    fail
fi
if [ "$CONFIG_CARDBUS" = "y" -a \
     $VERSION_CODE -ge `version 2 1 90` ] ; then
    if [ $VERSION_CODE -lt `version 2 1 125` -o \
	 $VERSION_CODE -ge `version 2 1 132` ] ; then
	DO_APA1480=y
    fi
fi
if [ $VERSION_CODE -gt `version 2 1 104` ] ; then
    HAS_PROC_BUS=$CONFIG_PROC_FS
fi

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

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

SCSI=$LINUX/drivers/scsi
if [ "$CONFIG_SCSI" = "y" ] ; then
    if [ "$DO_APA1480" = "y" ] ; then
	echo "DO_APA1480=y" >> $CONFIG_MK
	if grep ADAPTEC_1480A $SCSI/aic7xxx.c >/dev/null ; then
	    echo "# FIX_AIC7XXX is not defined" >> $CONFIG_MK
	else
	    echo "FIX_AIC7XXX=y" >> $CONFIG_MK
	fi
    fi
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 [ "$PREFIX" = "" ] ; 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 ! grep rc.pcmcia /etc/rc.d/rc.S >/dev/null ; 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
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

echo ""

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

# Optional stuff

HAS_FORMS=n
if [ -r /usr/include/X11/Xlib.h -o \
     -r /usr/X11R6/include/X11/Xlib.h ] ; then
    echo "X Windows include files found."
    for f in /usr/{X11/,X11R6/,local/,}lib/libforms.{so,a} ; do
	if [ -r $f ] ; then break ; fi
    done
    for g in /usr/{X11/,X11R6/,local/,}include/{,X11/}forms.h ; do
	if [ -r $g ] ; then break ; fi
    done
    if [ -r $f -a -r $g ] ; then
	echo "$f and $g found."
	HAS_FORMS=y
	FLIBS="-L/usr/X11R6/lib -L/usr/X11/lib -lforms -lX11"
	if nm $f | grep 'U Xpm' >/dev/null ; then
	    FLIBS="$FLIBS -lXpm"
	fi
    else
	echo "Forms library not installed."
    fi
else
    echo "X Windows include files not installed."
fi

if [ "$HAS_FORMS" != "y" ] ; then
    echo "    If you wish to build the 'cardinfo' control panel, you" \
	 "need the Forms"
    echo "    library and the X Windows include files.  See the HOWTO" \
	 "for details."
    HAS_FORMS=n
fi
write_bool HAS_FORMS
if [ "$HAS_FORMS" = "y" ] ; then write_str FLIBS ; fi

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

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

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

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

mv $CONFIG config.out

touch .prereq.ok

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