#!/bin/sh
#
# Copyright (c) 2018, YADRO
# Author: Alexander Amelkin <a.amelkin@yadro.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
if [ -z "$ZSH_NAME" ] && [ "$(basename -- "$0")" = "setup" ]; then
	echo The script must be sourced, not executed
	exit 1
fi

# Check if 'column' command is present
COLUMN=$(which column || true)
if [ -z "$COLUMN" ]; then
    # If it is not, use 'cat'
    COLUMN=$(which cat)
fi

machine() {
	local target=$1
	local build_dir=$2
	local cfg name tmpl
	local configs

	# zsh requires wordsplit so that variable expansion behaves like bash
	if [ -n "$ZSH_NAME" ]; then
		setopt local_options shwordsplit
	fi
	if which find > /dev/null 2>&1; then
		configs=$(find meta-* -path "*/conf/machine/*.conf")
	else
		configs=$(ls -1 meta-*/meta-*/conf/machine/*.conf meta-*/conf/machine/*.conf)
	fi

	for cfg in $configs; do
		name=${cfg##*/}
		name=${name%.conf}
		tmpl=${cfg%/machine/*.conf}

        # Skip any machines that don't support meta-phosphor.
        if [ ! -e $tmpl/bblayers.conf.sample ]; then
            continue
        fi
        if ! grep -q "##OEROOT##/meta-phosphor" $tmpl/bblayers.conf.sample; then
            continue
        fi

		# If a target is specified, then check for a match,
		# otherwise just list what we've discovered
		if [ -n "$target" ]; then
			if [ "${name}" = "${target}" ]; then
				echo "Machine ${target} found in ${tmpl%/conf}"
				mkdir -p ${build_dir}
				TEMPLATECONF="${tmpl}" source \
						oe-init-build-env ${build_dir}

				if [ "$(cat conf/templateconf.cfg)" = "${tmpl}" ]; then
					sed "s/^\(MACHINE\s*[?:]*\s*=\s*\).*$/\1\"${target}\"/" \
						-i conf/local.conf
				fi
				return
			fi
        else
			echo "${name}"
		fi
	done

	[ -n "$target" ] && echo "No such machine!"
}

if [ -z "$1" ]; then
	echo Target machine must be specified. Use one of:
	echo
	(echo qemuarm; machine) | sort | $COLUMN
elif [ "$1" = "qemuarm" ]; then
	source openbmc-env
else
	bld_dir=$2
	if [ -z "$2" ]; then
		bld_dir="build/$1"
	fi
	machine $1 $bld_dir
fi

