view configure @ 21:1c9dac05d040

Add lint-style FALLTHROUGH annotations to fallthrough cases. (in the parse engine and thus the output code) Document this, because the old output causes warnings with gcc10.
author David A. Holland
date Mon, 13 Jun 2022 00:04:38 -0400
parents 13d2b8934445
children
line wrap: on
line source

#!/bin/sh
# configure - configure script for AnaGram
# usage: path-to-source/configure [options]
# for options, do configure --help, or read down.
#
# Note: this is a hand-written script, not GNU autoconf output.
# Its primary purpose is to set up the build tree, not to perform
# tests on the build platform.
#
# Also note: changing to autoconf will not make this any easier, or
# add any useful functionality for free, so please don't bother
# suggesting it.
#
# Supported compilers and targets are listed below. Note that there is
# vestigial support in the source tree for various other Windows
# compilers (Borland, Watcom, etc.) - I don't have these, but will
# cheerfully add support if someone tells me how to invoke them and
# sends patches to clean up the template instantiations. I will also
# take patches for supporting for other Unix compilers. And if anyone
# wants to update the once-upon-a-time Amiga support, I'll even take 
# patches for that.
#
# Also, this script should not be expected to work for native builds
# on Windows. I don't have a Windows machine, Windows is a crippled
# platform, and it's too much trouble to sort out. If someone wants to
# make it work under Cygwin, however, I'll take the patches.
#

usage() {
cat 1>&2 <<EOF
Usage: PATH-TO-SOURCE/configure [options] [ostype]
Options:
    --with-compiler=COMPILER    Choose compiler (see below)
    --with-ptests=DIR           Use private testsuite in DIR
    --enable-gui=GUI            Enable a GUI (see below)
    --disable-gui               Build command-line version only
    --enable-maintainer-mode    Set maintainer-specific build options
    --enable-debug              Enable debugging information
    --enable-prof               Enable profiling
For Unix installs:
    --destdir=DIR               Set install chroot (default: none)
    --prefix=DIR                Set install prefix (default: /usr/local)
    --bindir=DIR                Install directory for binaries
    --libdir=DIR                Install directory for libraries
    --mandir=DIR                Install directory for man pages
    --docdir=DIR                Install directory for HTML docs
    --examplesdir=DIR           Install directory for examples
Compilers:
    gcc                         The GNU compiler (gcc/g++).
    vacpp                       IBM Visual Age C++ for Windows
GUIs:
    vaclgui                     The IBM Visual Age C++ for Windows GUI
    dummygui                    Equivalent to --disable-gui
OSes:
    native                      Current Unix type (default)
    windows                     Cross-compiled Windows
    *-* or *-*-*                A cross-compiled Unix type
Notes:
    1. Compiling in the source directory is not supported. Run
       configure in a subdirectory or somewhere else.
    2. Native builds on Windows are not supported.
    3. Read the install instructions before cross-compiling.
EOF
}

############################################################
#
# 1. Know thyself.
#

SRCDIR=`dirname "$0"`

if [ ! -d "$SRCDIR" -o "$SRCDIR" = "" ]; then
    # ...?
    usage
    exit 1
fi

if [ "$SRCDIR" = . ]; then
    # just warn, don't error
    echo "$0: Compiling in the source directory is not recommended" 1>&2
    #echo "Please do this:" 1>&2
    #echo "   mkdir build" 1>&2
    #echo "   cd build" 1>&2
    #echo "   ../configure $@" 1>&2
    #exit 1
fi

if [ ! -f "$SRCDIR"/anagram/agcore/pgg24.syn ]; then
    echo "$0: please run me out of the AnaGram source directory" 1>&2
    exit 1
fi

############################################################
#
# 2. options
#

DESTDIR=
PREFIX=
BINDIR=
LIBDIR=
MANDIR=
DOCDIR=
EXAMPLESDIR=
COMPILER=
PTESTS=
GUI=
PLATFORM=
MAINTAINER=0
MODE=opt

