#!/bin/sh

#
# XXX lockfile and interlock with mkbindist to avoid overlapping
# builds

pb=/var/portbuild

if [ $# -lt 3 ]; then
        echo "usage: makeworld arch branch buildid [args]"
        exit 1
fi

arch=$1
branch=$2
buildid=$3
shift 3

builddir=${pb}/${arch}/${branch}/builds/${buildid}

. ${pb}/${arch}/portbuild.conf
# NB: we can't use buildenv because it sets ARCH and MACHINE_ARCH that
# confuses cross-builds

export TARGET_ARCH=${arch}
# Workaround needed for zfs - 20090321 erwin
export NO_FSCHG=1

# experimental: uncomment these 4 to test with clang
#export WITH_CLANG=1
#export NO_WERROR=1
#export WERROR=1
#export WITH_CLANG_IS_CC=1

case "$branch" in
    6*)
	export SRCBRANCH="-r RELENG_6"
	;;
    7*)
	export SRCBRANCH="-r RELENG_7"
	;;
    8*)
	export SRCBRANCH="-r RELENG_8"
	;;
    9*)
    	export SRCBRANCH=
	;;
    *)
	echo "Invalid branch ${branch}"
	exit 1
	;;
esac

client=0
nocvs=0

# optional arguments
while [ $# -gt 0 ]; do
  case "$1" in
    -client)
      client=1
      ;;
    -nocvs)
      nocvs=1
      ;;
    *)
      args="$1 ${args}"
      ;;
  esac
  shift
done

if [ "$client" = "1" ]; then
	SRCBASE=${pb}/${arch}/src-client
	shift 1
else
	SRCBASE=${builddir}/src
	export __MAKE_CONF=/dev/null
fi
cd ${SRCBASE}

if [ "$nocvs" = "0" ]; then
	echo "==> Updating source tree"
	cvs -Rq update -PdA ${SRCBRANCH} || exit $?
fi

echo "==> Starting make buildworld"
make buildworld ${args} || exit $?

echo "==> Cleaning up destdir"
destdir=${worlddir}/${arch}/${branch}
rm -rf ${destdir}/
chflags -R noschg ${destdir}/
rm -rf ${destdir}/
mkdir -p ${destdir} || exit $?

echo "==> Starting make installworld"
if [ "$client" = "0" ]; then
	export NEWSPARC_TIMETYPE=__int64_t
	make installworld DESTDIR=${destdir} || exit $?

	echo "==> Starting make distribute"
	make DESTDIR=${destdir} distrib-dirs && \
	    make DESTDIR=${destdir} distribution || exit $?

else
	echo "==> Not doing installworld of client source tree"
fi
