#!/usr/bin/env bash

#   Licensed to the Apache Software Foundation (ASF) under one
#   or more contributor license agreements.  See the NOTICE file
#   distributed with this work for additional information
#   regarding copyright ownership.  The ASF licenses this file
#   to you under the Apache License, Version 2.0 (the
#   "License"); you may not use this file except in compliance
#   with the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

host="@HOST_GUESS@"
prefix="@prefix@"
exec_prefix="@exec_prefix@"
libdir="@libdir@"
localstatedir="@localstatedir@"

INSTALLDIR=`eval echo "@libexecdir@"`
INCLUDEDIR=`eval echo "@includedir@"`
CPPFLAGS="$CPPFLAGS -I$INCLUDEDIR @OPENSSL_INCLUDES@"
CFLAGS="$CFLAGS @AM_CFLAGS@"
CXXFLAGS="$CXXFLAGS @AM_CXXFLAGS@"
LIBS="$LIBS @LIBS@ @OPENSSL_LIBS@"
BUILD=
DEBUGECHO=

if [ -z "$CC" ]; then
	CC="@CC@"
fi
if [ -z "$CXX" ]; then
	CXX="@CXX@"
fi

debug() {
	if [ -n "$DEBUGECHO" ]; then
		echo $*
	fi
}

bail() {
	echo tsxs: $*
	exit 1
}

usage() {
	cat <<EOF
$0 : a tool to compile, link and install trafficserver plugins.

Compilation and Linking Options:
-o modulename.so                        ## the name of the module
-I include                              ## add -Iinclude to CFLAGS
-L library path                         ## add -Lpath to LDFLAGS
-l library                              ## add -llib to the LDFLAGS
-v                                      ## verbose, turn on debugging

Installation Options:
-o modulename.so                        ## the name of the module
-i                                      ## install the object

Query Options:
-q varname                              ## query a Traffic Server build variable

Example:
  $0 -I/foo/include -L/foo/lib -lsomelib -o tsmodule.so src1.c src2.c ...

EOF

}

query() {
  case $1 in
    CC) echo @CC@ ;;
    CXX) echo @CXX@ ;;
    CFLAGS) echo $CFLAGS ;;
    CXXFLAGS) echo $CXXFLAGS ;;
	CPPFLAGS) echo $CPPFLAGS ;;
	LIBS) echo $LIBS ;;
	LDFLAGS) echo $LDFLAGS ;;
    PREFIX) echo @prefix@ ;;
    SYSCONFDIR) echo @sysconfdir@ ;;
    INCLUDEDIR) echo @includedir@ ;;
    LIBEXECDIR) echo @libexecdir@ ;;
    BINDIR) echo @bindir@ ;;
    LOCALSTATEDIR) echo @localstatedir@ ;;
    RUNTIMEDIR) echo @runtimedir@ ;;
    LOGDIR) echo @logdir@ ;;
    *) bail "unrecognized query label: $1" ;;
  esac
}

compile() {
	SRC=$1
	extension=`echo $SRC | sed -e 's/^.*\.//g'`
	case $extension in
		c)
			MY_CFLAGS="$CPPFLAGS $CFLAGS"
			MY_CC=$CC
			;;
		cpp|cxx|cc|CPP|CXX|CC|C)
			MY_CFLAGS="$CPPFLAGS $CXXFLAGS"
			MY_CC=$CXX
			;;
		lo|o|a)
			OBJS="${OBJS} ${SRC}"
			BUILD=1
			return
			;;
		*)
			bail "unrecognized input file: $SRC"
			;;
	esac

	obj=`echo $SRC | sed -e 's/\.[a-z]*$/\.lo/g;'`
	echo "  compiling $SRC -> $obj"
	debug "$MY_CC $MY_CFLAGS $PICFLAGS -c $SRC -o $obj"
	$MY_CC $MY_CFLAGS $PICFLAGS -c $SRC -o $obj ||
		bail "compilation failed: $MY_CC $MY_CFLAGS $PICFLAGS -c $SRC -o $obj"
	OBJS="$OBJS $obj"
	BUILD=1
}

