#! /bin/sh
#
# Copyright (C) 2000 by USC/ISI
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted
# provided that the above copyright notice and this paragraph are
# duplicated in all such forms and that any documentation, advertising
# materials, and other materials related to such distribution and use
# acknowledge that the software was developed by the University of
# Southern California, Information Sciences Institute.  The name of the
# University may not be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
# $Header: /nfs/jade/vint/CVSROOT/ns-2/allinone/install,v 1.22 2002/04/22 17:49:34 buchheim Exp $

die() {
	echo "$@"  1>&2
	test ! -z "$blame" && echo "$blame" 1>&2
	exit 1
}

warn() {
	echo "$@"
}

# Package VERSIONs. Change these when releasing new packages
TCLVER=8.3.2
TKVER=8.3.2
OTCLVER=1.0a8
TCLCLVER=1.0b13
NSVER=2.26
NAMVER=1.9
XGRAPHVER=12.1
ZLIBVER=1.1.4

# Get current path
CUR_PATH=`pwd`

# Check if we are using Cygwin, and if so, if it is a bona fide install
# Cygwin patches contributed by Nicolas Christin <nicolas@cs.virginia.edu>

echo "============================================================"
echo "* Testing for Cygwin environment"
echo "============================================================"

if [ -x /usr/bin/uname ]; then
        # it may be a Cygwin install
        test_cygwin=`uname | tr [a-z] [A-Z] | sed -e 's|.*CYGWIN.*|true|'`;
        if  [ "${test_cygwin}" = "true" ]; then
                echo "Cygwin detected";
                echo "Note: Cygwin install is still considered EXPERIMENTAL";
                echo "";
                echo -n "Checking Cygwin version is >=1.3.12... "
                cmaj=` uname -r | sed -e 's/^\([0-9]*\)\.\([0-9]*\).\([0-9]*\).*/\1/'`;
                echo $cmaj | grep -v [0-9] >/dev/null 2>&1
                if [ "$?" -eq "0" ]; then
                        cmaj=0;
                fi;
                cmin=` uname -r | sed -e 's/^\([0-9]*\)\.\([0-9]*\).\([0-9]*\).*/\2/'`;
                echo $cmin | grep -v [0-9] >/dev/null 2>&1
                if [ "$?" -eq "0" ]; then
                        cmin=0;
                fi;
                cpat=` uname -r | sed -e 's/^\([0-9]*\)\.\([0-9]*\).\([0-9]*\).*/\3/'`;
                echo $cpat | grep -v [0-9] >/dev/null 2>&1
                if [ "$?" -eq "0" ]; then
                        cpat=0;
                fi;
                echo -n "$cmaj.$cmin.$cpat ";
                if ([ "$cmaj" -gt "1" ]) || ([ "$cmaj" -eq "1" ] && [ $cmin -gt "3" ]) || ([ "$cmaj" -eq 1 ] && [ $cmin -eq "3" ] && [ "$cpat" -ge "12" ]); then
                        echo "should be ok";
                else
                        echo "*** POSSIBLE PROBLEM ***";
                        echo "";
                        echo "ns-allinone-${NSVER} has not been tested under versions of Cygwin older than";
                        echo "1.3.12. Your version ($cmaj.$cmin.$cpat) appears to be older than that. Success of";
                        echo "the install process is therefore NOT GUARANTEED.";
                        echo "";
                        cygversion="failed";                
		fi;
                echo -n "Checking filesystems are mounted as UNIX filetype... ";
                mount | grep "textmode" >/dev/null 2>&1;
                if [ "$?" -eq "0" ]; then
                        echo "*** NO! ***";
                        mount_test="failed";
                        echo "";
                        echo "It appears that some of your Cygwin shares are mounted as DOS file";
                        echo "type. This has not been tested, but is likely to result in failure of";
                        echo "validation tests. Success of the install process is also NOT";
                        echo "GUARANTEED.";
                        echo "";
                        echo "Refer to the Cygwin user guide for how to install Cygwin with the UNIX";
                        echo "file text mode.";
                        echo "";
                else
                        echo "yes";
                        echo -n "Checking default mode is binmode... ";
                        echo ${CYGWIN} | grep "nobinmode" >/dev/null 2>&1;
                        if [ "$?" -eq "0" ]; then
                                cyg_env_var="failed";
                                echo "*** NO! ***";
                                echo "";
                                echo "Your \$CYGWIN environment variable specifies \"nobinmode\". This is";
                                echo "likely to result in failure of validation tests, and (possibly) of";
                                echo "the whole install process. You need to have the \$CYGWIN environment";
                                echo "variable set to \"binmode\". Please refer to the Cygwin user guide for";
                                echo "details on how to change this.";
                                echo "";
                        else 
                                echo "yes";
                        fi;
                fi;                           
                if [ "$cygversion" = "failed" ] || [ "$cyg_env_var" = "failed" ] || [ "$mount_test" = "failed" ]; then
                        echo "";
                        echo "Tests indicate that your installation of Cygwin may not be suitable for";
                        echo "installing ns-2 allinone.";
                        echo "";
                        echo -n "Do you wish to proceed regardless? [y/n] "
                        read answer;
                        if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then
                                die "Installation aborted...";
                        fi;
                fi;
                echo "Patching Tcl for Cygwin.";
                if [ ! -f ./tcl${TCLVER}/generic/tcl.h.orig ]; then
                        cp ./tcl${TCLVER}/generic/tcl.h ./tcl${TCLVER}/generic/tcl.h.orig;
                        echo "The original tcl${TCLVER}/generic/tcl.h is backed up as tcl${TCLVER}/generic/tcl.h.orig";
                        sed -e 's/\#define _TCL/\#define _TCL\`\`\#ifdef __CYGWIN__\`\#define HAVE_TM_ZONE 1\`\#endif \/\* __CYGWIN__ \*\//g' ./tcl${TCLVER}/generic/tcl.h.orig | tr '\`' '\n' > ./tcl${TCLVER}/generic/tcl.h;
                fi;
                touch ./tcl${TCLVER}/generic/tclStubInit.c;
                echo "Patching sgb for Cygwin.";
                cp ./sgb/Makefile ./sgb/Makefile.orig;
                echo "The original sgb/Makefile is backed up as sgb/Makefile.orig";
                sed -e 's|rm \(.*\)test_io test_graph test_flip test_sample\(.*\)|rm -f \1test_io.exe test_graph.exe test_flip.exe test_sample.exe\2|' ./sgb/Makefile.orig > ./sgb/Makefile;
                echo "Setting executable format to .exe...";
                EXE=".exe";
        else
                echo "Cygwin not detected, proceeding with regular install.";
                EXE=;
        fi;
