Date: Fri, 07 Feb 2003 18:17:04 +1300 From: Andrew Turner <zombie@i4free.co.nz> To: arch@freebsd.org Subject: Kernel Dependency finding tool Message-ID: <3E434150.4070601@i4free.co.nz>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Hello,
I've beed working on the attached tool to find options/drivers that
depend on other options/drivers.
It currently removes one option at a time from LINT and tryes to build
the kernel sending the output to logs.
I have only tested this script on my one FreeBSD box and would like some
comments and suggestions to improve the script.
Andrew Turner
[-- Attachment #2 --]
#!/bin/sh
# used to find the way home
WD=`pwd`/work
if [ ! -d ${WD} ]
then
mkdir -p ${WD}
fi
# I_ are the initial settings
I_BASE=""
I_SRCDIR="/usr/src"
I_SYSDIR="/sys"
I_ARCH=`uname -m`
I_LOGDIR=/var/log/bdeps
BASE=""
SRCDIR=""
SUSDIR=""
ARCH=""
CONFDIR=""
SRCBASE=""
LOGDIR=""
BUILDSTART=1
BUILDEND=0
LINES=""
usage () {
NAME=`basename $0`
echo "Usage:"
echo "${NAME} [OPTIONS]"
echo
echo "where [OPTIONS] are one or more of:"
echo
echo "--prefix=<src-prefix>"
echo " Appends src-prefix to start of src-dir"
echo "--srcdir=<src-dir>"
echo " The main source directory DEFAULT: ${I_SRCDIR}"
echo "--arch=<arch>"
echo " Cross build for arch (untested) DEFAULT: ${I_ARCH}"
echo "--logdir=<log-dir>"
echo " Log to log-dir DEFAULT: ${I_LOGDIR}"
echo "--start=<start-cfg>"
echo " Start building on config start-cfg"
echo " Intended to be used in a cluster"
echo "--end=<end-cfg>"
echo " End building on config end-cfg"
echo "--only-build=<build-cfg>"
echo " Only build config numbered build-cfg"
echo "--clean"
echo " Clean the temp files and exit"
echo "--clean-logs"
echo " Clean the logs and exit"
}
check_opts () {
while test "X$1" != "X"
do
optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
case "$1" in
--prefix=*)
echo "Using $optarg as src base"
BASE=$optarg
shift
;;
--arch=*)
echo "Building for $optarg"
ARCH=$optarg
shift
;;
--srcdir=*)
echo "Using $optarg as Source dir"
SRCDIR=$optarg
shift
;;
--logdir=*)
echo "Logging to $optarg"
LOGDIR=$optarg
shift
;;
--start=*)
echo "Starting the build with config $optarg"
BUILDSTART=$optarg
shift
;;
--end=*)
echo "Ending the build with config $optarg"
BUILDEND=$optarg
shift
;;
--only-build=*)
echo "Only building config $optarg"
BUILDSTART=$optarg
BUILDEND=$optarg
shift
;;
--clean)
CLEAN=1
shift
;;
--clean-logs)
CLEANLOG=1
shift
;;
*)
usage
exit
;;
esac
done
# set the final values to the Initial if are unset
if test "X$BASE" = "X"
then
BASE=${I_BASE}
fi
if test "X$ARCH" = "X"
then
ARCH=${I_ARCH}
fi
if test "X$SRCDIR" = "X"
then
SRCDIR=${I_SRCDIR}
fi
if test "X${SYSDIR}" = "X"
then
SYSDIR=${I_SYSDIR}
fi
if test "X${LOGDIR}" = "X"
then
LOGDIR=${I_LOGDIR}
fi
CONFDIR=${BASEDIR}${SRCDIR}${SYSDIR}/${ARCH}/conf
SRCBASE=${BASEDIR}${SRCDIR}
EXIT=0
if test "X${CLEAN}" != "X"
then
do_clean
# Clean the Workdir
# rm -fr ${WD}
# rm -f ${CONFDIR}/CONFIG.*
EXIT=1
fi
if test "X${CLEANLOG}" != "X"
then
rm ${LOGDIR}/*
EXIT=1
fi
if [ ${EXIT} -ne 0 ]
then
exit 1
fi
}
# Clean the workdir and config files
do_clean () {
rm -fr ${WD}
rm -f ${CONFDIR}/CONFIG.*
}
# Remove all temp files on kill
on_trap () {
do_clean
exit 1
}
# Load exit traps on HUP, INT, QUIT and TERM
load_traps () {
trap on_trap 1 2 3 15
}
# Build the LINT config
make_lint () {
echo "Building the LINT config from NOTES"
cd ${CONFDIR}
make LINT > /dev/null
cd ${WD}
}
# Copy the LINT config file
copy_lint () {
echo "Copying LINT file"
cp ${CONFDIR}/LINT ${WD}
}
# Splitd lint into 2 files:
# 1) the parts that are needed in all config files
# 2) the parts that are changed in each config file
split_lint () {
echo "Splitting LINT file"
# rm -f ${WD}/LINT.all
ALL_OPTS="ident machine profile cpu maxusers makeoptions"
SOME_OPTS="device options"
rm -f ${WD}/LINT.*
for opt in $ALL_OPTS
do
awk "{ if ( \$1 == \"$opt\" ) { print \$0 } }" < LINT >> LINT.all
done
for opt in $SOME_OPTS
do
awk "{ if ( \$1 == \"$opt\" ) { print \$0 } }" < LINT >> LINT.some
done
}
# Create the n config files
build_configs () {
if [ -d ${WD}/configure ]
then
rm -f ${WD}/configure/CONFIG.*
else
mkdir ${WD}/configure
fi
LINES=`cat LINT.some | wc -l | xargs echo`
echo "Creating ${LINES} config files"
n=0
while [ $n -lt $LINES ]
do
n=`expr $n + 1`
cp ${WD}/LINT.all ${WD}/configure/CONFIG.$n
awk "BEGIN { LINE=0 } { LINE++ ; if ( LINE != $n ) { print \$0 } }" < LINT.some >> configure/CONFIG.$n
done
}
copy_configs () {
echo "Copying config files to build"
cp ${WD}/configure/CONFIG.* ${CONFDIR}
}
build_kernels () {
echo "Building ${LINES} configs"
n=`expr $BUILDSTART - 1`
if [ $BUILDEND -eq 0 ]
then
BUILDEND=$LINES
elif [ $BUILDEND -gt $LINES ]
then
BUILDEND=$LINES
fi
cd ${SRCBASE}
while [ $n -lt $BUILDEND ]
do
n=`expr $n + 1`
echo "Building config $n starts at `date`"
date > ${LOGDIR}/buildkernel.$n
make buildkernel KERNCONF=CONFIG.$n >> ${LOGDIR}/buildkernel.$n 2>&1
if [ $? -ne 0 ]
then
#touch ${LOGDIR}/fail.$n
head -n $n ${WD}/LINT.some | tail -n 1 > ${LOGDIR}/fail.$n
else
head -n $n ${WD}/LINT.some | tail -n 1 > ${LOGDIR}/pass.$n
fi
date >> ${LOGDIR}/buildkernel.$n
done
cd ${WD}
}
load_traps
check_opts $*
make_lint
copy_lint
split_lint
build_configs
copy_configs
build_kernels
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3E434150.4070601>