while [ "x$1" != x ]; do
    case "$1" in
	--destdir=*) DESTDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--prefix=*) PREFIX=`echo "$1" | sed 's/^[^=]*=//'`;;
	--bindir=*) BINDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--libdir=*) LIBDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--mandir=*) MANDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--docdir=*) DOCDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--examplesdir=*) EXAMPLESDIR=`echo "$1" | sed 's/^[^=]*=//'`;;
	--with-compiler=*) COMPILER=`echo "$1" | sed 's/^[^=]*=//'`;;
	--without-compiler) echo "$0: You're joking, right?" 1>&2; exit 1;;
	--with-ptests=*) PTESTS=`echo "$1" | sed 's/^[^=]*=//'`;;
	--without-ptests) PTESTS= ;;
	--enable-gui=*) GUI=`echo "$1" | sed 's/^[^=]*=//'`;;
	--disable-gui) GUI=dummygui;;
	--enable-maintainer-mode) MAINTAINER=1;;
	--disable-maintainer-mode) MAINTAINER=0;;
	--enable-debug) MODE=debug;;
	--enable-prof) MODE=prof;;
	--disable-debug|--disable-prof) MODE=opt;;
	--help) usage; exit 0;;
	--*|-*) usage; exit 1;;
	*)
	    if [ "x$PLATFORM" != x ]; then
		usage
		exit 1
	    fi
	    PLATFORM="$1"
	    ;;
    esac
shift
done

# Default platform

if [ "x$PLATFORM" = x ]; then
    PLATFORM=native
fi

# Check platform

case "$PLATFORM" in
    native) OSTYPE=unix; CROSS=0;;
    *-*-*)  OSTYPE=unix; CROSS=1; CROSSNAME="$PLATFORM";;
    *-*)    OSTYPE=unix; CROSS=1; CROSSNAME="$PLATFORM";;
    windows) OSTYPE=windows; CROSS=1; CROSSNAME=windows;;
    *) echo "$0: Invalid platform $PLATFORM" 1>&2; exit 1;;
esac

# Default compiler

if [ "x$COMPILER" = x ]; then
    if [ "$OSTYPE" = windows ]; then
	COMPILER=vacpp
    else
	COMPILER=gcc
    fi
fi

# Check compiler

case "$COMPILER" in
    gcc) ;;
    vacpp) ;;
    *) echo "$0: Unrecognized compiler $COMPILER" 1>&2; exit 1;;
esac

# Default GUI

if [ "x$GUI" = x ]; then
    if [ "$COMPILER" = vacpp ]; then
	GUI=vaclgui
    else
	GUI=dummygui
    fi
fi

# Check GUI

case "$GUI" in
    vaclgui) ;;
    dummygui) ;;
    *) echo "$0: Unrecognized GUI $GUI" 1>&2; exit 1;;
esac

# Default PREFIX

if [ "x$PREFIX" = x ]; then
    if [ $OSTYPE = unix ]; then
	if [ $CROSS = 1 ]; then
	    PREFIX="/usr/local/$CROSSNAME"
	else
	    PREFIX=/usr/local
	fi
    else
	# Windows build doesn't use this
	PREFIX=/error
    fi
fi

# Do not need to check PREFIX

# Default DESTDIR is empty - do not need to set it

# Check DESTDIR

if [ "x$DESTDIR" != x ]; then
    if [ ! -d "$DESTDIR" ]; then
	echo "$0: DESTDIR $DESTDIR does not exist" 1>&2
	exit 1
    fi
fi

