#! /bin/sh
###############################################################
#  
#  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.
#  
###############################################################

# This script starts a new shell and sets all enviroment variables, which
# are necessary for building the examples of the Office Development Kit.
# The Script was developed for the operating systems Solaris, Linux and MacOS.

# The SDK name
OO_SDK_NAME=@OO_SDK_NAME@
export OO_SDK_NAME

# Installation directory of the Software Development Kit.
# Example: OO_SDK_HOME=/opt/openoffice/basis4.0/sdk
OO_SDK_HOME='@OO_SDK_HOME@'

# Office installation directory.
# Example: OFFICE_HOME=/opt/openoffice4
OFFICE_HOME='@OFFICE_HOME@'

# Directory of the make command.
# Example: OO_SDK_MAKE_HOME=/usr/bin
OO_SDK_MAKE_HOME=@OO_SDK_MAKE_HOME@

# Directory of the zip command.
# Example: OO_SDK_ZIP_HOME=/usr/bin
OO_SDK_ZIP_HOME=@OO_SDK_ZIP_HOME@

# Directory of the cat command.
# Example: OO_SDK_CAT_HOME=/usr/bin
OO_SDK_CAT_HOME=@OO_SDK_CAT_HOME@

# Directory of the sed command.
# Example: OO_SDK_SED_HOME=/usr/bin
OO_SDK_SED_HOME=@OO_SDK_SED_HOME@

# Directory of the C++ compiler.
# Example: OO_SDK_CPP_HOME=/usr/bin
OO_SDK_CPP_HOME=@OO_SDK_CPP_HOME@

# Solaris only
OO_SDK_CC_55_OR_HIGHER=@OO_SDK_CC_55_OR_HIGHER@

# Directory of the Java SDK.
# Example: OO_SDK_JAVA_HOME=/usr/jdk/jdk1.6.0_10
OO_SDK_JAVA_HOME=@OO_SDK_JAVA_HOME@

# Directory of Boost (optional, C++ only)
# Example: OO_SDK_BOOST_HOME=/opt/local/boost_1_48_0
OO_SDK_BOOST_HOME=@OO_SDK_BOOST_HOME@
export OO_SDK_BOOST_HOME

# Special output directory
# Example: OO_SDK_OUTPUT_DIR=$HOME
OO_SDK_OUTPUT_DIR=@OO_SDK_OUTPUT_DIR@

# Environment variable to enable auto deployment of example components
# Example: SDK_AUTO_DEPLOYMENT=YES
SDK_AUTO_DEPLOYMENT=@SDK_AUTO_DEPLOYMENT@
export SDK_AUTO_DEPLOYMENT

# Check installation path for the Apache OpenOffice Development Kit.
if [ -z "${OO_SDK_HOME}" ]
then
    echo Error: Please insert a correct value for the variable OO_SDK_HOME.
    exit 0
fi

export OO_SDK_HOME

# Check installation path for the office.
if [ -z "${OFFICE_HOME}" ]
then
    echo 'Error: Please set either the environment variable OFFICE_HOME.'
    exit 0
fi

# Get the operating system.
sdk_platform=`${OO_SDK_HOME}/config.guess | cut -d"-" -f3,4`

# Set the directory name.
programdir=program
javadir=bin
case ${sdk_platform} in
  darwin*)
    programdir="Contents/MacOS"
    javacdir=Commands
    ;;
esac

# Set office program path (only set when using an Office).
if [ "${OFFICE_HOME}" ]
then
    OFFICE_PROGRAM_PATH=${OFFICE_HOME}/${programdir}
    export OFFICE_PROGRAM_PATH
fi

# Set UNO path, necessary to ensure that the cpp examples using the
# new UNO bootstrap mechanism use the configured office installation (only set
# when using an Office).
if [ "${OFFICE_HOME}" ]
then
    UNO_PATH=${OFFICE_PROGRAM_PATH}
    export UNO_PATH
fi

OO_SDK_OFFICE_BIN_DIR=${OFFICE_PROGRAM_PATH}
OO_SDK_OFFICE_LIB_DIR=${OFFICE_PROGRAM_PATH}
OO_SDK_OFFICE_JAVA_DIR=${OFFICE_PROGRAM_PATH}/classes

export OO_SDK_OFFICE_BIN_DIR
export OO_SDK_OFFICE_LIB_DIR
export OO_SDK_OFFICE_JAVA_DIR

OO_SDK_OUT=$OO_SDK_HOME
# Prepare appropriate output directory.
if [ -n "${OO_SDK_OUTPUT_DIR}" ]
then
    OO_SDK_OUT=${OO_SDK_OUTPUT_DIR}/${OO_SDK_NAME}
    export OO_SDK_OUT
fi

