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

# Determine if we've been sourced or executed; "exit" vs "return" is different.
if [ -z "$ZSH_NAME" ] && [ "$(basename -- "$0")" = "setup" ]; then
    EXIT_CMD="exit"
else
    EXIT_CMD="return"
fi

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_CMD} 1
fi

if [ "machines" = "$1" ]; 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_CMD}
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"