else
        echo "Cygwin not detected, proceeding with regular install.";
fi;



# Compile and install xgraph

echo "============================================================"
echo "* Build XGraph-$XGRAPHVER"
echo "============================================================"

cd ./xgraph-$XGRAPHVER
./configure --prefix=../
if  [ "${test_cygwin}" = "true" ]; then
       touch stamp-h;
fi;
if make
then
	echo "xgraph has been installed successfully. "
else 
	echo "Can not create xgraph; But xgraph is an optional package, continuing..."
fi

cd ../

# Compile and install cweb and sgblib

echo "============================================================"
echo "* Build CWeb"
echo "============================================================"

cd ./cweb

if [ ! -f ./Makefile ]
then
	echo "ns-allinone unable to install cweb for you. Please install it manually. cweb is used by sgb to create sgblibrary needed by scenario-generator. But this will not affect the use of ns as such, so continue.."
else
	echo "Making cweb"
	touch *.c
	make all || warn "cweb failed to make, but it's optional"
	# xxx: other stuff will fail...
	chmod 755 cweave${EXE}
	chmod 755 ctangle${EXE}
	cd ..
	#echo "cd .."
	if [ ! -d bin ]
	then
		mkdir bin
	fi
	cd bin
	ln -s $CUR_PATH/cweb/cweave${EXE} cweave${EXE}
	ln -s $CUR_PATH/cweb/ctangle${EXE} ctangle${EXE}
fi

cd ..
PATH=$CUR_PATH/bin:$PATH
export PATH

echo "============================================================"
echo "* Build Stanford GraphBase"
echo "============================================================"

cd ./sgb
if [ ! -f ./Makefile ]
	then
	echo "Unable to create sgb library. This library is used by gt-itm and so for scenario generators. If you already have sgblib (possible if you are on solaris,sunos or freebsd platforms) you may still be able to run gt-itm. so continuing.."
else
	echo "Making sgb"
	if make tests
	then
                if [ -f libgb.a ] ; then
                        rm -f ../gt-itm/lib/libgb.a
			cp libgb.a ../gt-itm/lib/libgb.a
                else 
		        echo "* Weird: sgb said it has been built but we can't find libgb.a! "
			exit -1
                fi
	else
	        echo "Unable to create sgb library, but it's optional, so continuing..."
	fi
fi

cd ..

# Compile and install gt-itm & sgb2ns

echo "============================================================"
echo "* Build GT-ITM"
echo "============================================================"

