#!/bin/bash
#-------------------------------------------------------------------------------
# Copyright (c) 2020-2023, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------

#
# Builds a single configuration on Trusted Firmware M.
# Relies on environment variables pre-populated.
# These variables can be obtained using configs.py.
# Expected to have trusted-firmware-m cloned to same level as this git tree
#

. $(dirname $0)/util_cmake.sh
. $(dirname $0)/util_git.sh

# For dependency that differs from platforms, the versions need to be checkded
# in each single build job.
function check_dependency_version() {
    TFM_EXTRAS_PATH="${WORKSPACE}/tf-m-extras"
    TFM_EXTRAS_REFSPEC="$(get_cmake_cache ${WORKSPACE}/trusted-firmware-m/build TFM_EXTRAS_REPO_VERSION)"

    # Array containing "<repo path>;<refspec>" elements
    dependency_repos=(
        "${TFM_EXTRAS_PATH};${TFM_EXTRAS_REFSPEC}"
    )

    for repo in ${dependency_repos[@]}; do
        # Parse the repo elements
        REPO_PATH="$(echo "${repo}" | awk -F ';' '{print $1}')"
        REPO_REFSPEC="$(echo "${repo}" | awk -F ';' '{print $2}')"

        if [ ! -z "$REPO_REFSPEC" ] ; then
            git_checkout $REPO_PATH $REPO_REFSPEC
        fi
    done
}

set -ex

if [ -z "$CONFIG_NAME" ] ; then
    echo "Set CONFIG_NAME to run a build."
    exit 1
fi

set_compiler_cmd=$(python3 tf-m-ci-scripts/configs.py -b set_compiler $CONFIG_NAME)
cmake_config_cmd=$(python3 tf-m-ci-scripts/configs.py -b cmake_config $CONFIG_NAME)
cmake_build_cmd=$(python3 tf-m-ci-scripts/configs.py -b cmake_build -j ${BUILD_JOBS:-2} $CONFIG_NAME)
post_build_cmd=$(python3 tf-m-ci-scripts/configs.py -b post_build $CONFIG_NAME)

set +e
echo "output current build environment"
cat /etc/issue
uname -a
grep -c ^processor /proc/cpuinfo
cmake --version
python --version
make --version

set -ex
eval $set_compiler_cmd

if [ -n "$BUILD_TARGET" ]; then
    cmake_build_cmd=${cmake_build_cmd/-- install/-- $BUILD_TARGET}
    echo "Warning: BUILD_TARGET is set, will not run post_build_cmd"
    post_build_cmd=""
fi

if [ "$CODE_COVERAGE_EN" = "TRUE" ] && [[ $CONFIG_NAME =~ "GCC" ]] ; then
    cmake_config_cmd=${cmake_config_cmd/toolchain_GNUARM.cmake/toolchain_GNUARM.cmake -DTFM_CODE_COVERAGE=True}
    echo "Flag: Add compiler flag for build with code coverage supported."
    echo $cmake_config_cmd
fi

if [ -z "$cmake_config_cmd" ] ; then
    echo "No CMake config command found."
    exit 1
fi

if [ -z "$cmake_build_cmd" ] ; then
    echo "No CMake build command found."
    exit 1
fi

cnt=$(ls trusted-firmware-m/lib/ext/mbedcrypto/*.patch 2> /dev/null | wc -l)
if [ "$cnt" != "0" ] ; then
    cd mbedtls
    git apply ../trusted-firmware-m/lib/ext/mbedcrypto/*.patch
    cd -
fi

cnt=$(ls trusted-firmware-m/lib/ext/psa_arch_tests/*.patch 2> /dev/null | wc -l)
if [ "$cnt" != "0" ] ; then
    cd psa-arch-tests
    git apply ../trusted-firmware-m/lib/ext/psa_arch_tests/*.patch
    cd -
fi

cd trusted-firmware-m
git apply ../tf-m-ci-scripts/build_helper/platform_settings/*.patch
cd -

rm -rf trusted-firmware-m/build
mkdir trusted-firmware-m/build
cd trusted-firmware-m/build

set +e
eval $cmake_config_cmd
cmake_cfg_error=$?
set -e

check_dependency_version

if [ $cmake_cfg_error != 0 ] ; then
    rm -rf trusted-firmware-m/build/*
    eval $cmake_config_cmd
fi

eval "$cmake_build_cmd; $post_build_cmd"