# Pick default install dirs
if [ $OSTYPE = unix ]; then

    if [ "x$BINDIR" = x ]; then
	BINDIR="$PREFIX/bin"
    fi

    if [ "x$LIBDIR" = x ]; then
	LIBDIR="$PREFIX/lib"
    fi

    if [ "x$MANDIR" = x ]; then
	# probe default man directory 
	if [ -d "${DESTDIR}$PREFIX/share/man" ]; then
	    MANDIR="$PREFIX/share/man"
	else
	    MANDIR="$PREFIX/man"
	fi
    fi

    if [ "x$DOCDIR" = x ]; then
	if [ -d "${DESTDIR}$PREFIX/share/doc/html" ]; then
	    DOCDIR="$PREFIX/share/doc/html/AnaGram"
	else if [ -d "${DESTDIR}$PREFIX/doc" ]; then
	    DOCDIR="$PREFIX/doc/AnaGram"
	else
	    DOCDIR="$PREFIX/share/doc/AnaGram"
	fi;fi
    fi

    if [ "x$EXAMPLESDIR" = x ]; then
	if [ -d "${DESTDIR}$PREFIX/share/examples" ];then
	    EXAMPLESDIR="$PREFIX/share/examples/AnaGram"
	else
	    EXAMPLESDIR="$DOCDIR"
	fi
    fi

fi


# Check for (in)valid combinations

case "${COMPILER}-${GUI}-${OSTYPE}" in
    vacpp-vaclgui-windows) ;;
    vacpp-dummygui-windows) ;;
    gcc-dummygui-unix) ;;

    vacpp-*-unix) echo "$0: compiler vacpp requires Windows" 1>&2; exit 1;;
    gcc-*-windows) echo "$0: gcc not supported on Windows yet" 1>&2; exit 1;;
    *-vaclgui-*) echo "$0: GUI vaclgui requires compiler vacpp" 1>&2; exit 1;;
    *) echo "$0: invalid configuration" 1>&2; exit 1;;
esac

############################################################
#
# 3. Report what we're doing
#

echo "Configuring for $COMPILER on $OSTYPE with GUI $GUI."
case $MODE in
    opt) ;;
    debug) echo "Enabling debugging." ;;
    prof) echo "Enabling profiling." ;;
esac
if [ $MAINTAINER = 1 ]; then
    echo "Enabling maintainer mode."
fi
if [ $OSTYPE = unix ]; then
    echo "Settings:"
    echo "   DESTDIR         ${DESTDIR:-[none]}"
    echo "   PREFIX          ${PREFIX:-[none]}"
    echo "      BINDIR       ${BINDIR:-[none]}"
    echo "      LIBDIR       ${LIBDIR:-[none]}"
    echo "      MANDIR       ${MANDIR:-[none]}"
    echo "      DOCDIR       ${DOCDIR:-[none]}"
    echo "      EXAMPLESDIR  ${EXAMPLESDIR:-[none]}"
    echo "   CROSSNAME       ${CROSSNAME:-[none]}"
fi

############################################################
#
# 4. Collect settings
#

DEFS=
CFLAGS=
LDFLAGS=
LIBS=
CLEANFILES=
DISTCLEANFILES=

case $OSTYPE in
    unix)
	DEFS="$DEFS AG_ON_UNIX"
	CLEANFILES="$CLEANFILES *.o *.a *.so"
    ;;
    windows)
	DEFS="$DEFS AG_ON_WINDOWS"
	CLEANFILES="$CLEANFILES *.obj *.lib *.dll *.res"
    ;;
    amiga)
	# No way to get to this, but there was an Amiga port once, so...
	DEFS="$DEFS AG_ON_AMIGA"
	CLEANFILES="$CLEANFILES *.obj *.lib *.library"
    ;;
esac

case $GUI in
    dummygui)
	DEFS="$DEFS DUMMYGUI"
    ;;
    vaclgui)
	DEFS="$DEFS VACLGUI"
    ;;
esac