if [ -f ./gt-itm/lib/libgb.a ]
then
 if [ ! -f ./gt-itm/src/Makefile ] 
    then
    echo "ns-alline is unable to install gt-itm sgb2ns for you, please install"
    echo "them manually. You can't run scenario generator without gt-itm"
    echo "and sgb2ns. But it will not affect you use ns, so continue ..."
 else
    cd ./gt-itm/src
    if make
    then
      echo "gt-itm has been installed successfully."
    fi
    
    cd ../sgb2ns
    if make
    then
      echo "sgb2ns has been installed successfully."
    fi
   cd ../../
 fi
else
    echo "sgb lib not found. gt-itm & sgb2ns could not be installed. Continuing.."
fi

# Build zlib

echo "============================================================"
echo "* Build zlib"
echo "============================================================"

cd ./zlib-1.1.4

if ./configure --exec-prefix=../ --prefix=../
then
	if make
	then
		echo "Zlib has been installed successfully."
	else
		warn "Zlib make failed, but it's optional Continue ..."
	fi
else
	warn "Zlib-1.1.4 configuration failed, but it's optional, so continuing ..."
fi

cd ../

# Build Tcl8.3.5

echo "============================================================"
echo "* Build tcl$TCLVER"
echo "============================================================"

cd ./tcl$TCLVER/unix
if [ -f Makefile ] ; then 
	make distclean
fi

