#!/bin/sh

# OE Build Environment Setup Script
#
# Copyright (C) 2006-2011 Linux Foundation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#
# Normally this is called as '. ./oe-init-build-env-memres <portnumber> <builddir>'
#
# This works in most shells (not dash), but not all of them pass the arguments
# when being sourced.  To workaround the shell limitation use "set <portnumber>
# <builddir>" prior to sourcing this script.
#
if [ -z "$1" ]; then
    echo "No port specified, using dynamically selected port"
    port=-1
else
    port=$1
    shift
fi

if [ -n "$BASH_SOURCE" ]; then
    THIS_SCRIPT=$BASH_SOURCE
elif [ -n "$ZSH_NAME" ]; then
    THIS_SCRIPT=$0
else
    THIS_SCRIPT="$(pwd)/oe-init-build-env"
fi
if [ -n "$BBSERVER" ]; then
    unset BBSERVER
fi

if [ -z "$ZSH_NAME" ] && [ "$0" = "$THIS_SCRIPT" ]; then
    echo "Error: This script needs to be sourced. Please run as '. $THIS_SCRIPT'"
    exit 1
fi

if [ -z "$OEROOT" ]; then
    OEROOT=$(dirname "$THIS_SCRIPT")
    OEROOT=$(readlink -f "$OEROOT")
fi
unset THIS_SCRIPT

export OEROOT
. $OEROOT/scripts/oe-buildenv-internal &&
    TEMPLATECONF="$TEMPLATECONF" $OEROOT/scripts/oe-setup-builddir || {
    unset OEROOT
    return 1
}
unset OEROOT

[ -z "$BUILDDIR" ] || cd "$BUILDDIR"

res=1
if [ -e bitbake.lock ] && grep : bitbake.lock > /dev/null; then
    BBSERVER=$(cat bitbake.lock) bitbake --status-only
    res=$?
fi

if [ $res != 0 ]; then
    bitbake --server-only -t xmlrpc -B localhost:$port
fi

if [ $port = -1 ]; then
    export BBSERVER=localhost:-1
    echo "Bitbake server started on demand as needed, use bitbake -m to shut it down"
else
    export BBSERVER=$(cat bitbake.lock)

    if [ $res = 0 ]; then
        echo "Using existing bitbake server at: $BBSERVER, use bitbake -m to shut it down"
    else
        echo "Bitbake server started at: $BBSERVER, use bitbake -m to shut it down"
    fi
fi
unset port res