case $COMPILER in
    gcc)
	#
	# Not used:
	#   -Wmissing-prototypes  ...only valid for C, not C++.
	#   -Wshadow              ...not yet
	#
	CFLAGS="$CFLAGS -MMD -Wall -W -Wwrite-strings -fno-strict-aliasing"
	if [ $MAINTAINER = 1 ]; then
	    CFLAGS="$CFLAGS -Werror"
	fi
	LIBS="$LIBS -lstdc++ -lm"
	DISTCLEANFILES="$DISTCLEANFILES *.d"

	case $MODE in
	    opt)   CFLAGS="$CFLAGS -O2"; LDFLAGS="$LDFLAGS -s";;
	    debug) CFLAGS="$CFLAGS -g";;
	    # note: some versions of Linux can't do -O2 -pg
	    prof)  CFLAGS="$CFLAGS -O -pg";;
	esac

	for D in $DEFS; do
	    CFLAGS="$CFLAGS -D$D"
	done
    ;;
    vacpp)
	DEFS="$DEFS typename="
	if [ $MAINTAINER = 1 ]; then
	    : # vacpp doesn't seem to have a -Werror equivalent...
	fi
	CLEANFILES="$CLEANFILES *.map *.exp .*.map .*.lib .*.exp"
	DISTCLEANFILES="$DISTCLEANFILES *.dep *.u *.log"

	case $MODE in
	    opt)   CFLAGS="$CFLAGS -O";;
	    debug) CFLAGS="$CFLAGS -g";;
	    prof)  ;; # XXX how?
	esac

	for D in $DEFS; do
	    CFLAGS="$CFLAGS -D$D"
	done
    ;;
esac

if [ $CROSS = 1 ]; then
    if [ "$CROSSNAME" = windows ]; then
	CROSSRUN="wine"
    else
	CROSSRUN="${CROSSNAME}-run"
    fi
else
    CROSSRUN=
fi

############################################################
#
# 5. Write config.mk
#

