#!/usr/bin/env bash

libs="unix.cmxa"
OCAMLOPT="ocamlopt -g"
# use faster ocamlopt, if available
OCAMLOPT_OPT=`which ocamlopt.opt`
if [[ $OCAMLOPT_OPT != "" ]] ; then
    OCAMLOPT="ocamlopt.opt -g"
fi
OCAMLVER=`$OCAMLOPT -vnum`
echo $OCAMLVER

rm -f ext/compat.ml
if [[ $OCAMLVER < "4.02.0" ]] ; then
    echo "Using compat401.ml"
    cp -f compat401.ml ext/compat.ml
else
    echo "Using compat402.ml"
    cp -f compat402.ml ext/compat.ml
fi

extmodules="compat fugue filepath filesystem"
libmodules="types gconf filetype dag libname pp expr utils modname taskdep helper dagutils process findlibConf scheduler prog dependencies generators hier meta metacache target dist project analyze configure prepare buildprogs build exception"
mainmodules="sdist doc init help install path_generated main"

set -e

########################################################################
########################################################################
########################################################################
# build ext
cd ext
rm -f *.cmi *.cmx *.o
APPEND=""
for mod in $extmodules
do
	echo "COMPILING $mod"
	[ -f ${mod}.mli ] && $OCAMLOPT -for-pack Ext -c ${mod}.mli
	$OCAMLOPT -for-pack Ext -c ${mod}.ml
	APPEND+="ext/${mod}.cmx "
done;
cd ..

echo "BUILDING library obuild_ext.cmxa"
$OCAMLOPT -pack -o ext.cmx -I ext/ $APPEND
$OCAMLOPT -a -o obuild_ext.cmxa ext.cmx

########################################################################
########################################################################
########################################################################
# build the library
cd obuild
rm -f *.cmi *.cmx *.o

APPEND=""
for mod in $libmodules
do
	echo "COMPILING $mod"
	[ -f ${mod}.mli ] && $OCAMLOPT -for-pack Obuild -I ../ -c ${mod}.mli
	$OCAMLOPT -for-pack Obuild -I ../ -c ${mod}.ml
	APPEND+="obuild/${mod}.cmx "
done;
cd ..
echo "BUILDING library obuild.cmxa"
$OCAMLOPT -pack -o obuild.cmx -I ext/ $APPEND
$OCAMLOPT -a -o obuild.cmxa obuild.cmx

# then bootstrap the main executable
# main needs the version number

cat <<EOF > src/path_generated.ml

(* autogenerated file by bootstrap. do not modify *)

let project_version = "0.0.0"

EOF
cd src
APPEND=""
for mod in $mainmodules
do
	echo "COMPILING $mod"
	[ -f ${mod}.mli ] && $OCAMLOPT -I ../ -c ${mod}.mli
	$OCAMLOPT -I ../ -c ${mod}.ml
	APPEND+="${mod}.cmx "
done
echo "LINKING obuild.bootstrap"
$OCAMLOPT -o ../obuild.bootstrap -I ../ ${libs} obuild_ext.cmxa obuild.cmxa $APPEND
cd ..

rm -f obuild/*.cmi obuild/*.cmx obuild/*.o
rm -f src/*.cmi src/*.cmx src/*.o
rm -f *.cmi *.o *a *.cmx *.cmxa
rm -f src/path_generated.ml

########################################################################
########################################################################
########################################################################

# rebuild everything with the bootstraped version
export OCAMLRUNPARAM=b
./obuild.bootstrap clean
./obuild.bootstrap configure
time ./obuild.bootstrap build
if [ -x dist/build/obuild/obuild ]; then
	rm obuild.bootstrap
fi
