#!/bin/ksh

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

# for now, change versionnumber in line below
srcName=uimacpp-2.4.0-src

if [ "$1" = 'TRACE' ]
    then set -vx ;shift
fi

if [ $# -lt 1 ] ;then
    print -u2 "\nERROR: target directory for source tree not specified"
    print -u2 "-------"
    print -u2 "Usage: buildSrcTree targetDirectory [clean]"
    print -u2 "       Builds Unix source for distribution"
    print -u2 "assumes: current directory is the root of svn extract"
    print -u2 "expects: target directory to be non-existant\n"
    print -u2 "-------"
    exit 9
fi

target_dir=$1/$srcName
if [ "$2" = 'clean' ]
    then rm -rf $target_dir
fi
if [ -d $target_dir ]
then
    print -u2 "ERROR: directory $target_dir already exists"
    print -u2 "use "clean" option"
    print -u2 "FAILED: UIMA C++ source tree was not built."
    exit 9
fi
print -u2 "Target Source directory is $target_dir"

UIMACPP_SOURCE=`pwd`
if [ ! -d "$UIMACPP_SOURCE"/src ]; then
       echo ERROR: current directory is not root of UIMACPP source tree
       exit
fi

UNAME=`uname -s`
if [ "$UNAME" = "Darwin" ]; then
  CP=-p
  CPL=-p
  CPLR=-pR
  LIBEXT=dylib
else
  CP=-pH
  CPL=-pd
  CPLR=-pdr
  LIBEXT=so
fi


# No Configure script means we have to run autogen
if [ -x "./configure" ] ; then
        # even if we have a configure script, if the template has been updated we should
        # run it again to account for the changes, which also means we need to run a autogen
        # to create the actual script and associated autoconf artifacts.
    if [ "./configure.ac" -ot "./configure" ]  ; then
             echo "configure is up to date"
    else
            ./autogen.sh
    fi
else
  ./autogen.sh
fi


mkdir $target_dir
mkdir $target_dir/m4
mkdir $target_dir/data
mkdir $target_dir/docs
mkdir $target_dir/src
mkdir $target_dir/src/cas
mkdir $target_dir/src/cas/uima
mkdir $target_dir/src/jni
mkdir $target_dir/src/jni/uima
mkdir $target_dir/src/framework
mkdir $target_dir/src/framework/uima
mkdir $target_dir/src/utils
mkdir $target_dir/src/test

print -u2 "copying from $UIMACPP_SOURCE"
cp $CPL  $UIMACPP_SOURCE/buildsdk.sh $target_dir/
cp $CPL  $UIMACPP_SOURCE/NOTICE.4src $target_dir/NOTICE
cp $CPL  $UIMACPP_SOURCE/LICENSE $target_dir/
cp $CPL  $UIMACPP_SOURCE/RELEASE_NOTES* $target_dir/
cp $CPL  $UIMACPP_SOURCE/README.4src $target_dir/README
cp $CPL  $UIMACPP_SOURCE/README.4sdk $target_dir/
cp $CPL  $UIMACPP_SOURCE/NOTICE.4sdk $target_dir/
cp $CPL  $UIMACPP_SOURCE/configure $target_dir/
cp $CPLR $UIMACPP_SOURCE/config $target_dir
cp $CPL  $UIMACPP_SOURCE/Makefile.in $target_dir
cp $CPL  $UIMACPP_SOURCE/configure.ac $target_dir
cp $CPL  $UIMACPP_SOURCE/autogen.sh $target_dir
cp $CPL  $UIMACPP_SOURCE/Makefile.am $target_dir
cp $CPL  $UIMACPP_SOURCE/m4/find_icu.m4  $target_dir/m4
cp $CPL  $UIMACPP_SOURCE/m4/find_xerces.m4 $target_dir/m4
cp $CPL  $UIMACPP_SOURCE/m4/find_apr.m4 $target_dir/m4
cp $CPL  $UIMACPP_SOURCE/m4/find_activemq.m4 $target_dir/m4
cp $CPL  $UIMACPP_SOURCE/aclocal.m4  $target_dir

print -u2 "copying from $UIMACPP_SOURCE/data"
cp $CPL  $UIMACPP_SOURCE/data/*.xsd $target_dir/data/

print -u2 "copying from $UIMACPP_SOURCE/docs"
cp $CPL $UIMACPP_SOURCE/docs/uimacppdocs.mak $target_dir/docs
cp $CPL $UIMACPP_SOURCE/docs/builddocs.sh $target_dir/docs
cp $CPL $UIMACPP_SOURCE/docs/uimacpp.dox $target_dir/docs
cp $CPL $UIMACPP_SOURCE/docs/doxyheader.html $target_dir/docs
cp $CPL $UIMACPP_SOURCE/docs/overview_and_setup.html $target_dir/docs

print -u2 "copying from $UIMACPP_SOURCE/src"
cp $CPL $UIMACPP_SOURCE/src/base.mak $target_dir/src/
cp $CPL $UIMACPP_SOURCE/src/Makefile.in $target_dir/src/
cp $CPL $UIMACPP_SOURCE/src/Makefile.am $target_dir/src/

print -u2 "copying from $UIMACPP_SOURCE/src/cas"
cp $CPL $UIMACPP_SOURCE/src/cas/*.cpp $target_dir/src/cas/
cp $CPL $UIMACPP_SOURCE/src/cas/uima/*.hpp $target_dir/src/cas/uima/
cp $CPL $UIMACPP_SOURCE/src/cas/uima/*.inl $target_dir/src/cas/uima/

print -u2 "copying from $UIMACPP_SOURCE/src/framework"
cp $CPL $UIMACPP_SOURCE/src/framework/*.cpp $target_dir/src/framework/
cp $CPL $UIMACPP_SOURCE/src/framework/*.in $target_dir/src/framework/
cp $CPL $UIMACPP_SOURCE/src/framework/uima/*.hpp $target_dir/src/framework/uima/
cp $CPL $UIMACPP_SOURCE/src/framework/uima/*.h $target_dir/src/framework/uima/
cp $CPL $UIMACPP_SOURCE/src/framework/*.am $target_dir/src/framework/

print -u2 "copying from $UIMACPP_SOURCE/src/jni"
cp $CPL $UIMACPP_SOURCE/src/jni/*.cpp $target_dir/src/jni/
cp $CPL $UIMACPP_SOURCE/src/jni/uima/*.hpp $target_dir/src/jni/uima/
cp $CPL $UIMACPP_SOURCE/src/jni/uima/*.h $target_dir/src/jni/uima/

print -u2 "copying from $UIMACPP_SOURCE/src/utils"
cp $CPL $UIMACPP_SOURCE/src/utils/*.cpp $target_dir/src/utils/
cp $CPL $UIMACPP_SOURCE/src/utils/*.hpp $target_dir/src/utils/
cp $CPL $UIMACPP_SOURCE/src/utils/*.in $target_dir/src/utils/
cp $CPL $UIMACPP_SOURCE/src/utils/*.am $target_dir/src/utils/

print -u2 "copying from $UIMACPP_SOURCE/scriptators"
cp $CPLR $UIMACPP_SOURCE/scriptators $target_dir/

print -u2 "copying from $UIMACPP_SOURCE/examples"
cp $CPLR $UIMACPP_SOURCE/examples $target_dir/

print -u2 "copying from $UIMACPP_SOURCE/src/test"
cp $CPLR $UIMACPP_SOURCE/src/test/src $target_dir/src/test/
cp $CPLR $UIMACPP_SOURCE/src/test/data $target_dir/src/test/
cp $CPL $UIMACPP_SOURCE/src/test/Makefile.am $target_dir/src/test/
cp $CPL $UIMACPP_SOURCE/src/test/Makefile.in $target_dir/src/test/
cp $CPL $UIMACPP_SOURCE/src/test/fvt.sh $target_dir/src/test/
cp $CPL $UIMACPP_SOURCE/src/test/fvtTestfile $target_dir/src/test/
find $target_dir/src/test -type f -iname '*.l?' -exec rm -f {} \;
find $target_dir/src/test -type f -iname '*.o' -exec rm -f {} \;

print -u2 "copying files required for a Windows build"
cp $CPL $UIMACPP_SOURCE/buildsdk.cmd $target_dir
cp $CPL $UIMACPP_SOURCE/docs/builddocs.cmd $target_dir/docs
cp $CPL $UIMACPP_SOURCE/src/*.cmd $target_dir/src
cp $CPL $UIMACPP_SOURCE/examples/*.cmd $target_dir/examples
cp $CPL $UIMACPP_SOURCE/src/*.bat $target_dir/src
cp $CPL $UIMACPP_SOURCE/src/test/*.bat $target_dir/src/test
cp $CPL $UIMACPP_SOURCE/src/*.vcproj $target_dir/src
cp $CPL $UIMACPP_SOURCE/src/test/src/*.vcproj $target_dir/src/test/src
cp $CPL $UIMACPP_SOURCE/src/test/fvtTestfile.debug $target_dir/src/test
cp $CPL $UIMACPP_SOURCE/examples/src/*.vcproj $target_dir/examples/src
cp $CPL $UIMACPP_SOURCE/examples/tutorial/src/*.vcproj $target_dir/examples/tutorial\src
cp $CPL $UIMACPP_SOURCE/src/*.sln $target_dir/src
cp $CPL $UIMACPP_SOURCE/src/test/*.sln $target_dir/src/test
cp $CLP $UIMACPP_SOURCE/examples/src/*.sln $target_dir/examples/src


print -u2 "removing unused files from $UIMACPP_SOURCE"
find $target_dir -depth -type d -name .svn -exec rm -rf {} \;
#find $target_dir -type f -iname '*.sln' -exec rm -f {} \;
#find $target_dir -type f -iname '*.vcproj' -exec rm -f {} \;
#find $target_dir -type f -iname '*.cmd' -exec rm -f {} \;
#find $target_dir -type f -iname '*.bat' -exec rm -f {} \;
find $target_dir -type f -iname '*~' -exec rm -f {} \;

print -u2 "DONE ... Source image created in $target_dir"

exit 0