blame='Tcl is not part of the ns project.  Please see www.Scriptics.com
to see if they have a fix for your platform.'
./configure --enable-gcc --disable-shared --prefix=$CUR_PATH || die "tcl8.3.2 configuration failed! Exiting ..."
if make 
then 
	echo "tcl$TCLVER make succeeded."
	make install || die "tcl$TCLVER installation failed."
	echo "tcl$TCLVER installation succeeded."
	cp ../generic/*.h ../../include
else
	echo "tcl$TCLVER make failed! Exiting ..."
	echo "For problems with Tcl/Tk see http://www.scriptics.com"
	exit
fi

cd ../../

# compile and install tk

echo "============================================================"
echo "* Build Tk$TKVER"
echo "============================================================"

cd ./tk$TKVER/unix
if [ -f Makefile ] ; then
	make distclean
fi

blame='Tk is not part of the ns project.  Please see www.Scriptics.com
to see if they have a fix for your platform.'
./configure --enable-gcc --disable-shared --prefix=$CUR_PATH || die "tk8.3.2 configuration failed! Exiting ..."
if make 
then
	echo "tk$TKVER build succeeded."
	make install || die "tk$TKVER installation failed."
	echo "tk$TKVER installation succeeded."
else
	echo "tk$TKVER make failed! Exiting ..."
	echo "For problems with Tcl/Tk see http://www.scriptics.com"
	exit
fi

cd ../../

#
# Since our configures search for tclsh in $PATH, the following 
# is needed. This is necessary for otcl/tclcl/ns/nam
#
PATH=$CUR_PATH/tcl$TCLVER/unix:$CUR_PATH/tk$TKVER/unix:$PATH
export PATH
LD_LIBRARY_PATH=$CUR_PATH/tcl$TCLVER/unix:$CUR_PATH/tk$TKVER/unix:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

# Build otcl

echo "============================================================"
echo "* Build OTcl-$OTCLVER"
echo "============================================================"

cd ./otcl-$OTCLVER

blame='Please check http://www.isi.edu/nsnam/ns/ns-problems.html
for common problems and bug fixes.'
./configure || die "otcl-$OTCLVER configuration failed! Exiting ..."

if make 
then
	echo "otcl-$OTCLVER has been installed successfully."
else
	echo "otcl-$OTCLVER make failed! Exiting ..."
	echo "See http://www.isi.edu/nsnam/ns/ns-problems.html for problems"
	exit
fi

cd ..

# Build tclcl

echo "============================================================"
echo "* Build Tclcl-$TCLCLVER"
echo "============================================================"

cd ./tclcl-$TCLCLVER

./configure || die "tclcl-$TCLCLVER configuration failed! Exiting ..."

if make
then
	echo "tclcl-$TCLCLVER has been installed successfully."
else
	echo "tclcl-$TCLCLVER make failed! Exiting ..."
	echo "See http://www.isi.edu/nsnam/ns/ns-problems.html for problems"
	exit
fi	

cd ../

# John's hack
test -f ./otcl-$OTCLVER/libotcl.a && rm ./otcl-$OTCLVER/libotcl.so

echo "============================================================"
echo "* Build ns-$NSVER"
echo "============================================================"

cd ./ns-$NSVER
./configure || die "Ns configuration failed! Exiting ..."

if make
then
	echo " Ns has been installed successfully." 
else
	echo "Ns make failed!"
	echo "See http://www.isi.edu/nsnam/ns/ns-problems.html for problems"
	exit
fi

cd ../

# Build nam

echo "============================================================"
echo "* Build nam-$NAMVER"
echo "============================================================"

cd ./nam-$NAMVER

./configure --with-tclcl=$CUR_PATH/tclcl-$TCLCLVER  || die "Nam configuration failed! Exiting ..."

if make
then 
    echo "Nam has been installed successfully."
else
    echo "Nam make failed! Continue ..."
    echo "See http://www.isi.edu/nsnam/ns-problems.html for problems"
fi

cd ../

# Install nam, ns, xgraph into bin

if [ ! -d bin ] ; then
    mkdir bin
fi

cd bin

ln -s $CUR_PATH/ns-$NSVER/ns${EXE} ns${EXE}

if test -x $CUR_PATH/nam-$NAMVER/nam${EXE}
then
    ln -s $CUR_PATH/nam-$NAMVER/nam${EXE} nam${EXE}
else
    echo "Please compile your nam separately."
fi

if test -x $CUR_PATH/xgraph-$XGRAPHVER/xgraph${EXE}
then
    ln -s $CUR_PATH/xgraph-$XGRAPHVER/xgraph${EXE} xgraph${EXE}
else
    echo "Please compile your xgraph separately."
fi

if test -x $CUR_PATH/gt-itm/bin/sgb2ns${EXE}
then 
    ln -s $CUR_PATH/gt-itm/bin/sgb2ns${EXE} sgb2ns${EXE}
    ln -s $CUR_PATH/gt-itm/bin/sgb2hierns${EXE} sgb2hierns${EXE}
    ln -s $CUR_PATH/gt-itm/bin/sgb2comns${EXE} sgb2comns${EXE}
    ln -s $CUR_PATH/gt-itm/bin/itm${EXE} itm${EXE}
    ln -s $CUR_PATH/gt-itm/bin/sgb2alt${EXE} sgb2alt${EXE}
    ln -s $CUR_PATH/gt-itm/bin/edriver${EXE} edriver${EXE}
else
    echo "Please compile your gt-itm & sgb2ns separately."
fi

echo "Ns-allinone package has been installed successfully."
echo "Here are the installation places:"
echo "tcl$TCLVER:	$CUR_PATH/{bin,include,lib}"
echo "tk$TKVER:		$CUR_PATH/{bin,include,lib}"
echo "otcl:		$CUR_PATH/otcl-$OTCLVER"
echo "tclcl:		$CUR_PATH/tclcl-$TCLCLVER"
echo "ns:		$CUR_PATH/ns-$NSVER/ns"

if [ -x $CUR_PATH/nam-$NAMVER/nam ]
then
echo "nam:	$CUR_PATH/nam-$NAMVER/nam"
fi

if [ -x $CUR_PATH/xgraph-$XGRAPHVER/xgraph ]
then
echo "xgraph:	$CUR_PATH/xgraph-$XGRAPHVER"
fi
if [ -x $CUR_PATH/gt-itm/bin/sgb2ns ] 
then
echo "gt-itm:   $CUR_PATH/itm, edriver, sgb2alt, sgb2ns, sgb2comns, sgb2hierns"
fi

echo ""
echo "----------------------------------------------------------------------------------"
echo ""
echo "Please put $CUR_PATH/bin:$CUR_PATH/tcl$TCLVER/unix:$CUR_PATH/tk$TKVER/unix" 
echo "into your PATH environment; so that you'll be able to run itm/tclsh/wish/xgraph."
echo ""
echo "IMPORTANT NOTICES:"
echo ""
echo "(1) You MUST put $CUR_PATH/otcl-$OTCLVER, $CUR_PATH/lib, "
echo "    into your LD_LIBRARY_PATH environment variable."
echo "    If it complains about X libraries, add path to your X libraries "
echo "    into LD_LIBRARY_PATH."
echo "    If you are using csh, you can set it like:"
echo "		setenv LD_LIBRARY_PATH <paths>"
echo "    If you are using sh, you can set it like:"
echo "		export LD_LIBRARY_PATH=<paths>"
echo ""
echo "(2) You MUST put $CUR_PATH/tcl$TCLVER/library into your TCL_LIBRARY environmental"
echo "    variable. Otherwise ns/nam will complain during startup."
echo ""
echo "(3) [OPTIONAL] To save disk space, you can now delete directories tcl$TCLVER "
echo "    and tk$TKVER. They are now installed under $CUR_PATH/{bin,include,lib}"
echo ""
echo "After these steps, you can now run the ns validation suite with"
echo "cd ns-$NSVER; ./validate"
echo ""
echo "For trouble shooting, please first read ns problems page "
echo "http://www.isi.edu/nsnam/ns/ns-problems.html. Also search the ns mailing list archive"
echo "for related posts." 
echo ""

exit 0

