#!/bin/sh -f 

platform=`uname`

uname_s=`uname -s`
uname_m=`uname -m`
platform_nemo="${uname_s}-${uname_m}"

# Customize the below xxx_home to reach used packages :
osc_home="/Users/barrand/OpenScientist/v16r0"
bhep_home="/Users/barrand/dev/exp/nemo/bhep/v1r4p1/${platform}"
HDF5_home=/usr/local/HDF5/1.6.5
CLHEP_home=/usr/local/CLHEP/2.0.3.1
G4_home=/geant4/geant4.8.2
GeomUtils_home="/Users/barrand/dev/exp/nemo/SNgeom/v0r1p0/build_area/GeomUtils"
SNgeom2_home="/Users/barrand/dev/exp/nemo/SNgeom/v0r1p0/build_area/SNgeom2"
snova_home="/Users/barrand/dev/exp/nemo/SNgeom/v0r1p0/build_area/snova"

. ${osc_home}/aida-setup.sh

if test "`onx-config --version`" = "" ; then
  echo "onx-config not available."
  exit
fi

if test "`aida-config --version`" = "" ; then
  echo "aida-config not available."
  exit
fi

if test "`g4lab-config --version`" = "" ; then
  echo "g4lab-config not available."
  exit
fi

#args=$*
obuild_set_x=no

do_snova=yes
do_snovis=yes
do_prog_snova=yes
do_snovis_session=yes

