#!/bin/bash
#
# Builds ARM Trusted Firmware, and generates FIPs with UEFI and optionally
# Trusted OS for the supported platforms.
# Not intended to be called directly, invoked from uefi-build.sh.
#
# Board configuration is extracted from
# parse-platforms.py and platforms.config.
#
. "$TOOLS_DIR"/common-functions
OUTPUT_DIR="$PWD"/uefi-build
ATF_BUILDVER=1
function usage
{
echo "usage:"
echo "atf-build.sh -e <EDK2 source directory> -t <UEFI build profile/toolchain> <platform>"
echo
}
function check_atf_buildver
{
MAJOR=`grep "^VERSION_MAJOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
[ $? -ne 0 ] && return 1
MINOR=`grep "^VERSION_MINOR" Makefile | sed 's/.*:= *\([0-9]*\).*/\1/'`
[ $? -ne 0 ] && return 1
if [ "$MAJOR" -eq 1 -a "$MINOR" -ge 2 ]; then
ATF_BUILDVER=2
fi
}
function build_platform
{
if [ X"$EDK2_DIR" = X"" ];then
echo "EDK2_DIR not set!" >&2
return 1
fi
check_atf_buildver || return 1
BUILD_ATF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o build_atf`"
if [ X"$BUILD_ATF" = X"" ]; then
echo "Platform '$1' is not configured to build ARM Trusted Firmware."
return 0
fi
ATF_PLATFORM="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_platform`"
if [ X"$ATF_PLATFORM" = X"" ]; then
ATF_PLATFORM=$1
fi
#
# Read platform configuration
#
PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o longname`"
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 atf_buildflags`"
if [ $VERBOSE -eq 1 ]; then
echo "PLATFORM_NAME=$PLATFORM_NAME"
echo "PLATFORM_ARCH=$PLATFORM_ARCH"
echo "PLATFORM_IMAGE_DIR=$PLATFORM_IMAGE_DIR"
echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
fi
unset BL30 BL31 BL32 BL33
BL30="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o scp_bin`"
if [ $ATF_BUILDVER -gt 1 ]; then
unset SCP_BL2
SCP_BL2=`search_packages_path "$BL30"`
fi
BL31="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o el3_bin`"
BL33="$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_bin`"
#
# Set up cross compilation variables (if applicable)
#
set_cross_compile
CROSS_COMPILE="$TEMP_CROSS_COMPILE"
echo "Building ARM Trusted Firmware for $PLATFORM_NAME - $BUILD_PROFILE"
echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
if [ X"$BL30" != X"" ]; then
BL30=`search_packages_path "$BL30"`
fi
if [ X"$BL31" != X"" ]; then
BL31=`search_packages_path "$BL31"`
fi
#
# BL32 requires more attention
# If TOS_DIR is not set, we assume user does not want a Trusted OS,
# even if the source directory and/or binary for it exists
#
if [ X"$TOS_DIR" != X"" ]; then
SPD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o atf_spd`"
TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`"
if [ X"$TOS_BIN" != X"" ]; then
BL32=$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN
fi
if [ X"$SPD" != X"" ] && [ X"$BL32" != X"" ]; then
#
# Since SPD cannot be exported or undefined,
# we parametrise it here
#
SPD_OPTION="SPD=$SPD"
else
echo "WARNING: Proceeding without Trusted OS!"
echo " Please specify both ATF_SPD and TOS_BIN"
echo " if you wish to use a Trusted OS!"
fi
else
#
# Since TOS_DIR is not set, user does not want a Trusted OS
# even if the source directory and/or binary for it exists.
# Next, Check whether user wants secure partition image.
# If SPM_BIN is set then include pre-built secure partition image as a
# BL32 Image and implicitly set SPM=1.
#
SPM_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o spm_bin`"
if [ X"$SPM_BIN" != X"" ]; then
BL32=$WORKSPACE/Build/StandaloneSmmPkg/$BUILD_PROFILE/FV/$SPM_BIN
PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS SPM=1"
fi
# We assume that user does not want secure partition either.
# Todo: Revisit if either one of Trusted OS or Secure Partition Image is Mandatory.
fi
#
# Debug extraction handling
#
case "$BUILD_ATF" in
debug*)
DEBUG=1
BUILD_TYPE="debug"
;;
*)
DEBUG=0
BUILD_TYPE="release"
;;
esac
export BL30 BL31 BL32 BL33
echo "BL30=$BL30"
if [ $ATF_BUILDVER -gt 1 ] && [ X"$BL30" != X"" ]; then
export SCP_BL2
echo "SCP_BL2=$BL30"
fi
echo "BL31=$BL31"
echo "BL32=$BL32"
echo "BL33=$BL33"
echo "$SPD_OPTION"
echo "BUILD_TYPE=$BUILD_TYPE"
#
# If a build was done with BL32, and followed by another without,
# the BL32 component remains in fip.bin, so we delete the build dir
# contents before calling make
#
rm -rf build/"$ATF_PLATFORM/$BUILD_TYPE"/*
#
# Build ARM Trusted Firmware and create FIP
#
if [ $VERBOSE -eq 1 ]; then
echo "Calling ARM Trusted Firmware build:"
echo "CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip"
fi
CROSS_COMPILE="$CROSS_COMPILE" make -j$NUM_THREADS PLAT="$ATF_PLATFORM" $SPD_OPTION DEBUG=$DEBUG ${PLATFORM_BUILDFLAGS} all fip
if [ $? -eq 0 ]; then
#
# Copy resulting images to UEFI image dir
#
if [ $VERBOSE -eq 1 ]; then
echo "Copying bl1.bin and fip.bin to "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/""
fi
cp -a build/"$ATF_PLATFORM/$BUILD_TYPE"/{bl1,fip}.bin "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"
else
return 1
fi
}
# Check to see if we are in a trusted firmware directory
# refuse to continue if we aren't
if [ ! -d bl32 ]
then
echo "ERROR: we aren't in the arm-trusted-firmware 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 $?