#!/bin/bash

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

set -xe

##########################################
# install Rust and select a proper version
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly-2021-09-20
source $HOME/.cargo/env
rustup component add rust-src && rustup target install aarch64-unknown-linux-gnu arm-unknown-linux-gnueabihf

# install Xargo
rustup default 1.44.0 && cargo +1.44.0 install xargo
# switch to nightly
rustup default nightly-2021-09-20

########################################################
# initialize submodules: optee_os / optee_client / build
OPTEE_RELEASE_VERSION=3.17.0

if [[ -z $OPTEE_DIR ]] || [[ $OPTEE_DIR == $PWD/optee ]]
then
	OPTEE_DIR=$PWD/optee
	echo optee dir: $OPTEE_DIR
	OPTEE_SUBMODULES=("optee_os" "optee_client" "build")

	if [ ! -d $OPTEE_DIR ]
	then
		mkdir $OPTEE_DIR
	else
		rm -r $OPTEE_DIR/*
	fi

	# download optee release
	echo "Downloading optee release..."
	for submodule in ${OPTEE_SUBMODULES[*]}
	do
		echo "Downloading $submodule..."
		curl --retry 5 -s -S \
			-L https://github.com/OP-TEE/$submodule/archive/refs/tags/$OPTEE_RELEASE_VERSION.tar.gz \
			-o $OPTEE_DIR/$OPTEE_RELEASE_VERSION.tar.gz
		if [ ! $? -eq 0 ]
		then
			rm $OPTEE_DIR/$OPTEE_RELEASE_VERSION.tar.gz && \
				echo "Download failed" && \
				exit 1
		fi
		echo "Uncompressing $submodule..."
		mkdir -p $OPTEE_DIR/$submodule && \
			tar zxf $OPTEE_DIR/$OPTEE_RELEASE_VERSION.tar.gz \
			-C $OPTEE_DIR/$submodule --strip-components 1
	        if [ ! $? -eq 0 ]
		then
			rm $OPTEE_DIR/$OPTEE_RELEASE_VERSION.tar.gz && \
				rm -r $OPTEE_DIR/$submodule && \
				echo "Downloaded file is damaged" && \
				exit 1
	        fi
		rm $OPTEE_DIR/$OPTEE_RELEASE_VERSION.tar.gz
	done
	echo "Download finished"
else
	echo "OPTEE_DIR has been set, omit to download optee submodules"
fi


########################################################
# initialize submodules: rust / compiler-builtins / libc
RUST_COMMIT_ID=cb8a61693c80ebc615c2b66f40f0789cd16e699a
COMPILER_BUILTINS_COMMIT_ID=45a2e4996fe732172004b292b07397f9a02265ab
LIBC_COMMIT_ID=1ddfbbbc190bec0f5ec32b08e97585b34d0c6b09

if [ -d rust/ ]
then
        rm -r rust/
fi

mkdir rust && cd rust

git clone https://github.com/mesalock-linux/rust.git && \
	(cd rust && \
	git checkout $RUST_COMMIT_ID && \
	git submodule update --init library/stdarch && \
	git submodule update --init library/backtrace)

git clone https://github.com/mesalock-linux/compiler-builtins.git && \
	(cd compiler-builtins && \
	git checkout $COMPILER_BUILTINS_COMMIT_ID && \
	git submodule update --init libm)

git clone https://github.com/mesalock-linux/libc.git && \
	(cd libc && \
	git checkout $LIBC_COMMIT_ID)

echo "Rust submodules initialized"