# Set the directory name.
case ${sdk_platform} in
  solaris*)
    sdk_proctype=`${OO_SDK_HOME}/config.guess | cut -d"-" -f1`
    if [ "${sdk_proctype}" = "sparc" ]
    then
        directoryname=solsparc
	platform='Solaris Sparc'
    else
        directoryname=solintel
	platform='Solaris x86'
    fi
    comid=C52
    soext=so
    exampleout=SOLARISexample.out
    stldebug=_debug
    LD_LIBRARY_PATH=${OO_SDK_HOME}/lib:${OO_SDK_OUT}/${exampleout}/lib:${OO_SDK_OFFICE_LIB_DIR}:.:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH
    ;;

  darwin*)
    if [ -n "$OO_SDK_CPP_HOME" ]
    then
	SDK_GXX_INCLUDE_PATH=`echo "#include <cstring>" | ${OO_SDK_CPP_HOME}/clang++ -E -xc++ - | sed -n '/.*1*"\(.*\)\/cstring".*/s//\1/p' | head -n 1`
	export SDK_GXX_INCLUDE_PATH
    fi	

    directoryname=macosx
    comid=s5abi
    soext=dylib
    exampleout=MACOSXexample.out
    platform=MacOSX
    stldebug=_stldebug
    DYLD_LIBRARY_PATH=/usr/lib:${OO_SDK_OUT}/${directoryname}/lib:${OO_SDK_OUT}/${exampleout}/lib:${OO_SDK_OFFICE_LIB_DIR}:.:${DYLD_LIBRARY_PATH}
    export DYLD_LIBRARY_PATH
    ;;

  linux-gnu)
    if [ -n "$OO_SDK_CPP_HOME" ]
    then
	SDK_GXX_INCLUDE_PATH=`echo "#include <cstring>" | ${OO_SDK_CPP_HOME}/g++ -E -xc++ - | sed -n '/.*1*"\(.*\)\/cstring".*/s//\1/p' | head -n 1`
	export SDK_GXX_INCLUDE_PATH
    fi	

    directoryname=linux
    comid=gcc3
    soext=so
    exampleout=LINUXexample.out
    platform=Linux
    stldebug=_stldebug
    LD_LIBRARY_PATH=${OO_SDK_HOME}/lib:${OO_SDK_OUT}/${exampleout}/lib:${OO_SDK_OFFICE_LIB_DIR}:.:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH
    ;;

  freebsd*)
    if [ -n "$OO_SDK_CPP_HOME" ]
    then
	SDK_GXX_INCLUDE_PATH=`echo "#include <cstring>" | ${OO_SDK_CPP_HOME}/g++ -E -xc++ - | sed -n '/.*1*"\(.*\)\/cstring".*/s//\1/p' | head -n 1`
	export SDK_GXX_INCLUDE_PATH
    fi	

    directoryname=freebsd
    comid=gcc3
    soext=so
    exampleout=FREEBSDexample.out
    platform=FreeBSD
    stldebug=_stldebug
    LD_LIBRARY_PATH=${OO_SDK_HOME}/lib:${OO_SDK_OUT}/${exampleout}/lib:${OO_SDK_OFFICE_LIB_DIR}:.:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH

    if [ -e "/sbin/sysctl" ]
    then
	OSVERSION=`/sbin/sysctl  -n kern.osreldate`
    else
	OSVERSION=`/usr/sbin/sysctl  -n kern.osreldate`
    fi
    if [ $OSVERSION -lt 500016 ]
    then
	PTHREAD_CFLAGS=-D_THREAD_SAFE
	PTHREAD_LIBS=-pthread
	export PTHREAD_CFLAGS
	export PTHREAD_LIBS
    elif [ $OSVERSION -lt 502102 ]
    then
	PTHREAD_CFLAGS=-D_THREAD_SAFE
	PTHREAD_LIBS=-lc_r
	export PTHREAD_CFLAGS
	export PTHREAD_LIBS
    else	
	PTHREAD_LIBS=-pthread
	export PTHREAD_LIBS
    fi
    ;;
esac

# Add directory of the SDK tools to the path.
PATH=${OO_SDK_HOME}/bin:${OO_SDK_OUT}/${exampleout}/bin:${OFFICE_PROGRAM_PATH}:.:${PATH}

# Set the classpath
CLASSPATH=${OO_SDK_OFFICE_JAVA_DIR}/juh.jar:${OO_SDK_OFFICE_JAVA_DIR}/jurt.jar:${OO_SDK_OFFICE_JAVA_DIR}/ridl.jar:${OO_SDK_OFFICE_JAVA_DIR}/unoloader.jar:${OO_SDK_OFFICE_JAVA_DIR}/unoil.jar:${CLASSPATH}
export CLASSPATH