(
    echo '# Automatically generated -- do not edit'
    echo DESTDIR="$DESTDIR"
    echo PREFIX="$PREFIX"
    echo BINDIR.unix="$BINDIR"
    echo LIBDIR.unix="$LIBDIR"
    echo MANDIR.unix="$MANDIR"
    echo DOCDIR.unix="$DOCDIR"
    echo EXAMPLESDIR.unix="$EXAMPLESDIR"
    echo OS="$OSTYPE"
    echo COMPILER="$COMPILER"
    echo GUI="$GUI"
    if [ $GUI = dummygui ]; then
	echo HASGUI=nogui
    else
	echo HASGUI=hasgui
    fi
    echo CROSSRUN="$CROSSRUN"
    echo

    if [ "x$PTESTS" != x ]; then
	echo HASPTESTS=hasptests
    else
	echo HASPTESTS=noptests
    fi

    if [ $MAINTAINER = 1 ]; then
	echo MAINTAINER=maintainer
    else
	echo MAINTAINER=nonmaintainer
    fi

    case $OSTYPE in
	unix)
	    echo OBJEXT=.o
	    echo LIBEXT=.o
	    echo SHLIBEXT=.so
	    echo EXEEXT=
	;;
	windows)
	    echo OBJEXT=.obj
	    echo LIBEXT=.lib
	    echo SHLIBEXT=.dll
	    echo EXEEXT=.exe
	;;
	amiga)
	    # No way to get this, but there was an Amiga port once, so...
	    echo OBJEXT=.obj
	    echo LIBEXT=.lib
	    echo SHLIBEXT=.library
	    echo EXEEXT=
	;;
    esac
    echo

    case $COMPILER in
	gcc)
	    if [ $CROSS = 1 ]; then
		echo TOOLPREFIX="${CROSSNAME}-"
	    else
		echo TOOLPREFIX=
	    fi
	    echo CC='$(TOOLPREFIX)gcc'
	    echo LDR='$(TOOLPREFIX)ld -r -o'
	    echo SHLDCC='$(TOOLPREFIX)gcc -shared'
	    echo LDCC='$(TOOLPREFIX)gcc'
	    echo CPPFILT='$(TOOLPREFIX)cppfilt'
	    echo WINDRES='$(TOOLPREFIX)windres'
	    echo

	    echo MKDEP='cat *.d > depend.mk'
	    echo CFLAGS.PROG=
	    echo CFLAGS.LIB=
	    echo CFLAGS.SHLIB=-fPIC
	;;
	vacpp)
	    echo CC='$(TOP)/ibmscripts/cc'
	    echo LDR='$(TOP)/ibmscripts/lib'
	    echo SHLDCC='$(TOP)/ibmscripts/shldcc'
	    echo LDCC='$(TOP)/ibmscripts/ldcc'
	    echo CPPFILT='$(TOP)/ibmscripts/cppfilt'
	    echo WINDRES='$(TOP)/ibmscripts/irc'
	    echo

	    T='s,\\,/,g;/^[^:]*: *[A-Z]:/d'
	    echo MKDEP="cat *.u 2>/dev/null | expand | sed '$T' > depend.mk"
	    echo CFLAGS.PROG=
	    echo CFLAGS.LIB=
	    echo CFLAGS.SHLIB=-fPIC
	;;

    esac
    echo

    case $OSTYPE in
	windows)
	    # main ag lib is shared
	    echo 'AGLIBEXT=$(SHLIBEXT)'
	    echo 'AGLIBTYPE=SHLIB'
	    echo 'HASSHLIB=hasshlib'
	;;
	unix)
	    # main ag lib is static
	    echo 'AGLIBEXT=$(LIBEXT)'
	    echo 'AGLIBTYPE=LIB'
	    echo 'HASSHLIB=noshlib'
	;;
    esac
    echo

    echo CFLAGS="$CFLAGS"
    echo LDFLAGS="$LDFLAGS"
    echo LIBS="$LIBS"
    echo

    echo CLEANFILES="$CLEANFILES"
    echo DISTCLEANFILES="$DISTCLEANFILES"
    echo

    # Per-host stuff.
    # XXX this shouldn't assume gcc.

    echo HOST_OBJEXT=.o
    echo HOST_EXEEXT=

    echo HOST_CC=gcc
    echo HOST_LDCC=gcc
    T='-MMD -Wall -W -Wwrite-strings -g'
    if [ $MAINTAINER = 1 ]; then
	T="$T -Werror"
    fi
    echo HOST_MKDEP='cat *.d > depend.mk'
    echo HOST_CFLAGS="$T"
    echo HOST_LDFLAGS=
    echo HOST_LIBS=

    echo HOST_CLEANFILES='*.o *.d'
    echo

    # Which AG to run.
    if [ $CROSS = 0 ]; then
	echo UNSAFE_AGCL='$(BUILDTOP)/anagram/run/agcl$(HOST_EXEEXT)'
    else
	echo UNSAFE_AGCL='false'
    fi
    echo 'ORDINARY_AGCL=$(TOP)/bin/agcl$(HOST_EXEEXT)'
    echo 'SAFE_AGCL=$(TOP)/bin/safe-agcl$(HOST_EXEEXT)'
    echo

    # Choice mechanism
    echo 'SAFE?=0'
    echo 'UNSAFE?=0'
    echo 'AGCL01=$(UNSAFE_AGCL)'
    echo 'AGCL00=$(ORDINARY_AGCL)'
    echo 'AGCL10=$(SAFE_AGCL)'
    echo 'AGCL=$(AGCL$(SAFE)$(UNSAFE))'
    echo 'AGCLQUAL01=UNSAFE'
    echo 'AGCLQUAL00='
    echo 'AGCLQUAL10=SAFE'
    echo 'AGCLQUAL11='      # define this just in case
    echo 'AGCLQUAL=$(AGCLQUAL$(SAFE)$(UNSAFE))'
    echo

) > config.mk.new

mv -f config.mk.new config.mk

############################################################
#
# 6. Write makefiles.
#

