#!/bin/ksh
#
# Copyright 1994, Cray Research, Inc.
#                 
# Permission to use, copy, modify and distribute this software and
# its accompanying documentation (the "Software") is granted without
# fee, provided that the above copyright notice and this permission
# notice appear in all copies of the Software and all supporting
# documentation, and the name of Cray Research, Inc. not be used in
# advertising or publicity pertaining to distribution of the 
# Software without the prior specific, written permission of Cray
# Research, Inc.  The Software is a proprietary product of Cray
# Research, Inc., and all rights not specifically granted by this
# license shall remain in Cray Research, Inc.  No charge may be made
# for the use or distribution of the Software.  The Software may be
# distributed as a part of a different product for which a fee is
# charged, if (i) that product contains or provides substantial
# functionality that is additional to, or different from, the
# functionality of the Software, and (ii) no separate, special or
# direct charge is made for the Software.
#         
# THE SOFTWARE IS MADE AVAILABLE "AS IS", AND ALL EXPRESS AND
# IMPLIED WARRANTIES, INCLUDING THE IMPLIED WARRANTIES OF FITNESS
# FOR A PARTICULAR PURPOSE, MERCHANTABILITY, AND FREEDOM FROM
# VIOLATION OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, ARE HEREBY
# DISCLAIMED AND EXCLUDED BY CRAY RESEARCH, INC.  CRAY RESEARCH,
# INC. WILL NOT BE LIABLE IN ANY EVENT FOR ANY CONSEQUENTIAL,
# SPECIAL, INCIDENTAL, OR INDIRECT DAMAGES ARISING OUT OF OR IN
# CONNECTION WITH THE PERFORMANCE OF THE SOFTWARE OR ITS USE BY ANY
# PERSON, OR ANY FAILURE OR NEGLIGENCE ON THE PART OF CRAY RESEARCH,
# INC., EXCEPT FOR THE GROSS NEGLIGENCE OR WILLFUL MISCONDUCT OF
# CRAY RESEARCH.
# 
# This License Agreement shall be governed by, and interpreted and
# construed in accordance with, the laws of the State of Minnesota,
# without reference to its provisions on the conflicts of laws, and
# excluding the United Nations Convention of the International Sale
# of Goods.
#
#	USMID %Z%%M%	%I%	%G% %U%
#	$Id: mkmk,v 1.33 1994/09/13 19:13:44 prb Exp $
#
# This utility builds a makefile and an object directory for a given machine
# To add sources to Cvo, just add them to the SRCS line.  To add a new machine,
# add it to the ARCHS list below and then put an entry in the case statement
# farther down.  You can also change where CVO is by changing CVODIR.
#
# If you wonder why I have this, it is because not all machines have good
# versions of make, this script will leave a very simple makefile behind
# that everyone should be able to understand.
#
ARCHS="generic bsdi sunos solaris 2.70 2.80 ymp.70 ymp.80 xmp.70 xmp.80 c90.70 c90.80 irix alpha rs6000 linux devl hpux"
LEVEL=1.0

SRCS="Accelerator.cc Action.cc Application.cc Arrows.cc AssociatedData.cc
    Base.cc BasicButton.cc BasicObject.cc Blank.cc Buffer.cc Button.cc
    ButtonMenu.cc CRT.cc Chamfer.cc Chart.cc ChartGraphs.cc
    ChartHorizontal.cc ChartVertical.cc Color.cc Configure.cc
    Confirm.cc Create.cc Cursor.cc DiscoverWindow.cc Ev.cc EvSignal.cc
    Event.cc Exit.cc ExpandPage.cc Failure.cc FdSet.cc FileMatch.cc
    FilePage.cc FileProto.cc FileView.cc Font.cc Frame.cc GC.cc
    GenericList.cc Help.cc HelpDisplay.cc HelpParse.cc HoldWindow.cc
    I18N.8bit IconGroup.cc Image.cc ImageButton.cc Inform.cc Input.cc
    InputContext.cc InputOnly.cc InputRing.cc InputViewPort.cc Iwin.cc
    Label.cc LabelMatrix.cc Layout.cc LayoutWindow.cc List.cc
    MainLoop.cc Mark.cc Matrix.cc MatrixViewPort.cc Menu.cc MenuBar.cc
    MenuEntry.cc MenuLabel.cc MenuSession.cc Modal.cc MonoColors.cc
    Move.cc NullLayout.cc Object.cc OpenFile.cc OptionMenu.cc Output.cc
    Page.cc Paint.cc PaintViewPort.cc PeelOff.cc Picture.cc Pin.cc
    PinUp.cc Pixmap.cc PixmapChamfer.cc PopupLayout.cc PrintEvent.cc
    Protocols.cc Quarks.cc Radio.cc RadioBox.cc Raise.cc Register.cc
    Resource.cc RootedList.cc ScrollBar.cc SelfLayout.cc Separator.cc
    Selection.cc Shell.cc StandardLayout.cc Text.cc TextAttribute.cc
    TextBoard.cc TextLine.cc TextPage.cc TextViewPort.cc Toggle.cc
    TopLevelLayout.cc Translation.cc Tree.cc TreeViewPort.cc Vi.cc
    ViewPort.cc Window.cc WindowViewPort.cc XImage.cc RdBitF.c debug.cc
    util.cc pty.cc version.c"

