#!/bin/bash
#
# Builds OP-TEE Trusted OS.
# Not intended to be called directly, invoked from tos-build.sh.
#
# Board configuration is extracted from
# parse-platforms.py and platforms.config.
#

TOOLS_DIR="`dirname $0`"
. "$TOOLS_DIR"/common-functions

export CFG_TEE_CORE_LOG_LEVEL=2  # 0=none 1=err 2=info 3=debug 4=flow

function usage
{
	echo "usage:"
	echo "opteed-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
	echo
}

function build_platform
{
	unset CFG_ARM64_core PLATFORM PLATFORM_FLAVOR DEBUG
	TOS_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_platform`"
	if [ X"$TOS_PLATFORM" = X"" ]; then
		TOS_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`"
		if [ X"$TOS_PLATFORM" = X"" ]; then
			TOS_PLATFORM=$1
		fi
	fi
	TOS_PLATFORM_FLAVOR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_platform_flavor`"

	#
	# Read platform configuration
	#
	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o arch`"
	PLATFORM_IMAGE_DIR="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_image_dir`"
	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_buildflags`"

	if [ $VERBOSE -eq 1 ]; then
		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
		echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR"
		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
	fi

	#
	# Set up cross compilation variables (if applicable)
	#
	# OP-TEE requires both 64- and 32-bit compilers for a 64-bit build
	# For details, visit
	# https://github.com/OP-TEE/optee_os/blob/master/documentation/build_system.md#cross_compile-cross-compiler-selection
	#
	set_cross_compile
	if [ "$PLATFORM_ARCH" = "AARCH64" ]; then
		export CFG_ARM64_core=y
		export CROSS_COMPILE_core="$TEMP_CROSS_COMPILE"
		export CROSS_COMPILE_ta_arm64="$TEMP_CROSS_COMPILE"
		PLATFORM_ARCH="ARM"
		set_cross_compile
		PLATFORM_ARCH="AARCH64"
		echo "CFG_ARM64_core=$CFG_ARM64_core"
		echo "CROSS_COMPILE_ta_arm64=$CROSS_COMPILE_ta_arm64"
	else
		export CFG_ARM64_core=n
	fi
	export CROSS_COMPILE="$TEMP_CROSS_COMPILE"
	echo "CROSS_COMPILE=$CROSS_COMPILE"
	echo "CROSS_COMPILE_core=$CROSS_COMPILE_core"

	#
	# Set up build variables
	#
	BUILD_TOS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_tos`"
	case "$BUILD_TOS" in
	debug*)
		export DEBUG=1
		echo "PROFILE=DEBUG"
		;;
	*)
		export DEBUG=0
		echo "PROFILE=RELEASE"
		;;
	esac

	export PLATFORM=$TOS_PLATFORM
	export PLATFORM_FLAVOR=$TOS_PLATFORM_FLAVOR
	echo "PLATFORM=$PLATFORM"
	echo "PLATFORM_FLAVOR=$PLATFORM_FLAVOR"
	echo "CFG_TEE_CORE_LOG_LEVEL=$CFG_TEE_CORE_LOG_LEVEL"

	#
	# Build OP-TEE
	#
	if [ $VERBOSE -eq 1 ]; then
		echo "Calling OP-TEE build:"
	fi
	make -j$NUM_THREADS ${PLATFORM_BUILDFLAGS}
	if [ $? -eq 0 ]; then
		#
		# Copy resulting images to UEFI image dir
		#
		if [ $VERBOSE -eq 1 ]; then
			echo "Copying tee.bin to "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/""
		fi
		cp -a out/arm-plat-"$TOS_PLATFORM"/core/tee.bin "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"
	else
		return 1
	fi
}

# Check to see if we are in a trusted OS directory
# refuse to continue if we aren't
if [ ! -f documentation/optee_design.md ]
then
	echo "ERROR: we aren't in the optee_os directory."
	usage
	exit 1
fi

build=

if [ $# = 0 ]
then
	usage
	exit 1
else
	while [ "$1" != "" ]; do
		case $1 in
			"-e" )
				shift
				EDK2_DIR="$1"
				;;
			"/h" | "/?" | "-?" | "-h" | "--help" )
				usage
				exit
				;;
			"-t" )
				shift
				BUILD_PROFILE="$1"
				;;
			* )
				build="$1"
				;;
		esac
		shift
	done
fi

if [ X"$build" = X"" ]; then
	echo "No platform specified!" >&2
	echo
	usage
	exit 1
fi

build_platform $build
exit $?