makemake() {
    local SRCDIRNAME CHOP D DS U

    SRCDIRNAME="$1"; shift
    CHOP="$1"; shift

    for D in "$@"; do
	if [ "$D" != . ]; then
	    D=`echo $D | sed 's,^\./,,'`
	    U=`echo $D | sed 's,[^/]*,..,g'`

	    if [ $CHOP = 1 ]; then
		DS=`echo $D | sed 's,^[^/]*,,'`
	    else
		DS=`echo $D | sed 's,^,/,'`
	    fi

	    if [ ! -d $D ]; then
		mkdir $D
	    fi
	    (
		echo '# Automatically generated -- do not edit'
		case "$SRCDIR" in
		    /*) echo TOP="$SRCDIR";;
		    *)  echo TOP="${U}/$SRCDIR";;
		esac
		if [ "x$PTESTS" != x ]; then
		    case "$PTESTS" in
			/*) echo PTESTTOP="$PTESTS";;
			*)  echo PTESTTOP="${U}/$PTESTS";;
		    esac
		fi
		echo BUILDTOP="$U"
		echo SRCDIR="${SRCDIRNAME}$DS"
		echo 'include $(BUILDTOP)/config.mk'
		echo 'include $(SRCDIR)/DEFS.mk'
	    ) > $D/Makefile
	else
	    (
		echo '# Automatically generated -- do not edit'
		echo TOP="$SRCDIR"
		echo BUILDTOP=.
		echo SRCDIR="$SRCDIRNAME"
		echo 'include $(BUILDTOP)/config.mk'
		echo 'include $(SRCDIR)/DEFS.mk'
	    ) > $D/Makefile
	fi
	touch $D/depend.mk
	touch $D/rules.mk
	echo -n "."
    done
}

echo -n "Creating makefiles..."

DIRS=`(cd "$SRCDIR" && find . -name DEFS.mk -print) | sed 's,/[^/]*$,,' | sort`
makemake '$(TOP)' 0 $DIRS

if [ "x$PTESTS" != x ]; then
    if [ ! -d ptests ]; then
	mkdir ptests
    fi
    DIRS=`(cd "$PTESTS" && find . -name DEFS.mk -print) |\
	    sed 's,/[^/]*$,,;s,^\.,ptests,' | sort`
    makemake '$(PTESTTOP)' 1 $DIRS
fi

echo

############################################################
#
# 7. Write config.status.
#

(
    echo '#!/bin/sh'
    echo '# Automatically generated -- do not edit'
    echo -n "$0"
    if [ $OSTYPE = unix ]; then
	echo -n " --destdir=$DESTDIR"
	echo -n " --prefix=$PREFIX"
	echo -n " --bindir=$BINDIR"
	echo -n " --libdir=$LIBDIR"
	echo -n " --mandir=$MANDIR"
	echo -n " --docdir=$DOCDIR"
	echo -n " --examplesdir=$EXAMPLESDIR"
    fi
    echo -n " --with-compiler=$COMPILER"
    echo -n " --enable-gui=$GUI"
    if [ $MAINTAINER = 1 ]; then
	echo -n " --enable-maintainer-mode"
    fi
    case $MODE in
	opt)   ;;
	debug) echo -n ' --enable-debug';;
	prof)  echo -n ' --enable-prof';;
    esac
    if [ "x$PTESTS" != x ]; then
	echo -n ' --with-ptests='"$PTESTS"
    fi

    echo -n ' "$@"'

    echo " $PLATFORM"

) > config.status.new
chmod a+x config.status.new
mv -f config.status.new config.status

############################################################
#
# 8. done
#

# don't do this here - with gmake it spews tons of crap, and doing
# it with >/dev/null 2>&1 isn't really a good idea.
#echo 'make rules'
#make rules || exit 1

echo 'Now do:'
echo '   make rules'
echo '   make'
echo '   make install'

exit 0