summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeif Lindholm <leif.lindholm@linaro.org>2017-06-14 11:52:09 +0100
committerLeif Lindholm <leif.lindholm@linaro.org>2017-06-14 11:52:09 +0100
commit10b788bd2ff7bcddfb4f9f2868463e594544e68e (patch)
tree63f7e67184437fe7265fcdce2fa5ac03cbb09401
parent93b45c3510bba1b5cf811352244600e6faac0f48 (diff)
clone uefi-build.sh to tianocore-build.sh
To support the new edk2-platforms structure, start by cloning uefi-build.sh (to track changes) into tianocore-build.sh. Signed-off-by: Leif Lindholm <leif.lindholm@linaro.org>
-rwxr-xr-xtianocore-build.sh382
1 files changed, 382 insertions, 0 deletions
diff --git a/tianocore-build.sh b/tianocore-build.sh
new file mode 100755
index 0000000..db2cb4f
--- /dev/null
+++ b/tianocore-build.sh
@@ -0,0 +1,382 @@
+#!/bin/bash
+
+#
+# Board Configuration Section
+# ===========================
+#
+# Board configuration moved to parse-platforms.py and platforms.config.
+#
+# No need to edit below unless you are changing script functionality.
+#
+
+unset WORKSPACE EDK_TOOLS_DIR MAKEFLAGS
+
+TOOLS_DIR="`dirname $0`"
+. "$TOOLS_DIR"/common-functions
+PLATFORM_CONFIG=""
+VERBOSE=0
+ATF_DIR=
+TOS_DIR=
+TOOLCHAIN=
+OPENSSL_CONFIGURED=FALSE
+
+# Number of threads to use for build
+export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1))
+
+function do_build
+{
+ PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
+ PLATFORM_PREBUILD_CMDS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o prebuild_cmds`"
+ PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildflags`"
+ PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS ${EXTRA_OPTIONS[@]}"
+ PLATFORM_BUILDCMD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildcmd`"
+ PLATFORM_DSC="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o dsc`"
+ PLATFORM_PACKAGES_PATH="$PWD"
+ COMPONENT_INF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o inf`"
+
+ PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`"
+ if [ -n "$PLATFORM_ARCH" ]; then
+ if [ -n "$DEFAULT_PLATFORM_ARCH" -a "$DEFAULT_PLATFORM_ARCH" != "$PLATFORM_ARCH" ]; then
+ echo "Command line specified architecture '$DEFAULT_PLATFORM_ARCH'" >&2
+ echo "differs from config file specified '$PLATFORM_ARCH'" >&2
+ return 1
+ fi
+ else
+ if [ ! -n "$DEFAULT_PLATFORM_ARCH" ]; then
+ echo "Unknown target architecture - aborting!" >&2
+ return 1
+ fi
+ PLATFORM_ARCH="$DEFAULT_PLATFORM_ARCH"
+ fi
+ TEMP_PACKAGES_PATH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`"
+ if [ -n "$TEMP_PACKAGES_PATH" ]; then
+ IFS=:
+ for path in "$TEMP_PACKAGES_PATH"; do
+ case "$path" in
+ /*)
+ PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$path"
+ ;;
+ *)
+ PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$PWD/$path"
+ ;;
+ esac
+ done
+ unset IFS
+ fi
+ if [ $VERBOSE -eq 1 ]; then
+ echo "Setting build parallellism to $NUM_THREADS processes\n"
+ echo "PLATFORM_NAME=$PLATFORM_NAME"
+ echo "PLATFORM_PREBUILD_CMDS=$PLATFORM_PREBUILD_CMDS"
+ echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
+ echo "PLATFORM_BUILDCMD=$PLATFORM_BUILDCMD"
+ echo "PLATFORM_DSC=$PLATFORM_DSC"
+ echo "PLATFORM_ARCH=$PLATFORM_ARCH"
+ echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH"
+ fi
+
+ if [[ "${PLATFORM_BUILDFLAGS}" =~ "SECURE_BOOT_ENABLE=TRUE" ]]; then
+ import_openssl
+ fi
+
+ set_cross_compile
+ CROSS_COMPILE="$TEMP_CROSS_COMPILE"
+
+ echo "Building $PLATFORM_NAME - $PLATFORM_ARCH"
+ echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
+ echo "$board"_BUILDFLAGS="'$PLATFORM_BUILDFLAGS'"
+
+ if [ "$TARGETS" == "" ]; then
+ TARGETS=( RELEASE )
+ fi
+
+ case $TOOLCHAIN in
+ "gcc")
+ export TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc`
+ ;;
+ "clang")
+ export TOOLCHAIN=`get_clang_version clang`
+ ;;
+ esac
+ echo "TOOLCHAIN is ${TOOLCHAIN}"
+
+ export ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE
+ echo "Toolchain prefix: ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE"
+
+ export PACKAGES_PATH="$PLATFORM_PACKAGES_PATH"
+ for target in "${TARGETS[@]}" ; do
+ if [ X"$PLATFORM_PREBUILD_CMDS" != X"" ]; then
+ echo "Run pre build commands"
+ eval ${PLATFORM_PREBUILD_CMDS}
+ fi
+
+ if [ -n "$COMPONENT_INF" ]; then
+ # Build a standalone component
+ build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \
+ -m "$COMPONENT_INF" -b "$target" ${PLATFORM_BUILDFLAGS}
+ else
+ # Build a platform
+ build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \
+ -b "$target" ${PLATFORM_BUILDFLAGS}
+ fi
+
+ RESULT=$?
+ if [ $RESULT -eq 0 ]; then
+ if [ X"$TOS_DIR" != X"" ]; then
+ pushd $TOS_DIR >/dev/null
+ if [ $VERBOSE -eq 1 ]; then
+ echo "$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
+ fi
+ $TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
+ RESULT=$?
+ popd >/dev/null
+ fi
+ fi
+ if [ $RESULT -eq 0 ]; then
+ if [ X"$ATF_DIR" != X"" ]; then
+ pushd $ATF_DIR >/dev/null
+ if [ $VERBOSE -eq 1 ]; then
+ echo "$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
+ fi
+ $TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
+ RESULT=$?
+ popd >/dev/null
+ fi
+ fi
+ result_log $RESULT "$PLATFORM_NAME $target"
+ done
+ unset PACKAGES_PATH
+}
+
+
+function clearcache
+{
+ CONF_FILES="build_rule target tools_def"
+ if [ -z "$EDK_TOOLS_PATH" ]
+ then
+ TEMPLATE_PATH=./BaseTools/Conf/
+ else
+ TEMPLATE_PATH="$EDK_TOOLS_PATH/Conf/"
+ fi
+
+ for File in $CONF_FILES
+ do
+ TEMPLATE_FILE="$TEMPLATE_PATH/$File.template"
+ CACHE_FILE="Conf/$File.txt"
+ if [ -e "$CACHE_FILE" -a "$TEMPLATE_FILE" -nt "$CACHE_FILE" ]
+ then
+ echo "Removing outdated '$CACHE_FILE'."
+ rm "$CACHE_FILE"
+ fi
+ done
+
+ unset TEMPLATE_PATH TEMPLATE_FILE CACHE_FILE
+}
+
+
+function uefishell
+{
+ BUILD_ARCH=`uname -m`
+ case $BUILD_ARCH in
+ arm*)
+ ARCH=ARM
+ ;;
+ aarch64)
+ ARCH=AARCH64
+ ;;
+ *)
+ unset ARCH
+ ;;
+ esac
+ export ARCH
+ export EDK_TOOLS_PATH=`pwd`/BaseTools
+ clearcache
+ . edksetup.sh BaseTools
+ if [ $VERBOSE -eq 1 ]; then
+ echo "Building BaseTools"
+ fi
+ make -C $EDK_TOOLS_PATH
+ if [ $? -ne 0 ]; then
+ echo " !!! UEFI BaseTools failed to build !!! " >&2
+ exit 1
+ fi
+}
+
+
+function usage
+{
+ echo "usage:"
+ echo -n "uefi-build.sh [-b DEBUG | RELEASE] [ all "
+ for board in "${boards[@]}" ; do
+ echo -n "| $board "
+ done
+ echo "]"
+ printf "%8s\tbuild %s\n" "all" "all supported platforms"
+ for board in "${boards[@]}" ; do
+ PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
+ printf "%8s\tbuild %s\n" "$board" "${PLATFORM_NAME}"
+ done
+}
+
+#
+# Since we do a command line validation on whether specified platforms exist or
+# not, do a first pass of command line to see if there is an explicit config
+# file there to read valid platforms from.
+#
+commandline=( "$@" )
+i=0
+for arg;
+do
+ if [ $arg == "-c" ]; then
+ FILE_ARG=${commandline[i + 1]}
+ if [ ! -f "$FILE_ARG" ]; then
+ echo "ERROR: configuration file '$FILE_ARG' not found" >&2
+ exit 1
+ fi
+ case "$FILE_ARG" in
+ /*)
+ PLATFORM_CONFIG="-c $FILE_ARG"
+ ;;
+ *)
+ PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`"
+ ;;
+ esac
+ echo "Platform config file: '$FILE_ARG'"
+ export PLATFORM_CONFIG
+ fi
+ i=$(($i + 1))
+done
+
+builds=()
+boards=()
+boardlist="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG shortlist`"
+for board in $boardlist; do
+ boards=(${boards[@]} $board)
+done
+
+NUM_TARGETS=0
+
+while [ "$1" != "" ]; do
+ case $1 in
+ all )
+ builds=(${boards[@]})
+ NUM_TARGETS=$(($NUM_TARGETS + 1))
+ ;;
+ "/h" | "/?" | "-?" | "-h" | "--help" )
+ usage
+ exit
+ ;;
+ "-v" )
+ VERBOSE=1
+ ;;
+ "-a" )
+ shift
+ ATF_DIR="$1"
+ ;;
+ "-A" )
+ shift
+ DEFAULT_PLATFORM_ARCH="$1"
+ ;;
+ "-c" )
+ # Already parsed above - skip this + option
+ shift
+ ;;
+ "-s" )
+ shift
+ export TOS_DIR="$1"
+ ;;
+ "-b" | "--build" )
+ shift
+ echo "Adding Build profile: $1"
+ TARGETS=( ${TARGETS[@]} $1 )
+ ;;
+ "-D" )
+ shift
+ echo "Adding option: -D $1"
+ EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" $1 )
+ ;;
+ "-T" )
+ shift
+ echo "Setting toolchain to '$1'"
+ TOOLCHAIN="$1"
+ ;;
+ "-1" )
+ NUM_THREADS=1
+ ;;
+ * )
+ MATCH=0
+ for board in "${boards[@]}" ; do
+ if [ "$1" == $board ]; then
+ MATCH=1
+ builds=(${builds[@]} "$board")
+ break
+ fi
+ done
+
+ if [ $MATCH -eq 0 ]; then
+ echo "unknown arg $1"
+ usage
+ exit 1
+ fi
+ NUM_TARGETS=$(($NUM_TARGETS + 1))
+ ;;
+ esac
+ shift
+done
+
+# If there were no args, use a menu to select a single board / all boards to build
+if [ $NUM_TARGETS -eq 0 ]
+then
+ read -p "$(
+ f=0
+ for board in "${boards[@]}" ; do
+ echo "$((++f)): $board"
+ done
+ echo $((++f)): all
+
+ echo -ne '> '
+ )" selection
+
+ if [ "$selection" -eq $((${#boards[@]} + 1)) ]; then
+ builds=(${boards[@]})
+ else
+ builds="${boards[$((selection-1))]}"
+ fi
+fi
+
+# Check to see if we are in a UEFI repository
+# refuse to continue if we aren't
+if [ ! -e BaseTools ]
+then
+ echo "ERROR: we aren't in the UEFI directory."
+ echo " I can tell because I can't see the BaseTools directory"
+ exit 1
+fi
+
+EDK2_DIR="$PWD"
+export VERBOSE
+
+if [[ "${EXTRA_OPTIONS[@]}" != *"FIRMWARE_VER"* ]]; then
+ if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
+ FIRMWARE_VER=`git rev-parse --short HEAD`
+ if ! git diff-index --quiet HEAD --; then
+ FIRMWARE_VER="${FIRMWARE_VER}-dirty"
+ fi
+ EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" FIRMWARE_VER=$FIRMWARE_VER )
+ if [ $VERBOSE -eq 1 ]; then
+ echo "FIRMWARE_VER=$FIRMWARE_VER"
+ echo "EXTRA_OPTIONS=$EXTRA_OPTIONS"
+ fi
+ fi
+fi
+
+uefishell
+
+if [ X"$TOOLCHAIN" = X"" ]; then
+ TOOLCHAIN=gcc
+fi
+
+for board in "${builds[@]}" ; do
+ do_build
+done
+
+result_print