#!/bin/bash
#
# 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!" >&2 && return 1
}

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