USAGE="Usage: mkmk [-c] [-C cvo directory] [-S source directory] [-O object directory] [-I include_directory] [-M makefile ] [arch]"

COPY=FALSE
CVODIR=/home/vtools_dev/Cvo
PATHS=
OBJDIR=.
ODIR=.
INCDIR=
HDIRS=Cvo
MAKEFILE=

while [ $# -ge 1 -a ! "${1#-}" = "${1}" ] ; do
    case "$1" in
    -c)
	COPY=TRUE
	shift
	;;
    -C)
	if [ $# -lt 2 ]; then
	    echo "$USAGE" 1>&2
	    exit 1
    	fi
	shift
	CVODIR=$1
	shift
	;;
    -S)
	if [ $# -lt 2 ]; then
	    echo "$USAGE" 1>&2
	    exit 1
    	fi
	shift
	PATHS="$PATHS $1"
	shift
	;;
    -O)
	if [ $# -lt 2 ]; then
	    echo "$USAGE" 1>&2
	    exit 1
    	fi
	shift
	ODIR=$1
	shift
	;;
    -I)
	if [ $# -lt 2 ]; then
	    echo "$USAGE" 1>&2
	    exit 1
    	fi
	shift
	INCDIR=$1
	shift
	;;
    -M)
	if [ $# -lt 2 ]; then
	    echo "$USAGE" 1>&2
	    exit 1
    	fi
	shift
	MAKEFILE=$1
	shift
	;;
    *)
	echo "$USAGE" 1>&2
	exit 1
	;;
    esac
done

if [ "$INCDIR" = "" ] ; then
    INCDIR=$CVODIR
fi

BACKSLASH=\\
FLAGS=-I"\$(INCDIR)"
PATHS="$PATHS $CVODIR/src"
UTIL=$CVODIR/util
OBJS=
CLEANFILES=
CCFLAGS=
CFLAGS=
LIBS="-lX11 -lm"
ARCMD="ar rl"
RANLIB=ranlib
CC=CC
cc=cc

if [ $# -lt 1 ] ; then
    if [ -x "$(whence uname)" ]; then
	mach="$(uname -m)"
	case "$mach" in
    	alpha)
	    arch=alpha
	    ;;
	sun*)
	    case "$(uname -r)" in
	    4*) arch=sunos ;;
	    5*) arch=solaris ;;
	    esac
	    ;;
	i386)
	    case "$(uname -s)" in
	    BSD/386) arch=bsdi ;;
	    esac
	    ;;
	CRAY\ Y*)
	    case "$(uname -r)" in
	    7*) arch=ymp.70 ;;
	    8*) arch=ymp.80 ;;
	    6*) arch=ymp.60 ;;
	    esac
	    ;;
	CRAY\ X*)
	    case "$(uname -r)" in
	    7*) arch=xmp.70 ;;
	    8*) arch=xmp.80 ;;
	    6*) arch=xmp.60 ;;
	    esac
	    ;;
	CRAY\ C9*)
	    case "$(uname -r)" in
	    7*) arch=c90.70 ;;
	    8*) arch=c90.80 ;;
	    6*) arch=c90.60 ;;
	    esac
	    ;;
	CRAY-2*)
	    case "$(uname -r)" in
	    7*) arch=2.70 ;;
	    8*) arch=2.80 ;;
	    6*) arch=2.60 ;;
	    esac
	    ;;
	smp*)
	    case "$(uname -r)" in
	    5*) arch=solaris ;;
	    esac
	    ;;
	*)
	    case "$(uname)" in
	    AIX) arch=rs6000 ;;
	    HP-UX) arch=hpux ;;
	    esac
	esac
    fi
    if [ "$arch" = "" ] ; then
	echo "Usage: mkmk arch" 1>&2
	echo "    Available archs: $ARCHS" 1>&2
	exit 1
    fi
    echo "Building for $arch"
