#!/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_CMD=$(which column || true)
if [ -z "$COLUMN_CMD" ]; then
    # If it is not, use 'cat'
    COLUMN=( "$(which cat)" )
else
    EXPAND_CMD=$(which expand || true)
    if [ -n "$EXPAND_CMD" ]; then
        COLUMN=( "sh" "-c" "$COLUMN_CMD | $EXPAND_CMD" )
    else
        COLUMN=( "$COLUMN_CMD" )
    fi
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
    # Add qemu machines.
    configs="$configs $(ls -1 poky/meta/conf/machine/qemu*.conf)"

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

        if [ "$tmpl" = "poky/meta/conf" ]; then
            # This is a QEMU machine, use phosphor defaults.
            tmpl="meta-phosphor/conf"
        else
            # 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
        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
	machine | sort | sed "s/qemu[^[:space:]]*//" | "${COLUMN[@]}"
else
    bld_dir=$2
    if [ -z "$2" ]; then
        bld_dir="build/$1"
    fi
    machine "$1" "$bld_dir"
fi

