#! /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 environment 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"