else
    arch=$1
fi

for i in $ARCHS ; do
    if [ $i = $arch ] ; then
	ARCH=$arch
	break
    fi
done

if [ "$ARCH" = "" ] ; then
    echo "Usage: mkmk arch ($arch is not valid)" 1>&2
    echo "    Available archs: $ARCHS" 1>&2
    exit 1
fi

#
# System V echo uses the silly \c convention at the *END* of the string,
# while BSD allows a more sensible option at the start of the string (-n).
# The function ``echon'' will use the correct echo syntax ov the machine
# this is being run on.
#
if [ "$(echo -n)" = "-n" ] ; then
    echon() {
	echo "$@" \\c
    }
else
    echon() {
	echo -n "$@"
    }
fi

make_rules=/tmp/Make.rules.$$
make_obj=/tmp/Make.objs.$$
trap "rm -f $$make_rules $$make_obj " 1 2 3

case $ARCH in
devl)
    PATHS="$HOME/random/Cvo/src $PATHS"
    FLAGS="-I$HOME/random/Cvo $FLAGS"
    ARCH=sunos

    CCFLAGS="$CCFLAGS +p"
    SRCS="$SRCS strerror.c malloc_verify.c ToolTalk.cc"
    TTFLAGS=-I/usr/share/packages/openwin_3.0/include
    ;;
bsdi)
    BACKSLASH=\\\\
    CC=g++2
    CVODIR=..
    PATHS=../src
    UTIL=../util
    ARCMD="ar Trl"
    FLAGS="$FLAGS -I/usr/X11/include"
    CCFLAGS="$CCFLAGS -O2 -DGNUPLUSPLUS"
    ;;
linux)
    CCFLAGS="$CCFLAGS -fomit-frame-pointer -O6 -I.. -DGNUPLUSPLUS"
    ;;
solaris)
    RANLIB=
    FLAGS="$FLAGS -I/usr/openwin/include"
    SRCS="$SRCS ToolTalk.cc"
    CCFLAGS="$CCFLAGS +p"
    ARCMD="ar cr"
    LIBS="-L/usr/openwin/lib -R/usr/openwin/lib $LIBS"
    HDIRS="$HDIRS X11"
    ;;
sunos)
    PATHS="$PATHS $CVODIR/SunOS"
    CCFLAGS="$CCFLAGS -O +p"
    CFLAGS="$CFLAGS -O"
    SRCS="$SRCS strerror.c malloc_verify.c memmove.c ToolTalk.cc"
    TTFLAGS=-I/usr/share/packages/openwin_3.0/include
    ;;
hpux)
    RANLIB=
    CCFLAGS="$CCFLAGS +p"
    FLAGS="$FLAGS -I/usr/include/X11R5"
    LIBS="-L/usr/lib/X11R5 $LIBS"
    ;;
irix)
    RANLIB=
    CCFLAGS="$CCFLAGS +p"
    ;;
alpha)
    CC=cxx
    CCFLAGS="$CCFLAGS -O"
    CFLAGS="$CFLAGS -O"
    ;;
*.70)
    RANLIB=
    ARCMD="bld rl"
    CCFLAGS="$CCFLAGS -O +p"
    CFLAGS="$CFLAGS -O"
    PATHS="$PATHS $CVODIR/UNICOS"
    if [ -d /7Cbld/usr/include ] ; then
	REV=/7Cbld
    elif [ -d /7C/usr/include ] ; then
	REV=/7C
    fi
    FLAGS="$FLAGS -I\$(REV)/usr/include"
    LIBS="-L\$(REV)/lib $LIBS"
    SRCS="$SRCS mbstowcs.cc mbtowc.cc wcstombs.cc wctomb.cc"
    TARG="env TARGET=cray-${ARCH%.70}"
    HDIRS="$HDIRS X11"
    ;;
