#! /usr/bin/env bash

# Build ODB for MinGW
#
# -rebuild
# -test
# -db <database>
#
trap 'exit 1' ERR

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

function clean ()
{
  if [ -f $1/Makefile ]; then
    make -C $1 distclean
  fi
}

ROOT=/c/projects
MYSQL=$ROOT/mysql-mingw32
SQLITE=$ROOT/sqlite-mingw32
PGSQL=$ROOT/pgsql-mingw32
ORACLE=$ROOT/oracle-mingw32
BOOST=$ROOT/boost-mingw32
QTCORE=$ROOT/qtcore-mingw32

CPPFLAGS="-I$BOOST -I$QTCORE/include -I$QTCORE/include/QtCore -I$ORACLE/sdk/include -I$PGSQL/include -I$SQLITE -I$MYSQL/include"
LDFLAGS="-L$BOOST/stage/lib -L$QTCORE/lib -L$ORACLE/sdk/lib -L$PGSQL/lib -L$SQLITE -L$MYSQL/lib -Wl,--enable-auto-import"
PATH="$QTCORE/bin:$ORACLE:$PATH"

mysql_options="--with-mysql-host=192.168.0.2 --with-mysql-client=$MYSQL/bin/mysql.exe"
sqlite_options="--with-sqlite-db=c:\\projects\\odb\\odb_test.db"
pgsql_options="--with-pgsql-host=192.168.0.2 --with-pgsql-client=$PGSQL/bin/psql.exe"
oracle_options="--with-oracle-host=192.168.0.2 --with-oracle-service=xe --with-oracle-client=$ORACLE/sqlplus.exe"
mssql_options="--with-mssql-server=windows2008r2\\ss2008r2,1435"

test=n
rebuild=n
db=

while [ $# -gt 0 ]; do
  case $1 in
    -rebuild)
      rebuild=y
      shift
      ;;
    -test)
      test=y
      shift
      ;;
    -db)
      shift
      db="$db $1"
      shift
      ;;
    *)
      error "unknown option: $1"
      exit 1
      ;;
  esac
done

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

# Clean everything up if we are rebuilding.
#
if [ $rebuild = y ]; then
  clean libodb
  clean libodb-mssql
  clean libodb-oracle
  clean libodb-pgsql
  clean libodb-sqlite
  clean libodb-mysql
  clean libodb-boost
  clean libodb-qt

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

# Build libodb
#
cd libodb

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS"
fi

make
cd ..

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

  if [ $rebuild = y -o ! -f Makefile ]; then
    ./configure --with-libodb=../libodb CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS"
  fi

  make
  cd ..
done

# Build libodb-boost
#
cd libodb-boost

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure --with-libodb=../libodb CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS"
fi

make
cd ..

# Build libodb-qt
#
cd libodb-qt

if [ $rebuild = y -o ! -f Makefile ]; then
  ./configure --with-libodb=../libodb CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS"
fi

make
cd ..

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

  optvar=${d}_options

  if [ $rebuild = y -o ! -f Makefile ]; then
    ../odb-tests/configure \
--with-database=$d \
--with-libodb=../libodb \
--with-libodb-$d=../libodb-$d \
--with-libodb-boost=../libodb-boost \
--with-libodb-qt=../libodb-qt \
${!optvar} \
CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS" DIFFFLAGS=-ubB
  fi

  make
  if [ $test = y ]; then
    make check
  fi
  cd ..
done

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

  optvar=${d}_options

  if [ $rebuild = y -o ! -f Makefile ]; then
    ../odb-examples/configure \
--with-database=$d \
--with-libodb=../libodb \
--with-libodb-$d=../libodb-$d \
--with-libodb-boost=../libodb-boost \
--with-libodb-qt=../libodb-qt \
${!optvar} \
CPPFLAGS="$CPPFLAGS" LDFLAGS="$LDFLAGS" DIFFFLAGS=-ubB
  fi

  make
  if [ $test = y ]; then
    make check
  fi
  cd ..
done