#!/bin/sh # # configure script for the ColdX driver # # this does not currently test too much, will expand upon it over time # as we learn what we must check for. Chunks of this have been stripped # from such exemplary sources as the perl distribution, emacs configure # and that which is produced with autoconf. I didn't use autoconf # because it is much more fun to just write your own. # # -Brandon Gillespie trap "rm -f test.c a.out core $me.tmp; exit" 0 2 3 # because I'm a sucker for formatting. t=" " i="- " ########################################################################### # parse options BASE=${CONFIG_DIR} if [ -z "$BASE" -o -d "$BASE" ]; then BASE=`pwd` fi ETC=${BASE}/etc BIN=${BASE}/bin DOC=${BASE}/doc LOG=${BASE}/log TEST=${BASE}/test SRC=${BASE}/src WORLD=${BASE}/world me=`basename $0` conf="${BASE}/etc/${me}.prev" fail="" quick="" prev="" no_prev="" MAKEFILE="yes" SETVER="" VERSION=`cat ${ETC}/version` NAME="ColdX-${VERSION}" while [ ! -z "$1" ]; do if [ `echo $1 | cut -c1` != "-" ]; then break fi case $1 in "-p") no_prev="yes" ;; "-q") quick="yes" ;; "-m") MAKEFILE="" ;; "-v") SETVER="yes" ;; "-h") echo "-- ${NAME} -- ${t}'$me [options] [relative makefile directory]' Options: ${t}-p${t}-- ignore any existing preferences file ${t}-q${t}-- be quick (do not say much, skip the non important questions) ${t}-a${t}-- do not generate a makefile ${t}-h${t}-- this usage/help description For instance, \"$me -m -p\" will create a new preferences file, but will not generate a makefile. " exit esac shift done ########################################################################### # Defaults LIBS='-lm' YACC='yacc' CC='' # default OPT flags are defined where it figures CC OPT='' CFLAGS='' INCLUDEDIRS='' ########################################################################### echo "-- ${NAME} -- ${t}Configure script for the ColdX driver. ${t}Use '$me -h' for help " (echo "hi there\c" ; echo " ") > $me.tmp if `grep c $me.tmp >/dev/null 2>&1`; then n='-n' supress=$n c='' else n='' supress="\\\c" c='\c' fi if [ -z "$quick" ]; then echo "${i}Supressing newlines with $supress..." echo '' echo $n "${i}The asterisk should be here => $c" echo '*' echo '' fi rm -f $me.tmp ########################################################################### # Change the version number if [ ! -z "$SETVER" ]; then echo "Old version was: ${VERSION}" echo echo $n "Enter new version: $c" read NEWVER while [ -z "$NEWVER" ]; do echo "Invalid version, try again." echo $n "Enter new version: $c" read NEWVER done OLDVER=$VERSION VERSION=$NEWVER echo ${VERSION} > ${ETC}/version echo echo "${i}New version set." echo echo "${i}Adjusting directory heirarchy..." NEWDIR=`dirname ${BASE}`/ColdX-${VERSION} echo "${i}${BASE}" echo "${i} => ${NEWDIR}" mv ${BASE} ${NEWDIR} echo # exit because all the paths will be wrong now configure -p exit fi ########################################################################### # check previous config ? # does the prev config file exist if [ -f $conf ]; then prev="yes" fi if [ "$prev" = "yes" -a -z "$no_prev" ]; then if [ -z "$quick" ]; then echo "${i}Reading previous configuration..." fi else ########################################################################### # figure out the OS SYS=`(/bin/uname || /usr/bin/uname) 2>/dev/null` SYSTYPE="SYSV" # this isn't the best way to do this, we should really be checking for # most of the following piece by piece, I need to find out exactly what # /bin/uname returns in: # # SGI Irix # NextStep case $SYS in SunOS) # check for Solaris the hard way if [ "`/bin/uname -rs | cut -c0-9`" != "SunOS 4.1" ]; then SYS="Solaris" LIBS="-lsocket -lnsl -lelf ${LIBS}" else echo "${t}You should read the file 'docs/README.src' (find the secion on ${t}SunOS 1.4.x). There are some changes required to the source, ${t}for this operating system." SYSTYPE="BSD" fi ;; HP-UX) LIBS="-ldbm ${LIBS}" CFLAGS="-Aa ${CFLAGS}" ;; AIX) LIBS="-lbsd ${LIBS}" ;; Linux) LIBS="-ldbm ${LIBS}" ;; ULTRIX) SYSTYPE="BSD" ;; IRIX) LIBS="-lsun ${LIBS}" CFLAGS="-mips2 ${CFLAGS}" ;; *) fail="yes" if [ -r /unix ]; then SYS2=`(strings /unix || strings /vmunix) | grep -i unixware` if [ -n $SYS2 ]; then fail="" SYS="Unixware" LIBS="-lnsl -lsocket -lresolv ${LIBS}" fi fi ;; esac CFLAGS="-D${SYS} -D${SYSTYPE} ${CFLAGS}" if [ ! -z "$fail" ]; then echo "${t}Note: your operating system (${SYS}) is not one of the ${t}few we check for. This is not neccessarily bad, but it may mean ${t}that a few compiler flags are set incorrectly." else echo "${i}Looks like you are running ${SYS}" fi ############################################################################ # compiler echo "" echo $n "${i}Checking for cc or gcc...$c" cat > test.c <<EOF int main() { exit(0); } EOF err=`eval "(gcc test.c >/dev/null) 2>&1"` rm -f test.c a.out if [ X"$err" != X ]; then echo $n "using cc" OPT='-O' CC=cc else echo $n "using gcc" OPT='-O2' CC=gcc fi ########################################################################### # vfork() echo '' echo $n "${i}Checking for vfork()...$c" cat > test.c <<EOF /* extern pid_t vfork(void); */ main () { vfork(); } EOF err=`eval "($CC test.c >/dev/null) 2>&1"` if [ ! -z "$err" ]; then USE_VFORK="" echo "not found." else USE_VFORK="yes" echo "found." fi rm -f test.c a.out ########################################################################### echo '' echo $n "Which optimization/debug state to use? (default: ${OPT}) $c" read ANS if [ X$ANS != X ]; then OPT=$ANS fi ########################################################################### echo $n "\nList any system specific include directories you would like searched (use the -I/path syntax): $c" read ANSWER INCLUDEDIRS=$ANSWER ########################################################################### echo '' echo $n "Which Compiler Compiler to use? (default: ${YACC}) $c" read ANS if [ X$ANS != X ]; then YACC=$ANS fi ########################################################################### CHECK_LOAD="" USE_GETRUSAGE="" if [ -z "$quick" ]; then echo $n " ${t}The remaining questions relate to non-system specific configuration ${t}values in the server (such as using FLOATS or not). Skipping this ${t}section will simply use the defaults, which currently are: ${t}${t}CHECK_LOAD=no ${t}${t}USE_GETRUSAGE=no Do you wish to skip this section? (default: no): $c" read ANS if [ -z "$ANS" -o \( "$ANS" = "no" \) -o \( "$ANS" = "n" \) ]; then echo $n " ${t}System load is reported by executing the command \"uptime\" ${t}and parsing the returned string. This can cause blocked pipes and ${t}freeze the driver (if the filesystem is slow in responding). If ${t}load checking is off, the routine \"load()\" will return an ${t}empty list. Do you want to check system load? (default: no): $c" read ANS if [ ! -z "$ANS" -a \( "$ANS" = "yes" \) -o \( "$ANS" = "y" \) ]; then CHECK_LOAD="yes" fi echo $n " ${t}The function \"getrusage()\" is used by the routine \"status()\". ${t}Since the values returned by this function vary from architecture ${t}to architecture, be warned that it may cause problems on yours. ${t}If you do not use it, \"status()\" will return an emtpy list. Do you wish to use \"getrusage() in \"status()\"? (default: no): $c" read ANS if [ ! -z "$ANS" -a \( "$ANS" = "y" \) -o \( "$ANS" = "yes" \) ]; then USE_GETRUSAGE="yes" fi fi fi ########################################################################### echo echo $n "${i}Building defaults file...$c" echo "Makefile1=\$1" > $conf echo "Makefile2=\$2" >> $conf echo "config=\$3" >> $conf echo "chead=\$\$.chead" >> $conf echo "shead=\$\$.shead" >> $conf echo "tmp=\$\$.tmp" >> $conf echo "trap \"rm -f \$tmp \$chead \$shead; exit\" 0 2 3" >> $conf # build the two file headers (C and sh headers) echo "echo \"/* This file generated by \\\"$me\\\" on \`date\`. */\" > \$chead" >> $conf echo "echo \"/* Make changes to the config.h.in file and run the configure script. */\" >> \$chead" >> $conf echo "echo '' >> \$chead" >> $conf echo "echo \"# This file generated by \\\"$me\\\" on \`date\`.\" > \$shead" >> $conf echo "echo \"# Make changes to the Makefile.in file and run the configure script.\" >> \$shead" >> $conf echo "echo '' >> \$shead" >> $conf sline="s:^#@@LIBS@:LIBS=${LIBS}:g" sline="${sline};s:^#@@CC@:CC=${CC}:g" sline="${sline};s:^#@@VERSION@:VERSION=${VERSION}:g" sline="${sline};s:^#@@YACC@:YACC=${YACC}:g" sline="${sline};s:^#@@CFLAGS@:CFLAGS=${CFLAGS} ${OPT}:g" sline="${sline};s:^#@@INCLUDEDIRS@:INCLUDEDIRS=${INCLUDEDIRS}:g" sline="${sline};s:^#@@BINDIR@:BINDIR=${BIN}:g" sline="${sline};s:^#@@BASEDIR@:BASEDIR=${BASE}:g" sline="${sline};s:^#@@TESTDIR@:TESTDIR=${TEST}:g" sline="${sline};s:^#@@ETCDIR@:ETCDIR=${ETC}:g" sline="${sline};s:^#@@SRCDIR@:SRCDIR=${SRC}:g" echo "chmod u+w \$Makefile1 \$Makefile2" >> $conf echo "sed '${sline}' \${Makefile1}.in > \$tmp" >> $conf echo "cat \$shead \$tmp > \$Makefile1" >> $conf echo "sed '${sline}' \${Makefile2}.in > \$tmp" >> $conf echo "cat \$shead \$tmp > \$Makefile2" >> $conf echo "chmod a-w \$Makefile1 \$Makefile2" >> $conf # this gets ugly, please remove women and children from the room at this time MAJORV=`echo ${VERSION} | cut -d'.' -f1` MINORV=`echo ${VERSION} | cut -d'.' -f2 | cut -d'-' -f1` PATCHV=`echo ${VERSION} | cut -d'-' -f2` sline="s:^/\* @@VERSION_MAJOR@@ \*/.*:#define VERSION_MAJOR ${MAJORV}:g" sline="${sline};s:^/\* @@VERSION_MINOR@@ \*/.*:#define VERSION_MINOR ${MINORV}:g" sline="${sline};s:^/\* @@VERSION_PATCH@@ \*/.*:#define VERSION_PATCH ${PATCHV}:g" if [ ! -z "$USE_VFORK" ]; then sline="${sline};s:^/\* @@USE_VFORK@@ \*/.*:#define USE_VFORK:g" fi if [ ! -z "$CHECK_LOAD" ]; then sline="${sline};s:^/\* @@CHECK_LOAD@@ \*/.*:#define CHECK_LOAD:g" fi if [ ! -z "$USE_GETRUSAGE" ]; then sline="${sline};s:^/\* @@USE_GETRUSAGE@@ \*/.*:#define USE_GETRUSAGE:g" fi echo "chmod u+w \$config" >> $conf echo "sed '${sline}' \${config}.in > \$tmp" >> $conf echo "cat \$chead \$tmp > \$config" >> $conf echo "chmod a-w \$config" >> $conf echo "rm -f \$chead \$shead \$tmp" >> $conf echo "Done." # # This 'fi' is from the first if (checking previous config) # fi ########################################################################### if [ ! -z "$MAKEFILE" ]; then Makefile1=${BASE}/Makefile Makefile2=${SRC}/Makefile config=${SRC}/config.h echo $n "${i}Building Makefiles and config.h...$c" sh $conf $Makefile1 $Makefile2 $config echo "Done." echo $n "${i}Building dependancies...$c" cd ${SRC} make depend >/dev/null 2>&1 echo "Done." cd ${BASE} # make depend creates a Makefile.bak which we can hose rm -f ${Makefile1}.bak ${Makefile2}.bak fi