*.80)
    RANLIB=
    ARCMD="bld rl"
    CCFLAGS="$CCFLAGS -O +p"
    CFLAGS="$CFLAGS -O"
    if [ -d /80bld/usr/include ] ; then
	REV=/80bld
    elif [ -d /80/usr/include ] ; then
	REV=/80
    fi
    FLAGS="$FLAGS -I\$(REV)/usr/include"
    LIBS="-L\$(REV)/lib $LIBS"
    TARG="env TARGET=cray-${ARCH%.80}"
    HDIRS="$HDIRS X11"
    ;;
rs6000)
    CC="xlC -+"
    PATHS="$PATHS $CVODIR/RS6000"
    CCFLAGS="$CCFLAGS -O -I/usr/lpp/xlC/include -I/usr/include"
    CFLAGS="$CFLAGS -O"
    FLAGS="$FLAGS -D__rs6000__"
    SRCS="$SRCS strcasecmp.c"
    ;;
esac

if [ $OBJDIR/$MAKEFILE -nt $0 ] ; then
	echo "Nothing to do!" 2>&1
	exit 0
fi

cd $OBJDIR

touch $make_obj

cnt=0
echon "OBJS=	" >> $make_obj

for s in $SRCS ; do
    dcnt=1
    for p in $PATHS ; do
	echo
	if [ -r $p/$s ] ; then
	    b=${s%.*}
    	    e=${s##*.}
	    if [ "$e" = cc ] ; then
		echo "\$(ODIR)/$b.o: \$(DIR$dcnt)/$s"
		if [ $b = ToolTalk ] ; then
		    echo "	\$(C++) -c \$(TTFLAGS) \$(CCFLAGS) \$(FLAGS) \$(DIR$dcnt)/$s"
		else
		    echo "	\$(C++) -c \$(CCFLAGS) \$(FLAGS) \$(DIR$dcnt)/$s"
		fi
	    	if [ $ODIR != "." ] ; then
		    echo "	mv $b.o \$(ODIR)/$b.o"
		fi
	    elif [ "$e" = c ] ; then
		echo "\$(ODIR)/$b.o: \$(DIR$dcnt)/$s"
		echo "	\$(CC) -c \$(CFLAGS) \$(FLAGS) \$(DIR$dcnt)/$s"
	    	if [ $ODIR != "." ] ; then
		    echo "	mv $b.o \$(ODIR)/$b.o"
		fi
	    elif [ "$e" = 8bit ] ; then
		CLEANFILES="$CLEANFILES \$(ODIR)/$b.cc"
		echo "\$(ODIR)/$b.cc: \$(ODIR)/8bit_decode \$(DIR$dcnt)/$s"
		echo "	\$(ODIR)/8bit_decode < \$(DIR$dcnt)/$s > \$(ODIR)/$b.cc"
		echo
		echo "\$(ODIR)/$b.o: \$(ODIR)/$b.cc"
		echo "	\$(C++) -c \$(CCFLAGS) \$(FLAGS) \$(ODIR)/$b.cc"
	    	if [ $ODIR != "." ] ; then
		    echo "	mv $b.o \$(ODIR)/$b.o"
		fi
	    else
		echo "Cannot build $s" >&2
		b=
	    fi
	    let cnt=$cnt+1
	    if [ $cnt -gt 3 ] ; then
		cnt=1
		(echo $BACKSLASH ; echon "	") >> $make_obj
	    fi
	    echon "\$(ODIR)/$b.o " >> $make_obj
	    break
	fi
	let dcnt=$dcnt+1
    done
done > $make_rules
echo >> $make_obj

if [ ! "$INCDIR" = "$CVODIR" ] ; then
    if [ "$COPY" = TRUE ]; then
	echo
	echon "HDRS="
	for d in $HDIRS ; do
	    for i in $CVODIR/$d/* ; do
		if [ -f $i ]; then
		    h=${i##*/}
		    echo "	\$(INCDIR)/$d/$h \\" >> $make_obj
		    echo
		    echo "\$(INCDIR)/$d/$h: $i"
		    echo "	-@rm -f \$(INCDIR)/$d/$h"
		    echo "	cp \$(CVODIR)/$d/$h \$(INCDIR)/$d/$h"
		fi
	    done >> $make_rules
	done
	echo "	."
	echo
    fi
fi >> $make_obj

