#! /bin/bash

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

######################################################################
# Download and build a new Corinthia on linux, assuming that you
# already have all the supporting libraries installed and your git set
# up with your comitter id.
# 
# The script also makes a TAG and/or a ctags file if it finds the
# emacs or vi init files in your home directory.
#
# Usage: build-corinthia <name of directory>

readonly TARGET_DIR=($1)

if [[ ${TARGET_DIR} == 'help' ||
            ${TARGET_DIR} == '--help' || 
            ${TARGET_DIR} == '-h' ]]; then
    echo ''
    echo ' Download and build a new Corinthia on linux, assuming that you'
    echo ' already have all the supporting libraries installed and your git set'
    echo ' up with your comitter id.'
    echo ''
    echo ' The script also makes a TAG and/or a ctags file if it finds the'
    echo ' emacs or vi init files in your home directory.'
    echo ''
    echo ' Usage: build-corinthia <name of new directory>'
    echo ''
    exit
fi

if [[ -z ${TARGET_DIR} ]]; then
    echo 'Usage: build-corinthia <name of new directory>';
    exit;
fi
if [[ -d ${TARGET_DIR} ]]; then
    echo "The directory \"$TARGET_DIR\" already exists.";
    exit;
fi

mkdir ${TARGET_DIR}
cd ${TARGET_DIR}

git clone https://git-wip-us.apache.org/repos/asf/incubator-corinthia.git 

if [[ ! -d 'incubator-corinthia' ]]; then
    echo "build-corinthia: git clone failed."
    cd ..
    rmdir ${TARGET_DIR}
    exit
fi

cd "incubator-corinthia"
readonly CORINTHIA_CURRENT=$(pwd)

# make a fresh TAGS FILE for emacs and/or vi (some people use both!)
if [[ -e "$HOME/.emacs" ]]; then
    find . -name "*.[ch]" -print0 | xargs -0 etags -
fi
if [[ -e "$HOME/.vimrc" || -e "$HOME/.gvimrc" ]]; then
    find . -name "*.[ch]" -print0 | xargs -0 ctags -
fi

# Build outside of the source tree in a build directory
mkdir "build"
cd "build"
cmake -G "Unix Makefiles" ${CORINTHIA_CURRENT}
make

# Report results
echo "Corinthia build complete in $CORINTHIA_CURRENT"
if [[ -e "../TAGS" ]]; then
    echo "TAGS file for Emacs built."
fi
if [[ -e "../tags" ]]; then
    echo "tags file for vi built."
fi
echo "Environment variable suggestion: "
echo "   set DOCFORMATS_DIR=${CORINTHIA_CURRENT}"
echo "   cmake -G \"Unix Makefiles\" \$DOCFORMATS_DIR"
