#! /usr/bin/env bash

# Create ODB source distributions
#
# -rebuild
# -complete  package/build libcutl and the ODB compiler; implies -rebuild
# -test
# -odb
#
trap 'exit 1' ERR

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

wd=`pwd`
out_root=/tmp
src_root=$HOME/work/odb
ver=`cat $src_root/odb/version`

test=n
rebuild=n
complete=n
odb=$src_root/odb/odb/odb

CXXFLAGS="-W -Wall -Wno-unknown-pragmas"

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

# Clean everything up if we are rebuilding.
#
if [ $rebuild = y ]; then
  rm -rf $out_root/libodb/*
  rm -rf $out_root/libodb-mysql/*
  rm -rf $out_root/libodb-tracer/*
  rm -rf $out_root/libodb-boost/*
  rm -rf $out_root/odb-tests/*
  rm -rf $out_root/odb-examples/*

  if [ $complete = y ]; then
    rm -rf $out_root/libcutl/*
    rm -rf $out_root/odb/*
  fi

  rm -rf $out_root/pack
fi

mkdir -p $out_root/libodb
mkdir -p $out_root/libodb-mysql
mkdir -p $out_root/libodb-tracer
mkdir -p $out_root/libodb-boost
mkdir -p $out_root/odb-tests
mkdir -p $out_root/odb-examples

if [ $complete = y ]; then
  mkdir -p $out_root/libcutl
  mkdir -p $out_root/odb
fi

mkdir -p $out_root/pack

# Build libcutl
#
if [ $complete = y ]; then
  cd $src_root/../cutl
  ./dist.sh $out_root/libcutl
  cd $wd
fi

# Build ODB compiler
#
if [ $complete = y ]; then
  make -C $src_root/odb dist dist_prefix=$out_root/odb

  cd $out_root/odb

  ./bootstrap
  ./configure --with-libcutl=../libcutl CXX=g++-4.5 CXXFLAGS="$CXXFLAGS"

  make -j 8
  make dist

  cd $wd

  cp $out_root/odb/odb-$ver.zip $out_root/pack/
  cp $out_root/odb/odb-$ver.tar.gz $out_root/pack/
  cp $out_root/odb/odb-$ver.tar.bz2 $out_root/pack/

  odb=$out_root/odb/odb/odb
fi

# Build libodb
#
make -C $src_root/libodb dist dist_prefix=$out_root/libodb

cd $out_root/libodb

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure CXXFLAGS="$CXXFLAGS"
fi

make -j 8
make dist

cd $wd

cp $out_root/libodb/libodb-$ver.zip $out_root/pack/
cp $out_root/libodb/libodb-$ver.tar.gz $out_root/pack/
cp $out_root/libodb/libodb-$ver.tar.bz2 $out_root/pack/


# Build libodb-mysql
#
make -C $src_root/libodb-mysql dist dist_prefix=$out_root/libodb-mysql

cd $out_root/libodb-mysql

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure --with-libodb=../libodb CXXFLAGS="$CXXFLAGS"
fi

make -j 8
make dist

cd $wd

cp $out_root/libodb-mysql/libodb-mysql-$ver.zip $out_root/pack/
cp $out_root/libodb-mysql/libodb-mysql-$ver.tar.gz $out_root/pack/
cp $out_root/libodb-mysql/libodb-mysql-$ver.tar.bz2 $out_root/pack/

# Build libodb-tracer
#
make -C $src_root/libodb-tracer dist dist_prefix=$out_root/libodb-tracer

cd $out_root/libodb-tracer

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure --with-libodb=../libodb CXXFLAGS="$CXXFLAGS"
fi

make -j 8
make dist

cd $wd

cp $out_root/libodb-tracer/libodb-tracer-$ver.zip $out_root/pack/
cp $out_root/libodb-tracer/libodb-tracer-$ver.tar.gz $out_root/pack/
cp $out_root/libodb-tracer/libodb-tracer-$ver.tar.bz2 $out_root/pack/

# Build libodb-boost
#
make -C $src_root/libodb-boost dist dist_prefix=$out_root/libodb-boost

cd $out_root/libodb-boost

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure --with-libodb=../libodb CXXFLAGS="$CXXFLAGS"
fi

make -j 8
make dist

cd $wd

cp $out_root/libodb-boost/libodb-boost-$ver.zip $out_root/pack/
cp $out_root/libodb-boost/libodb-boost-$ver.tar.gz $out_root/pack/
cp $out_root/libodb-boost/libodb-boost-$ver.tar.bz2 $out_root/pack/

# Build odb-tests
#
make -C $src_root/tests dist dist_prefix=$out_root/odb-tests

cd $out_root/odb-tests

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure \
--with-database=mysql \
--with-libodb=../libodb \
--with-libodb-tracer=../libodb-tracer \
--with-libodb-mysql=../libodb-mysql \
--with-libodb-boost=../libodb-boost \
CXXFLAGS="$CXXFLAGS" \
ODB=$odb
fi

if [ $test = y ]; then
  make -j 8 check
fi

make dist

cd $wd

cp $out_root/odb-tests/odb-tests-$ver.zip $out_root/pack/
cp $out_root/odb-tests/odb-tests-$ver.tar.gz $out_root/pack/
cp $out_root/odb-tests/odb-tests-$ver.tar.bz2 $out_root/pack/

# Build odb-examples
#
make -C $src_root/examples dist dist_prefix=$out_root/odb-examples

cd $out_root/odb-examples

if [ $rebuild = y ]; then
  ./bootstrap
  ./configure \
--with-database=mysql \
--with-libodb=../libodb \
--with-libodb-mysql=../libodb-mysql \
--with-libodb-boost=../libodb-boost \
CXXFLAGS="$CXXFLAGS" \
ODB=$odb
fi

if [ $test = y ]; then
  make -j 8 check
fi

make dist

cd $wd

cp $out_root/odb-examples/odb-examples-$ver.zip $out_root/pack/
cp $out_root/odb-examples/odb-examples-$ver.tar.gz $out_root/pack/
cp $out_root/odb-examples/odb-examples-$ver.tar.bz2 $out_root/pack/