(
    if [ -n "$REV" ]
    then
	echo "REV	= $REV"
    fi
    echo "LEVEL	= $LEVEL"
    echo "TARG	= $TARG"
    echo "LCC	= $cc"
    echo "LC++	= $CC"
    echo "CC	= \$(TARG) \$(LCC)"
    echo "C++	= \$(TARG) \$(LC++)"
    echo "LIBS	= $LIBS"
    echo "FLAGS	= $FLAGS"
    echo "CCFLAGS	= $CCFLAGS"
    echo "CFLAGS	= $CFLAGS"
    echo "TTFLAGS	= $TTFLAGS"

    echo "CVODIR	= $CVODIR"
    if [ "$INCDIR" = "$CVODIR" ] ; then
	echo "INCDIR	= \$(CVODIR)"
    else
	echo "INCDIR	= $INCDIR"
    fi
    echo "UTIL	= $UTIL"

    cnt=1
    for p in $PATHS ; do
	echo "DIR$cnt	= $p"
	let cnt=$cnt+1
    done
    echo "ODIR	= $ODIR"

    echo
    cat $make_obj
    rm -f $make_obj
    echo
    echo "\$(ODIR)/libCvo.a: \$(ODIR) \$(OBJS) \$(ODIR)/version.o"
    echo "	$ARCMD \$(ODIR)/libCvo.a \$(OBJS) \$(ODIR)/version.o"
    if [ ! "$RANLIB" = "" ] ; then
	echo "	$RANLIB \$(ODIR)/libCvo.a"
    fi

    if [ $ODIR != "." ] ; then
	echo
	echo "\$(ODIR):"
	echo "	mkdir \$(ODIR)"
    fi

    if [ ! "$INCDIR" = "$CVODIR" ] ; then
	echo
	if [ "$COPY" = TRUE ]; then
	    echo "includes: incdir \$(HDRS)"
	    echo
	    echo "incdir:"
	    echo "	if [ ! -d \$(INCDIR) ] ; then mkdir \$(INCDIR) ; fi"
	    for d in $HDIRS ; do
		echo "	if [ ! -d \$(INCDIR)/$d ] ; then mkdir \$(INCDIR)/$d ; fi"
	    done
	else
	    echo "includes:"
	    echo "	if [ ! -d \$(INCDIR) ] ; then mkdir \$(INCDIR) ; fi"
	    for d in $HDIRS ; do
		echo "	if [ ! -d \$(INCDIR)/$d ] ; then ln -s \$(CVODIR)/$d \$(INCDIR)/$d; fi"
	    done
	fi
    fi

    echo
    echo "clean:"
    echo "	rm -f \$(ODIR)/libCvo.a \$(ODIR)/8bit_decode$CLEANFILES \$(OBJS) \$(ODIR)/version.o \$(ODIR)/version.c"
    echo
    echo "\$(ODIR)/8bit_decode: \$(UTIL)/8bit_decode.cc"
    echo "	-\$(LC++) -o \$(ODIR)/8bit_decode \$(CCFLAGS) \$(FLAGS) \$(UTIL)/8bit_decode.cc"
    echo
    echo "\$(ODIR)/version.c:"
    echo '	date '\''+static char version[] = "USMID @(#)Cvo_version $(LEVEL)	%m/%d/%y %H:%M:%S Cvo.$(LEVEL)";'\'' > $(ODIR)/version.c'

    echo
    echo "\$(ODIR)/version.o:	\$(ODIR)/version.c"
    echo "	cc -c \$(ODIR)/version.c"
    if [ $ODIR != "." ] ; then
	echo "	mv version.o \$(ODIR)"
    fi

    echo
    echo "\$(ODIR)/confidence:	\$(ODIR)/libCvo.a \$(ODIR)/confidence.o"
    echo "	\$(C++) -o \$(ODIR)/confidence \$(ODIR)/confidence.o \$(ODIR)/libCvo.a \$(LIBS)"
    echo
    for p in $PATHS ; do
    	dcnt=1
	if [ -r $p/confidence.cc ] ; then
	    echo "\$(ODIR)/confidence.o: \$(DIR$dcnt)/confidence.cc"
	    echo "	\$(C++) -c \$(CCFLAGS) \$(FLAGS) \$(DIR$dcnt)/confidence.cc"
	    if [ $ODIR != "." ] ; then
		echo "	mv confidence.o \$(ODIR)"
	    fi
	    break;
	fi
	let dcnt=$dcnt+1
    done

    cat $make_rules
    rm -f $make_rules

) > $MAKEFILE
