#!/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.
#

# 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}
        vendor=${cfg%%/*}
        vendor=${vendor##meta-}
        vendor=${vendor%%-openbmc}

        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/templates/default/bblayers.conf.sample" ]; then
                continue
            fi
            if ! grep -q "##OEROOT##/meta-phosphor" "$tmpl/templates/default/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}/templates/default" source \
                        oe-init-build-env "${build_dir}"

                if [ "$(cat conf/templateconf.cfg)" = "${tmpl}/templates/default" ]; then
                    sed "s/^\(MACHINE\s*[?:]*\s*=\s*\).*$/\1\"${target}\"/" \
                        -i conf/local.conf
                fi
                return
            fi
        else
            echo "${vendor}/${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 | sed "/qemu[^[:space:]]*/d" | sed "s#.*/##" | sort -h | "${COLUMN[@]}"
    exit
fi

if [ "$1" == "machines" ]; then
    vendors=""
    for m in $(machine | sort -h | sed "/qemu[^[:space:]]*/d"); do
        vendor=${m%%/*}
        machine=${m##*/}

        if [[ ! "$vendors" =~ -$vendor- ]]; then
            vendors="$vendors -$vendor-"
            echo "* $vendor"
        fi
        echo "  * $machine"
    done
    exit
fi

if [ -z "$ZSH_NAME" ] && [ "$(basename -- "$0")" = "setup" ]; then
    echo The script must be sourced, not executed
    exit 1
fi

bld_dir=$2
if [ -z "$2" ]; then
    bld_dir="build/$1"
fi
machine "$1" "$bld_dir"
