#! /usr/bin/env bash

# Build and install ODB on a UNIX environment using all the default
# settings. Things are installed into /usr/local as they are being
# built.
#
# -rebuild
# -test
# -uninstall
# -db <database>
# -j <jobs>
# -cxx <c++-compiler>
# -cxxp <g++-plugin-compiler>
# -<db>-options <options>
# -<db>-test-options <options>
#
trap 'exit 1' ERR

function error ()
{
  echo "$*" 1>&2
}

# $1 path
# $2 version
#
function unpack ()
{
  bzip2 -dc $1-$2.tar.bz2 | tar xf -
  mv `basename $1`-$2 `basename $1`
}

# $1 module
#
function uninstall ()
{
  if [ -f $1/Makefile ]; then
    sudo make -C $1 uninstall
  fi
}

rebuild=n
test=n
uninstall=n
db=
jobs=1
cxx=g++
cxxp=g++

mysql_options=
mysql_test_options=
sqlite_options=
sqlite_test_options=
pgsql_options=
pgsql_test_option=
oracle_options=
oracle_test_options=
mssql_options=
mssql_test_options=

while [ $# -gt 0 ]; do
  case $1 in
    -rebuild)
      rebuild=y
      shift
      ;;
    -test)
      test=y
      shift
      ;;
    -uninstall)
      uninstall=y
      shift
      ;;
    -db)
      shift
      db="$db $1"
      shift
      ;;
    -j)
      shift
      jobs=$1
      shift
      ;;
    -cxx)
      shift
      cxx=$1
      shift
      ;;
    -cxxp)
      shift
      cxxp=$1
      shift
      ;;
    -mysql-options)
      shift
      mysql_options=$1
      shift
      ;;
    -mysql-test-options)
      shift
      mysql_test_options=$1
      shift
      ;;
    -sqlite-options)
      shift
      sqlite_options=$1
      shift
      ;;
    -sqlite-test-options)
      shift
      sqlite_test_options=$1
      shift
      ;;
    -pgsql-options)
      shift
      pgsql_options=$1
      shift
      ;;
    -pgsql-test-options)
      shift
      pgsql_test_options=$1
      shift
      ;;
    -oracle-options)
      shift
      oracle_options=$1
      shift
      ;;
    -oracle-test-options)
      shift
      oracle_test_options=$1
      shift
      ;;
    -mssql-options)
      shift
      mssql_options=$1
      shift
      ;;
    -mssql-test-options)
      shift
      mssql_test_options=$1
      shift
      ;;
    *)
      error "unknown option: $1"
      exit 1
      ;;
  esac
done

if [ "$db" = "" ]; then
  db="oracle pgsql sqlite mysql"

  if [ "`uname`" = "Linux" ]; then
    db="mssql $db"
  fi
fi

src=/tmp/pack

v=`echo $src/libodb-?.*.tar.bz2 | sed -e "s%$src/libodb-\(.*\).tar.bz2%\1%"`
cutl_v=`echo $src/../libcutl-?.*.tar.bz2 | sed -e "s%$src/\.\./libcutl-\(.*\).tar.bz2%\1%"`

install_packs="libodb libodb-mssql libodb-oracle libodb-pgsql libodb-sqlite \
libodb-mysql libodb-boost libodb-qt odb"

packs=$install_packs

if [ $test = y ]; then
  packs="$packs odb-tests odb-examples"
fi

# Uninstall if requested.
#
if [ $uninstall = y ]; then

  uninstall libcutl

  for p in $install_packs; do
    uninstall $p
  done

  exit 0
fi

# Clean everything up and unpack if we are rebuilding.
#
if [ $rebuild = y ]; then

  rm -rf libcutl
  rm -rf $packs
  for d in $db; do
    rm -rf odb-tests-$d
    rm -rf odb-examples-$d
  done

  unpack $src/../libcutl $cutl_v

  for p in $packs; do
    unpack $src/$p $v
  done
fi

# Build libcutl.
#
cd libcutl

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CXX=$cxxp
fi

make -j $jobs
sudo make install
sudo ldconfig
cd ..

# Build ODB compiler.
#
cd odb

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CXX=$cxxp --libexecdir=/usr/local/lib
fi

make -j $jobs
sudo make install
cd ..

# Build libodb.
#
cd libodb

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CXX=$cxx
fi

make -j $jobs
sudo make install
sudo ldconfig
cd ..

# Build libodb-<db>.
#
for d in $db; do
  cd libodb-$d

  if [ $rebuild = y -o ! -f Makefile ]; then
    optvar=${d}_options
    ./configure ${!optvar} CXX=$cxx
  fi

  make -j $jobs
  sudo make install
  sudo ldconfig
  cd ..
done

# Build libodb-boost.
#
cd libodb-boost

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CXX=$cxx
fi

make -j $jobs
sudo make install
sudo ldconfig
cd ..

# Build libodb-qt.
#
cd libodb-qt

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CXX=$cxx
fi

make -j $jobs
sudo make install
sudo ldconfig
cd ..

if [ $test = n ]; then
  exit 0
fi

# Build odb-tests.
#
for d in $db; do
  mkdir -p odb-tests-$d
  cd odb-tests-$d

  if [ $rebuild = y -o ! -f Makefile ]; then
    optvar=${d}_test_options
    ../odb-tests/configure --with-database=$d ${!optvar} CXX=$cxx DIFFFLAGS=-ubB
  fi

  make -j $jobs
  make check
  cd ..
done

# Build odb-examples.
#
for d in $db; do
  mkdir -p odb-examples-$d
  cd odb-examples-$d

  if [ $rebuild = y -o ! -f Makefile ]; then
    optvar=${d}_test_options
    ../odb-examples/configure ${!optvar} --with-database=$d CXX=$cxx
  fi

  make -j $jobs
  make check
  cd ..
done