case $host in
*-*-darwin*)
        LDFLAGS="$LDFLAGS @OPENSSL_LDFLAGS@"
        CPPFLAGS="$CPPFLAGS"
        PICFLAGS="-fPIC"
        MODULELD="$CC -bundle -flat_namespace -undefined suppress"
        MODULELDXX="$CXX -bundle -flat_namespace -undefined suppress"
        MODULEEXT=bundle
        RLDFLAG="-Wl,-rpath,"
        ;;
*-*-solaris*)
        PICFLAGS="-fpic"
        if test "x$CC" != "xgcc" ; then
                CFLAGS="$CFLAGS -mt"
        	PICFLAGS="-Kpic"
        fi
        MODULELD="$CC -G"
        MODULELDXX="$CXX -G"
        MODULEEXT=so
        RLDFLAG="-R"
        WHOLE_ARCHIVE="-Wl,-z -Wl,allextract"
        NOWHOLE_ARCHIVE="-Wl,-z -Wl,defaultextract"
        ;;
*-*-linux*)
        LDFLAGS="$LDFLAGS @OPENSSL_LDFLAGS@ -Wl,-E"
        CPPFLAGS="$CPPFLAGS"
        PICFLAGS="-fpic"
        MODULELD="$CC -shared"
        MODULELDXX="$CXX -shared"
        MODULEEXT=so
        RLDFLAG="-Wl,--rpath="
        WHOLE_ARCHIVE="-Wl,--whole-archive"
        NOWHOLE_ARCHIVE="-Wl,--no-whole-archive"
        ;;
*-*-freebsd*)
        PICFLAGS="-fpic"
        MODULELD="$CC -shared"
        MODULELDXX="$CXX -shared"
        MODULEEXT=so
        RLDFLAG="-Wl,--rpath="
        ;;
*)
        PICFLAGS="-fpic"
        MODULELD="$CC -shared"
        MODULEEXT=so
        RLDFLAG="-Wl,--rpath="
        ;;
esac

files=()

LD=$MODULELD
while getopts "hivl:L:I:c:C:o:q:" OPTION
do
	case $OPTION in
	v)
		DEBUGECHO=1
		;;
	h)
		usage
		exit 1
		;;
  q)
    query "$OPTARG"
    ;;
	I)
		CPPFLAGS="$CPPFLAGS -I$OPTARG"
		;;
	L)
		LDFLAGS="$LDFLAGS -L$OPTARG $RLDFLAG$OPTARG"
		;;
	l)
		LIBS="$LIBS -l$OPTARG"
		;;
	o)
		OBJ=$OPTARG
		;;
	i)
		INSTALL=1
		;;
	c)
		files[${#files[@]}]="$OPTARG"
		;;
	C)
		files[${#files[@]}]="$OPTARG"
		;;
	esac
done
shift $(( OPTIND - 1))

for file in "${files[@]}" "$@"; do
	compile $file
done

if [ "$BUILD" = "1" -a -n "$OBJ" ]; then
	echo "  linking -> $OBJ"
	debug "$LD $LDFLAGS -o $OBJ $OBJS $LIBS"
	$LD $LDFLAGS -o $OBJ $OBJS $LIBS ||
		bail "link failed: $LD $LDFLAGS -o $OBJ $OBJS $LIBS"
fi

if [ -n "$OBJ" ]; then
	if [ -r "$OBJ" ]; then
		if [ "$INSTALL" = "1" ]; then
			echo "  installing $OBJ -> $INSTALLDIR/$OBJ"
			cp $OBJ ${DESTDIR}${INSTALLDIR}/${OBJ}
			chmod 0755 ${DESTDIR}${INSTALLDIR}/${OBJ}
		fi
	else
		echo "No $OBJ"
	fi
fi
