#!/bin/bash

# Script to make the PGPLOT libraries.
# Exit Codes found in /usr/include/sysexits.h

#set -x


# Function to configure, make and then install the Package - contains Package Specific build configuration

func_configure_make_install () {

    case "${ACC_ENABLE_SHARED}" in
	"Y" | "y" | "1" )
	    BUILD_SHARED=1
	    ;;
    esac

    cd ${WORK_DIR}

    if [ ! -e ALREADY_BUILT ] ; then
	rm -f libpgplot.a
	rm -f libpgplot.so
	rm -f libpgplot.dylib
	rm -f libcpgplot.a
	rm -f cpgdemo
	rm -f figdisp
	rm -f pgdisp
	rm -f pgxwin_server
    
	if [[ $ACC_COMPILER_TOOLSET == mingw* ]] ; then
		SPEC=gfortran-gcc
		OS=win7
	else
		SPEC=${FC}_gcc
		OS=linux
	fi
    
	[ "${FC}" == "ifort" ] \
	    && export NON_FORTRAN_MAIN_LINK="-nofor_main"
	[ "${BUILD_TYPE}" == "debug" ] \
	    && SPEC+='_g'

	if ( [ ! -d /usr/X11R6/include ] && [ `uname` == "Linux" ] && [ "${FC}" == "gfortran" ] ) ; then
	    [ -d /usr/include/X11 ] \
		&& sed -i "s%usr/X11R6/include%usr/include%g" sys_linux/gfortran_gcc*.conf
 	    [ -e /usr/lib64/libX11.so ] \
		&& sed -i "s%usr/X11R6/lib%usr/lib64%g" sys_linux/gfortran_gcc*.conf
	fi

	if ( [ `uname` == "Linux" ] && [ "${FC}" == "gfortran" ] ) ; then
	    sed -i 's%SHARED_LIB="libpgplot.so"%SHARED_LIB="${SHARED_LIB_NAME}"%g' sys_linux/gfortran_gcc*.conf
	    sed -i 's%SHARED_LD="gcc -shared  -o $SHARED_LIB"%SHARED_LD="${SHARED_LIB_COMMAND}"%g' sys_linux/gfortran_gcc*.conf
	elif ( [ `uname` == "Linux" ] && [ "${FC}" == "ifort" ] ) ; then
	    sed -i 's%SHARED_LIB="libpgplot.so"%SHARED_LIB="${SHARED_LIB_NAME}"%g' sys_linux/ifort_gcc*.conf
	    sed -i 's%SHARED_LD="gcc -shared  -o $SHARED_LIB"%SHARED_LD="${SHARED_LIB_COMMAND}"%g' sys_linux/ifort_gcc*.conf
	elif ( [ `uname` == "Darwin" ] && [ "${FC}" == "gfortran" ] ) ; then
	    sed -i .old 's%SHARED_LIB=""%SHARED_LIB="${SHARED_LIB_NAME}"%g' sys_bsd/gfortran_gcc*.conf
	    sed -i .old 's%SHARED_LD=""%SHARED_LD="${SHARED_LIB_COMMAND}"%g' sys_bsd/gfortran_gcc*.conf
	elif ( [ `uname` == "Darwin" ] && [ "${FC}" == "ifort" ] ) ; then
	    sed -i .old 's%SHARED_LIB=""%SHARED_LIB="${SHARED_LIB_NAME}"%g' sys_bsd/ifort_gcc*.conf
	    sed -i .old 's%SHARED_LD=""%SHARED_LD="${SHARED_LIB_COMMAND}"%g' sys_bsd/ifort_gcc*.conf
 	fi

	if [ `uname` == "Darwin" ] ; then 
	    OS=bsd
	    export CC="g++"
	    [ -d /opt/X11 ] \
		&& sed -i .old "s%usr/X11R6%opt/X11%g" sys_bsd/*.conf \
		|| echo -e "\nPlease install XQuartz - http://xquartz.macosforge.org \n"
	fi

	if [ ${BUILD_SHARED} ] ; then
	    [ "${FC}" == "gfortran" ] \
		&& export FC_LINK_LIBS="-lgfortran"

	    [ `uname` == "Linux" ] \
		&& export SHARED_LIB_NAME="libpgplot.so"

	    [ `uname` == "Darwin" ] \
		&& export SHARED_LIB_NAME="libpgplot.dylib" \
		&& export XINCL=$(grep XINCL sys_bsd/${FC}_gcc.conf | head -1 | awk -F'"' ' { print $2 } ')  \
		&& export LIBS=$(grep lX11 sys_bsd/${FC}_gcc.conf | tail -1 | awk -F'"' ' { print $2 } ') \
		&& [ "${FC}" == "ifort" ] && export DYLD_LIBRARY_PATH="/opt/intel/lib:$DYLD_LIBRARY_PATH"

	    export SHARED_LIB_COMMAND="gcc -shared -o ${OUTPUT_DIR}/lib/${SHARED_LIB_NAME} ${XINCL} ${LIBS} ${FC_LINK_LIBS}"
	fi

	echo -e "\nmakemake args: ${OS} ${SPEC}\n"
	./makemake . ${OS} ${SPEC}

	func_print_compiler_linker_flags

 	[ ${BUILD_SHARED} ] \
	    && echo -e "Shared Library linker command:\n\n  ${SHARED_LIB_COMMAND}\n\n"

	${GMAKE}
	${GMAKE} cpg

	export RETVAL=$?

	[[ ! -e ${OUTPUT_DIR}/lib/libpgplot.a ]] \
	    && cp *.a ${OUTPUT_DIR}/lib \
	    && ln -s ../${BUILD_TYPE}/lib/libpgplot.a ../ \
	    && ln -s ../${BUILD_TYPE}/lib/libcpgplot.a ../ > /dev/null 2>&1

	[[ ! -e ${OUTPUT_DIR}/lib/libpgplot.so ]] \
	    && cp *.so ${OUTPUT_DIR}/lib > /dev/null 2>&1 \
	    && ln -s ../${BUILD_TYPE}/lib/libpgplot.so ../ > /dev/null 2>&1

	[[ ! -e ${OUTPUT_DIR}/lib/libpgplot.dylib ]] \
	    && cp *.dylib ${OUTPUT_DIR}/lib > /dev/null 2>&1 \
	    && ln -s ../${BUILD_TYPE}/lib/libpgplot.dylib ../ > /dev/null 2>&1

	[ ! -e ${OUTPUT_DIR}/bin/cpgdemo ] \
	    && cp cpgdemo ${OUTPUT_DIR}/bin \
	    && ln -s ../${BUILD_TYPE}/bin/cpgdemo ../cpgdemo > /dev/null 2>&1

	[ ! -e ${OUTPUT_DIR}/bin/pgdisp ] \
	    && cp pgdisp ${OUTPUT_DIR}/bin \
	    && ln -s ../${BUILD_TYPE}/bin/pgdisp ../pgdisp > /dev/null 2>&1 \
	    && ln -s ../${BUILD_TYPE}/bin/pgdisp ../figdisp > /dev/null 2>&1

	[ ! -e ${OUTPUT_DIR}/bin/pgxwin_server ] \
	    && cp pgxwin_server ${OUTPUT_DIR}/bin \
	    && ln -s ../${BUILD_TYPE}/bin/pgxwin_server ../pgxwin_server > /dev/null 2>&1

	if ( [ `uname` == "Darwin" ] && [ "${FC}" == "ifort" ] && [ "${RETVAL}" -eq 0 ] ) ; then 
	    ln -s /opt/intel/lib/* ${OUTPUT_DIR}/lib/ > /dev/null 2>&1
	fi

	[ -e pgplot_mod.mod ] \
	    && cp pgplot_mod.mod ${OUTPUT_DIR}/modules

    fi

    if [ "${ARGUMENTS[1]}" == "-test" ] ; then 
	echo -e "\nBuilding tests for `echo ${PACKAGE_VERSION}`...\n" 
	PATH=${OUTPUT_DIR}/bin:$PATH
	LD_LIBRARY_PATH=${OUTPUT_DIR}/lib:$LD_LIBRARY_PATH
	PGPLOT_DIR=${WORK_DIR}
	echo "/CPS" | cpgdemo > /dev/null 2>&1
	export RETVAL=$?
	[ ${RETVAL} -eq 0 ] \
	    && echo -e "\nTest Passed!! \n\nPlease display the below output file in a Postscript viewer:\n\n   ${WORK_DIR}/pgplot.ps\n" \
	    || echo -e "\nTests Failed, Please check build log.\n"
    fi

}


# Function that contains Package Specific files and directories to be removed

func_remove_package () {

    rm -f ${OUTPUT_DIR}/lib/libpgplot.*
    rm -f ${OUTPUT_DIR}/lib/libcpgplot.*
    rm -f ${OUTPUT_DIR}/bin/cpgdemo
    rm -f ${OUTPUT_DIR}/bin/pgdisp
    rm -f ${OUTPUT_DIR}/bin/pgxwin_server
    rm -f ${OUTPUT_DIR}/modules/pgplot_mod.mod
    rm -rf ${BUILD_TYPE}
    if ( [ -L libpgplot.a ] && [ "`ls -la libpgplot.a | grep ${BUILD_TYPE}`" ] ) ; then rm -f libpgplot.a > /dev/null 2>&1 ; fi 
    if ( [ -L libpgplot.so ] && [ "`ls -la libpgplot.so | grep ${BUILD_TYPE}`" ] ) ; then rm -f libpgplot.so > /dev/null 2>&1 ; fi
    if ( [ -L libpgplot.dylib ] && [ "`ls -la libpgplot.dylib | grep ${BUILD_TYPE}`" ] ) ; then rm -f libpgplot.dylib > /dev/null 2>&1 ; fi
    if ( [ -L libcpgplot.a ] && [ "`ls -la libcpgplot.a | grep ${BUILD_TYPE}`" ] ) ; then rm -f libcpgplot.a > /dev/null 2>&1 ; fi
    if ( [ -L cpgdemo ] && [ "`ls -la cpgdemo | grep ${BUILD_TYPE}`" ] ) ; then rm -f cpgdemo > /dev/null 2>&1 ; fi 
    if ( [ -L pgdisp ] && [ "`ls -la pgdisp | grep ${BUILD_TYPE}`" ] ) ; then rm -f pgdisp figdisp > /dev/null 2>&1 ; fi 
    if ( [ -L pgxwin_server ] && [ "`ls -la pgxwin_server | grep ${BUILD_TYPE}`" ] ) ; then rm -f pgxwin_server > /dev/null 2>&1 ; fi

    rm -f ${BASE_DIR}/${PROJ_DIR_NAME}/figdisp
    rm -f ${BASE_DIR}/${PROJ_DIR_NAME}/cpgdemo

}

