#!/bin/sh
# $FreeBSD: ports/Tools/portbuild/scripts/buildenv,v 1.36 2010/12/16 07:38:18 linimon Exp $
#
# Set up the build variables which are used by a given build.  Some
#    of the code here is common to both clients and server; some is
#    particular to each.

# get the major branch number.  only used on server side.
get_branch_base() {
    strippedbranch=${1%%[-\.]*}
    branchbase=`echo $strippedbranch | grep ${SRC_BRANCHES_PATTERN}`
    echo ${branchbase}
}

# only used on server side
validate_env() {
    arch=$1
    branch=$2

    valid_arch=0
    for i in ${SUPPORTED_ARCHS}; do
	if [ ${i} = ${arch} ]; then
	    valid_arch=1
	    break
	fi
    done
    if [ $valid_arch = 0 ]; then
	echo "Invalid arch: ${arch}"
	return 1
    fi

    branchbase=$(get_branch_base ${branch})
    if [ -z "${branchbase}" ]; then
	echo "Invalid branch: ${branch}"
	return 1
    fi

    return 0
}

# only used on server side
resolve() {
    pb=$1
    arch=$2
    branch=$3
    buildid=$4

    # Resolve a possibly symlinked buildid (e.g. "latest") to the
    # underlying physical directory

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

    if [ ! -d ${builddir} ]; then
	return 1
    else
	builddir=$(realpath ${builddir})
    fi

    buildid=${builddir%/}
    buildid=${buildid##*/}
    echo ${buildid}
}

# derive the source tree metadata and export it.  common to both client and server.
export_src_metadata() {
    src_base=$1

    if [ -f ${src_base}/sys/sys/param.h ]; then
	export OSVERSION=$(awk '/^#define __FreeBSD_version/ {print $3}' < ${src_base}/sys/sys/param.h)
    else
	echo "export_src_metadata: couldn't find ${src_base}/sys/sys/param.h!"
    fi
    if [ -f ${src_base}/sys/conf/newvers.sh ]; then
	export OSREL=$(awk 'BEGIN {FS="\""}; /^REVISION/ {print $2}' < ${src_base}/sys/conf/newvers.sh)
	export BRANCH=$(awk 'BEGIN {FS="\""}; /^BRANCH/ {print $2}' < ${src_base}/sys/conf/newvers.sh)
    else
	echo "export_src_metadata: couldn't find ${src_base}/sys/conf/newvers.sh!"
    fi
}

#
# establish commonly-used environment variables (server-side)
#
buildenv () {
    pb=$1
    arch=$2
    branch=$3
    builddir=$4

    # set up things for INDEX/duds builds

    # first, don't pick up host OPTIONS
    export PORT_DBDIR=/nonexistent

    # Have to use realpath because 'make index' doesn't deal with
    # symlinks in PORTSDIR - kk 020311
    if [ -d ${builddir}/ports/ ]; then
	export PORTSDIR=$(realpath ${builddir}/ports)
    else
	export PORTSDIR=/nonexistent
    fi

    if [ -d ${builddir}/src/ ]; then
	export SRC_BASE=$(realpath ${builddir}/src)
    else
	export SRC_BASE=/nonexistent
    fi
    export_src_metadata ${SRC_BASE}

    # for archs that support COMPAT_IA32, set some flags for INDEX.
    # Client kernels should be built appropriately.
    for i in ${ARCHS_SUPPORTING_COMPAT_IA32}; do
	if [ ${i} = ${arch} ]; then
	    export HAVE_COMPAT_IA32_KERN="yes"
	    export HAVE_COMPAT_IA32_LIBS="yes"
	    break
	fi
    done
    for i in ${ARCHS_REQUIRING_LINPROCFS}; do
	if [ ${i} = ${arch} ]; then
	    export LINUX_OSRELEASE=${DEFAULT_LINUX_OSRELEASE}
	    break
	fi
    done

    buildenv.common

    # override things destined for bsd.port.mk
    export DISTDIR=${builddir}/distfiles
    export PACKAGES=${builddir}/packages

    branchbase=$(get_branch_base ${branch})
    if [ -z "${branchbase}" ]; then
	echo "buildenv: invalid branch ${branch}"
	exit 1
    else
	export INDEXFILE=INDEX-${branchbase}
    fi

    # probably only used in mkbindist
    export __MAKE_CONF=${pb}/${arch}/make.conf
}

#
# establish commonly-used environment variables (client-side)
#
buildenv.client() {
    # derive OSREL, OSVERSION, and BRANCH
    export_src_metadata $1

    # manually override results of uname(1)
    export UNAME_m=${ARCH}
    export UNAME_n=freebsd.org
    export UNAME_p=${ARCH}
    export UNAME_r=${OSREL}-${BRANCH}
    export UNAME_s=FreeBSD
    export UNAME_v="FreeBSD ${OSREL}-${BRANCH} #0: $(date)     portmgr@freebsd.org:/usr/src/sys/magic/kernel/path"
}

#
# establish commonly-used environment variables (common to clients and server)
#
buildenv.common() {
    export ARCH=${arch}
    export MACHINE_ARCH=${arch}

    export BATCH=1
    export PACKAGE_BUILDING=1
}
