# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

# This script is written into .bashrc to set up toolchains when enter the docker, like:
# docker run -it \
#   -e TA_ARCH=aarch64 \
#   -e CA_ARCH=arm \
#   -e STD=y \
#   teaclave-dev bash

#export RUST_STD_DIR=${TEACLAVE_TOOLCHAIN_BASE}/rust
#export RUST_TARGET_PATH=${TEACLAVE_TOOLCHAIN_BASE}/scripts/std

# validate environment variables
: "${TEACLAVE_TOOLCHAIN_BASE:?TEACLAVE_TOOLCHAIN_BASE must be set - directory where Teaclave toolchain is installed}"
: "${OPTEE_DIR:?OPTEE_DIR must be set - directory where OPTEE will be built}"
: "${OPTEE_OS_DIR:?OPTEE_OS_DIR must be set - directory where OPTEE OS will be built}"
: "${OPTEE_CLIENT_DIR:?OPTEE_CLIENT_DIR must be set - directory where OPTEE Client will be built}"
: "${IMG_DIRECTORY:?IMG_DIRECTORY must be set - directory where images will be stored}"
: "${IMG_NAME:?IMG_NAME must be set - name of the image to download}"

# Default ARCH_TA, ARCH_HOST, STD combination
export ARCH_TA="${ARCH_TA:-aarch64}"
export ARCH_HOST="${ARCH_HOST:-aarch64}"

export CROSS_COMPILE32="${CROSS_COMPILE32:-arm-linux-gnueabihf-}"
export CROSS_COMPILE64="${CROSS_COMPILE64:-aarch64-linux-gnu-}"

if [ "$ARCH_TA" = "arm" ]
then
  # build TA as 32-bit
  export TA_DEV_KIT_DIR="$OPTEE_OS_DIR/out/arm-plat-vexpress/export-ta_arm32"
  if [ "$STD" ]
  then
    export TARGET_TA="arm-unknown-optee"
    echo "set TARGET_TA=$TARGET_TA (std)"
  else
    export TARGET_TA="arm-unknown-linux-gnueabihf"
    echo "set TARGET_TA=$TARGET_TA (no-std)"
  fi
  export CROSS_COMPILE_TA="$CROSS_COMPILE32"
  echo "set CROSS_COMPILE_TA=$CROSS_COMPILE_TA"
else
  # build TA as 64-bit by default
  export TA_DEV_KIT_DIR="$OPTEE_OS_DIR/out/arm-plat-vexpress/export-ta_arm64"
  if [ "$STD" ]
  then
    export TARGET_TA="aarch64-unknown-optee"
    echo "set TARGET_TA=$TARGET_TA (std)"
  else
    export TARGET_TA="aarch64-unknown-linux-gnu"
    echo "set TARGET_TA=$TARGET_TA (no-std)"
  fi
  export CROSS_COMPILE_TA="$CROSS_COMPILE64"
  echo "set CROSS_COMPILE_TA=$CROSS_COMPILE_TA"
fi

# check if libraries exist
if [ -d "$TA_DEV_KIT_DIR" ]
then
  echo "set TA_DEV_KIT_DIR=$TA_DEV_KIT_DIR"
else
  echo -e "Error: TA_DEV_KIT_DIR=$TA_DEV_KIT_DIR does not exist, please set the correct TA_DEV_KIT_DIR or run \"$ ./build_optee_libraries.sh optee/\" then try again\n"
  unset OPTEE_DIR
fi

if [ "$ARCH_HOST" = "arm" ]
then
  # build host as 32-bit
  export OPTEE_CLIENT_EXPORT="$OPTEE_CLIENT_DIR/export_arm32"
  export TARGET_HOST="arm-unknown-linux-gnueabihf"
  echo "set TARGET_HOST=$TARGET_HOST"
  export CROSS_COMPILE_HOST="$CROSS_COMPILE32"
  echo "set CROSS_COMPILE_HOST=$CROSS_COMPILE_HOST"
else
  # build host as 64-bit by default
  export OPTEE_CLIENT_EXPORT="$OPTEE_CLIENT_DIR/export_arm64"
  export TARGET_HOST="aarch64-unknown-linux-gnu"
  echo "set TARGET_HOST=$TARGET_HOST"
  export CROSS_COMPILE_HOST="$CROSS_COMPILE64"
  echo "set CROSS_COMPILE_HOST=$CROSS_COMPILE_HOST"
fi

if [ -d "$OPTEE_CLIENT_EXPORT" ]
then 
  echo "set OPTEE_CLIENT_EXPORT=$OPTEE_CLIENT_EXPORT"
else
  echo -e "Error: OPTEE_CLIENT_EXPORT=$OPTEE_CLIENT_EXPORT does not exist, please set the correct OPTEE_CLIENT_EXPORT or run \"$ ./build_optee_libraries.sh optee/\" then try again\n"
  unset OPTEE_DIR
fi

echo "[env] Configured Successfully for building OP-TEE applications."


export QEMU_HOST_SHARE_DIR=${TEACLAVE_TOOLCHAIN_BASE}/shared
# Create QEMU shared dir if it does not exist, it used for sharing CA and TA between host and QEMU emulator.
if [ -d "$QEMU_HOST_SHARE_DIR" ]; then
    echo "QEMU shared directory already exists: $QEMU_HOST_SHARE_DIR"
else
    echo "Creating QEMU shared directory: $QEMU_HOST_SHARE_DIR"
    mkdir -p "$QEMU_HOST_SHARE_DIR/host"
    mkdir -p "$QEMU_HOST_SHARE_DIR/ta"
    mkdir -p "$QEMU_HOST_SHARE_DIR/plugin"
fi