# Add directory of the command make to the path, if necessary.
if [ -n "${OO_SDK_MAKE_HOME}" ]
then
    PATH=${OO_SDK_MAKE_HOME}:${PATH}
    export OO_SDK_MAKE_HOME
fi

# Add directory of the zip tool to the path, if necessary.
if [ -n "${OO_SDK_ZIP_HOME}" ]
then
    PATH=${OO_SDK_ZIP_HOME}:${PATH}
    export OO_SDK_ZIP_HOME
fi

# Add directory of the sed tool to the path, if necessary.
if [ -n "${OO_SDK_SED_HOME}" ]
then
    PATH=${OO_SDK_SED_HOME}:${PATH}
    export OO_SDK_SED_HOME
fi

# Add directory of the cat tool to the path, if necessary.
if [ -n "${OO_SDK_CAT_HOME}" ]
then
    PATH=${OO_SDK_CAT_HOME}:${PATH}
    export OO_SDK_CAT_HOME
fi

# Add directory of the C++ tools to the path, if necessary.
if [ -n "${OO_SDK_CPP_HOME}" ]
then
    PATH=${OO_SDK_CPP_HOME}:${PATH}
    export OO_SDK_CPP_HOME

    if [ -n "${OO_SDK_CC_55_OR_HIGHER}" ]
    then
	export OO_SDK_CC_55_OR_HIGHER
    fi
fi

# Add directory of the Java tools to the path, if necessary.
if [ -n "${OO_SDK_JAVA_HOME}" ]
then
    PATH=${OO_SDK_JAVA_HOME}/${javadir}:${PATH}
#    JAVA_HOME=${OO_SDK_JAVA_HOME}
#    export JAVA_HOME
    export OO_SDK_JAVA_HOME

    export PATH
fi

export PATH

if [ "${platform}" = "MacOSX" ]
then
#    For URE, prepare symbolic links for libraries:
#    Only necessary on MacOSX, on other Unix systems the links are already prepared
#    in the SDK installation.

#    cleanup potential old links first
    rm -f "${OO_SDK_OUT}/${directoryname}/lib/libuno_cppu.${soext}" \
	"${OO_SDK_OUT}/${directoryname}/lib/libuno_cppuhelper${comid}.${soext}" \
	"${OO_SDK_OUT}/${directoryname}/lib/libuno_sal.${soext}" \
	"${OO_SDK_OUT}/${directoryname}/lib/libuno_salhelper${comid}.${soext}" \
	"${OO_SDK_OUT}/${directoryname}/lib/libuno_purpenvhelper${comid}.${soext}"

#    prepare links 
    if [ "${OFFICE_HOME}" ]
    then
	mkdir -p "${OO_SDK_OUT}/${directoryname}/lib"
	ln -s "${OO_SDK_OFFICE_LIB_DIR}/libuno_cppu.${soext}.3" \
	    "${OO_SDK_OUT}/${directoryname}/lib/libuno_cppu.${soext}"
	ln -s "${OO_SDK_OFFICE_LIB_DIR}/libuno_cppuhelper${comid}.${soext}.3" \
	    "${OO_SDK_OUT}/${directoryname}/lib/libuno_cppuhelper${comid}.${soext}"
	ln -s "${OO_SDK_OFFICE_LIB_DIR}/libuno_sal.${soext}.3" \
	    "${OO_SDK_OUT}/${directoryname}/lib/libuno_sal.${soext}"
	ln -s "${OO_SDK_OFFICE_LIB_DIR}/libuno_salhelper${comid}.${soext}.3" \
	    "${OO_SDK_OUT}/${directoryname}/lib/libuno_salhelper${comid}.${soext}"
	ln -s "${OO_SDK_OFFICE_LIB_DIR}/libuno_purpenvhelper${comid}.${soext}.3" \
	    "${OO_SDK_OUT}/${directoryname}/lib/libuno_purpenvhelper${comid}.${soext}"

    fi
fi 


# Prepare shell with all necessary environment variables.
echo 
echo " ************************************************************************"
echo " *"
echo " * SDK environment is prepared for ${platform}"
echo " *"
echo " * SDK = $OO_SDK_HOME"
echo " * Office = $OFFICE_HOME"
echo " * Make = $OO_SDK_MAKE_HOME"
echo " * Zip = $OO_SDK_ZIP_HOME"
echo " * cat = $OO_SDK_CAT_HOME"
echo " * sed = $OO_SDK_SED_HOME"
echo " * C++ Compiler = $OO_SDK_CPP_HOME"
echo " * Java = $OO_SDK_JAVA_HOME"
echo " * Boost = $OO_SDK_BOOST_HOME"
echo " * SDK Output directory = $OO_SDK_OUT"
echo " * Auto deployment = $SDK_AUTO_DEPLOYMENT"
echo " *"
echo " ************************************************************************"

echo "]2;Shell prepared with the SDK environment"