while test $# -ge 1 ; do
  case $1 in
    -h) 
        echo "Usage :"
        echo "  UNIX> ./build [Options] [Target]"
        echo "Options :"
        echo "  -x : execute with set -x."
        echo "Target :"
        echo "  If no option is specify and a ending"
        echo " string is given ; this string is given"
        echo " to a find command of the form :"
        echo '    find ./sh -name "*target*" -exec {} \;'
        echo " in order to execute selected scripts under"
        echo " the sh directory."
        echo "Examples :"
        echo "  UNIX> sh/build app"
        echo "  UNIX> sh/build -v _lib"
        echo "  UNIX> sh/build -v -g dll_"
        echo ""
        exit ;;
    -x) obuild_set_x=yes;obuild_args="${obuild_args} $1" ;;
    -*) echo "unknwon option : $1" ; exit ;;
     *) if [ $# = 1 ] ; then
          if [ $1 = all ] ; then
            do_snova=yes
            do_snovis=yes
            do_prog_snova=yes
            do_snovis_session=yes
          elif [ $1 = snova ] ; then
            do_snova=yes
            do_snovis=no
            do_prog_snova=no
            do_snovis_session=no
          elif [ $1 = snovis ] ; then
            do_snovis=yes
            do_snova=no
            do_prog_snova=no
            do_snovis_session=no
          elif [ $1 = prog_snova ] ; then
            do_prog_snova=yes
            do_snova=no
            do_snovis=no
            do_snovis_session=no
          elif [ $1 = sess ] ; then
            do_snovis_session=yes
            do_snova=no
            do_snovis=no
            do_prog_snova=no
          fi
        else         
          echo "unknwon option : $1"
          exit
        fi
        ;;
  esac
  shift
done

if [ ${obuild_set_x} = yes ] ; then
  set -x
fi

compiler=c++

bin="../${platform}"
/bin/mkdir -p ${bin}

# snova library :
if [ ${do_snova} = yes ] ; then

snova_source="${snova_home}"

cppflags=""
#cppflags="${cppflags} -g -Wall"
cppflags="${cppflags} -I${HDF5_home}/include -I${CLHEP_home}/include -I${bhep_home}/include -I${G4_home}/include"
cppflags="${cppflags} -I${GeomUtils_home}/include"
cppflags="${cppflags} -I${SNgeom2_home}/include"
cppflags="${cppflags} -I${snova_home}"

eval ${compiler} -c ${cppflags} -o ${bin}/snova_const.o ${snova_source}/base/snova_const.cc
eval ${compiler} -c ${cppflags} -o ${bin}/event.o ${snova_source}/base/event.cc
eval ${compiler} -c ${cppflags} -o ${bin}/generator.o ${snova_source}/base/generator.cc
eval ${compiler} -c ${cppflags} -o ${bin}/run.o ${snova_source}/base/run.cc
eval ${compiler} -c ${cppflags} -o ${bin}/stepping.o ${snova_source}/base/stepping.cc
eval ${compiler} -c ${cppflags} -o ${bin}/stepping_verbose.o ${snova_source}/base/stepping_verbose.cc
eval ${compiler} -c ${cppflags} -o ${bin}/tracking.o ${snova_source}/base/tracking.cc
eval ${compiler} -c ${cppflags} -o ${bin}/stacking.o ${snova_source}/base/stacking.cc
eval ${compiler} -c ${cppflags} -o ${bin}/gen_vtx.o ${snova_source}/vertex/gen_vtx.cc
eval ${compiler} -c ${cppflags} -o ${bin}/visibilities2.o ${snova_source}/geom/visibilities2.cc
eval ${compiler} -c ${cppflags} -o ${bin}/nemo_field2.o ${snova_source}/geom/nemo_field2.cc
eval ${compiler} -c ${cppflags} -o ${bin}/materials.o ${snova_source}/geom/materials.cc
eval ${compiler} -c ${cppflags} -o ${bin}/geometry2.o ${snova_source}/geom/geometry2.cc
eval ${compiler} -c ${cppflags} -o ${bin}/physics.o ${snova_source}/physics/physics.cc

objs="${bin}/snova_const.o ${bin}/event.o ${bin}/generator.o ${bin}/run.o ${bin}/stacking.o ${bin}/stepping.o ${bin}/stepping_verbose.o ${bin}/tracking.o ${bin}/geometry2.o ${bin}/materials.o ${bin}/nemo_field2.o ${bin}/visibilities2.o ${bin}/physics.o ${bin}/gen_vtx.o"

#/bin/rm -f ${bin}/libsnova.a
#ar cr ${bin}/libsnova.a ${objs}

if test `uname` = "Darwin" ; then
/bin/rm -f ${bin}/libsnova.dylib
eval c++ -dynamiclib -twolevel_namespace -undefined dynamic_lookup -dynamic -single_module -o ${bin}/libsnova.dylib ${objs}
fi

if test `uname` = "Linux" ; then
/bin/rm -f ${bin}/libsnova.so
eval g++ -shared -o ${bin}/libsnova.dylib ${objs}
fi

fi

# snovis dll :
if [ ${do_snovis} = yes ] ; then

cppflags="-I.."
cppflags="${cppflags} `g4lab-config --cppflags`"
cppflags="${cppflags} `onx-config --iv_cppflags`"
cppflags="${cppflags} `aida-config --cppflags`"

eval ${compiler} -c ${cppflags} -o ${bin}/Callbacks.o ../source/Callbacks.cxx
eval ${compiler} -c ${cppflags} -o ${bin}/InventorCallbacks.o ../source/InventorCallbacks.cxx
eval ${compiler} -c ${cppflags} -o ${bin}/Layouts.o ../source/Layouts.cxx

objs="${bin}/Callbacks.o ${bin}/InventorCallbacks.o ${bin}/Layouts.o"

libs=""
libs="${libs} `g4lab-config --libs`"
libs="${libs} `onx-config --iv_libs`"

if test `uname` = "Darwin" ; then
/bin/rm -f ${bin}/snovis.bundle
eval c++ -bundle -twolevel_namespace -Wl,-headerpad_max_install_names -Wl,-headerpad,800 -o ${bin}/snovis.bundle ${objs} ${libs}
fi

if test `uname` = "Linux" ; then
/bin/rm -f ${bin}/libsnovis.so
eval g++ -shared -o ${bin}/libsnovis.so ${objs} ${libs}
fi

fi

# prog_snova application :
if [ ${do_prog_snova} = yes ] ; then

cppflags=""
#cppflags="${cppflags} -g"
cppflags="${cppflags} -I${snova_home}"
cppflags="${cppflags} -I${SNgeom2_home}/include"
cppflags="${cppflags} -I${GeomUtils_home}/include"
cppflags="${cppflags} -I${bhep_home}/include"
cppflags="${cppflags} -I${G4_home}/include"
cppflags="${cppflags} -I${HDF5_home}/include"
cppflags="${cppflags} -I${CLHEP_home}/include"

libs="-L${bin} -lsnova"
libs="${libs} -L${SNgeom2_home}/${platform_nemo}/lib -lsngeom"
libs="${libs} -L${GeomUtils_home}/${platform_nemo}/lib -lgeomutils"
libs="${libs} -L${bhep_home}/lib -lbhep"
libs="${libs} -L${G4_home}/Darwin/lib/Darwin-g++ -lG4interfaces -lG4physicslists -lG4readout -lG4run -lG4event -lG4tracking -lG4processes -lG4digits_hits -lG4track -lG4particles -lG4geometry -lG4graphics_reps -lG4materials -lG4intercoms -lG4global"
libs="${libs} -L${CLHEP_home}/lib -lCLHEP"
libs="${libs} -L${HDF5_home}/lib -lhdf5"
libs="${libs} -lz"
#echo ${libs}

opts=
#opts="${opts} -g"
#if test `uname` = "Darwin" ; then
#opts="${opts} -bind_at_load -multiply_defined suppress"
#fi

/bin/rm -f ${bin}prog_snova
eval ${compiler} -c ${cppflags} -o ${bin}/prog_snova.o ../applications/prog_snova.cc
eval ${compiler} ${opts} -o ${bin}/prog_snova ${bin}/prog_snova.o ${libs}

fi

# snovis_session application :
if [ ${do_snovis_session} = yes ] ; then

cppflags=""
#cppflags="${cppflags} -g"
cppflags="${cppflags} -I${snova_home}"
cppflags="${cppflags} -I${SNgeom2_home}/include"
cppflags="${cppflags} -I${GeomUtils_home}/include"
cppflags="${cppflags} -I${bhep_home}/include"
cppflags="${cppflags} -I${HDF5_home}/include"
cppflags="${cppflags} `g4lab-config --cppflags`"
cppflags="${cppflags} `aida-config --cppflags`"

libs="-L${bin} -lsnova"
libs="${libs} -L${SNgeom2_home}/${platform_nemo}/lib -lsngeom"
libs="${libs} -L${GeomUtils_home}/${platform_nemo}/lib -lgeomutils"
libs="${libs} -L${bhep_home}/lib -lbhep"
libs="${libs} `g4lab-config --libs`"
libs="${libs} `onx-config --iv_libs`"
#libs="${libs} -L${CLHEP_home}/lib -lCLHEP"
libs="${libs} -L${HDF5_home}/lib -lhdf5"
libs="${libs} -lz"
#echo ${libs}

opts=
#opts="${opts} -g"
if test `uname` = "Darwin" ; then
opts="${opts} -bind_at_load -multiply_defined suppress"
fi

eval ${compiler} -c ${cppflags} -o ${bin}/snovis_session.o ../applications/snovis_session.cc
/bin/rm -f ${bin}snovis_session
eval ${compiler} ${opts} -o ${bin}/snovis_session ${bin}/snovis_session.o ${libs}

fi

find ${bin} -name '*.o' -exec /bin/rm {} \;

