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

#
# 1. Download and build all uimacpp 3rd party library dependencies
# 2. Build uimacpp and run test cases
# 3. Build uimacpp docs
# 4. Assemble uimacpp SDK tree
#

set -e

PREFIX=`pwd`/dependencies
TARGET=`pwd`/target

mkdir -p "$PREFIX"
mkdir -p "$TARGET"

#guess JAVA_HOME if not set
if [ -z $JAVA_HOME ]; then
    JAVA_HOME=$(dirname $(dirname $(dirname $(readlink -f $(which java)))))
    if [ ! -f "$JAVA_HOME/include/jni.h" ]; then
	echo Cannot guess JAVA_HOME. JAVA SDK installed?
	exit
    fi
    echo guessing JAVA_HOME=$JAVA_HOME
else
    echo using specified JAVA_HOME=$JAVA_HOME
fi

# Install location for 3rd party components
export APR_HOME=$PREFIX
export APU_HOME=$PREFIX
export XERCES_HOME=$PREFIX
export ICU_HOME=$PREFIX
export AMQ_HOME=$PREFIX

# 3rd party component versons to use
XERCES=xerces-c-3.1.4
ICU=icu4c-50_2-src.tgz
APR=apr-1.4.8
APRUTIL=apr-util-1.6.1
AMQCPP=activemq-cpp-library-3.9.3
# Additional modifications may be needed below for changes to Xerces, ICU, or ActiveMQ-C++

# Build xerces
if [ ! -f "${XERCES}.tar.gz" ]; then
    wget http://archive.apache.org/dist/xerces/c/3/sources/$XERCES}.tar.gz
    tar -xf ${XERCES}.tar.gz
fi
#Modify next line if not version 3.1.x
if [ ! -f "$XERCES/src/.libs/libxerces-c-3.1.so" ]; then
    cd $XERCES
    ./configure --prefix="$PREFIX"
    make install
    cd ..
else
    echo Xerces previously built
fi

# Build ICU
if [ ! -f $ICU ]; then
#Modify next line if not version 50.2
    wget https://github.com/unicode-org/icu/releases/download/release-50-2/$ICU
    tar -xzf $ICU
fi
if [ ! -f icu/source/bin/uconv ]; then
    cd icu/source
    ./runConfigureICU Linux --prefix="$PREFIX"
    make install
    cd ../..
else
    echo ICU previously built
fi

# Build APR
if [ ! -f "${APR}.tar.gz" ]; then
    wget http://archive.apache.org/dist/apr/${APR}.tar.gz
    tar -xzf ${APR}.tar.gz
fi
if [ ! -f "$APR/build/apr_rules.out" ]; then
    cd $APR
    ./configure --prefix="$PREFIX"
    make install
    cd ..
else
    echo APR previously built
fi

# Build APR-UTIL
if [ ! -f "${APRUTIL}.tar.gz" ]; then
    wget http://mirrors.ocf.berkeley.edu/apache//apr/${APR-UTIL}.tar.gz
    tar -xf ${APRUTIL}.tar.gz
fi
if [ ! -f ${APRUTIL}/apu-config.out ]; then
    cd $APRUTIL
    ./configure --prefix=$PREFIX --with-apr=$PREFIX/bin/apr-1-config
    make install
    cd ..
else
    echo "APR-UTIL previously built"
fi

# Build ActiveMQ-C++
if [ ! -f ${AMQCPP}-src.tar.gz ]; then
#Modify next line if not v3.9.3
    wget http://archive.apache.org/dist/activemq/activemq-cpp/3.9.3/${AMQCPP}-src.tar.gz
    tar -xf ${AMQCPP}-src.tar.gz
fi
if [ ! -f ${AMQCPP}/src/main/.libs/libactivemq-cpp.so ]; then
    cd $AMQCPP
    ./configure --prefix=$PREFIX --with-apr=$PREFIX/bin/apr-1-config
    make install
    cd ..
else
    echo "ActiveMQ C++" previously built
fi

# Now build UIMA

./autogen.sh
./configure --prefix=$TARGET --with-xerces=$PREFIX --with-apr=$PREFIX --with-apr-util=$PREFIX --with-icu=$PREFIX --with-activemq=$PREFIX --with-jdk=$JAVA_HOME/include' -I'${JAVA_HOME}/include/linux CXXFLAGS=-std=c++11
make check
make install
make docs
make sdk TARGETDIR=sdk
