From patchwork Tue Jul 18 03:19:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 108055 Delivered-To: patches@linaro.org Received: by 10.140.101.44 with SMTP id t41csp5342898qge; Mon, 17 Jul 2017 20:19:43 -0700 (PDT) X-Received: by 10.101.88.130 with SMTP id d2mr811816pgu.265.1500347982921; Mon, 17 Jul 2017 20:19:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1500347982; cv=none; d=google.com; s=arc-20160816; b=Ca4Ln6sjSHJ9dmzNgHotgQmwaHW4i4z+WLPcZm/y7thfI7mf57kschQY6X7o6bsjnO pZzVNh2ONez/vUahoIgE0CkLcFfd4cB5jebuco12VZiq480IZz9BW7cI7fPlnyjrhtUH e9jutcNCKHeV+0+3EcI0DRmez7rYawybTHNw/K5oGL8UC9BSptY6/pkskvoCfALxWK1x /wJHwM+7BR1VOm5Wh7RNTDfeF43QppzbfeqbsU9I12L37pkI1MLnjWQi+4xFPm5H2OPm gjIiPq4FOEoOW94uV9TFjlRLG0VvHe0RgQcXnAMkcjzPkP7yywtXT5xLMs+adiF6nFlx ED3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=nkV+F0F5Fz0YFi1ZtlcRytqJEraJV7WnOYAUglel2mQ=; b=B75f5T+ucSpOWUZfbAayy5DElWbjs8Ibddfh71W48C0S8Fa7+q0ZNeIah6SVkLGt/K i3hUXZGgZlOKWDXTsP2RxBeHtTSTHaCQQUX4c+y+L3djXHdTJAtYrRuKVr3DOQcfd8kf oS2yWZ+Q0XVNv6R5gXSZBe6WDh4RsO7gk2g3zLA5VwcAixO0NNNcCDJkWdagVRs0PJFm 9YbcpUdTcrI5ME4rZq0DagupYpVZitZGJdKKMoZS7JKd6wgYhPeCgMVk2pyrh1VVMs4S 0zuoGsK1MP7RLrwOFWIG6lCmpbIjM857ef08geclP8xige9AEEON+fYnUAuLkzwVWjfF WX7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=QJIbDJjE; spf=pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c05::22f as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-pg0-x22f.google.com (mail-pg0-x22f.google.com. [2607:f8b0:400e:c05::22f]) by mx.google.com with ESMTPS id j10si767194pfc.13.2017.07.17.20.19.42 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Jul 2017 20:19:42 -0700 (PDT) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c05::22f as permitted sender) client-ip=2607:f8b0:400e:c05::22f; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.b=QJIbDJjE; spf=pass (google.com: domain of john.stultz@linaro.org designates 2607:f8b0:400e:c05::22f as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: by mail-pg0-x22f.google.com with SMTP id u5so4683982pgq.3 for ; Mon, 17 Jul 2017 20:19:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=nkV+F0F5Fz0YFi1ZtlcRytqJEraJV7WnOYAUglel2mQ=; b=QJIbDJjEjMZWD3fy0HYYxO4yaMOKqgdiHK8hfxWZ6/xcFTCT2quxnFudedE+39KiIT PcDXpWog5DTwKCUWcmPO/QbzZf6ZK9BrJHMRV6qE9krpyl8pAs6AdWj7PMRoEXmWzAcz hqTxRJYofEA54+FfS+DcvavYpY25mG6yC2SCQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=nkV+F0F5Fz0YFi1ZtlcRytqJEraJV7WnOYAUglel2mQ=; b=MjnpLEBEPOn62an98Vd5KIq+8WNHX9QTWJjpRnZF0dE5hvJ4beBJevdpqmTyvOr7Fr cPVTki3zO+EFxiu5yWJPZdnUbrpnGcBMhh5/cH0cGT7IEQ44OQSrgGBUTOV5UD3sB4g6 LQ+AEh5IGU7DgsaooZvKxUAX2SlbaBwbZ8OrCjpfnk3QqAqnknNub1epHJgIW1Tkcjlb mYjcBAIYFsaTrOcIrFgFVeudlXq1fbT/3tVMICVWjObaZpozpWOmjfDzXEP8SSFczKgs GewqUe5J3kFOy1t1VAxfcZ/bfZJMUoUDyIxCgGiKhLS58G8c7S9QxMbPV7i41bMkF3yb Uu/w== X-Gm-Message-State: AIVw112bT0KfTT/QH0LfIuhXnlGuZg+Zp2Rwa6MTJwOHcqP1zvLOWsqY clvJl0VfedV3wdQnzJY= X-Received: by 10.98.93.21 with SMTP id r21mr816090pfb.201.1500347981869; Mon, 17 Jul 2017 20:19:41 -0700 (PDT) Return-Path: Received: from localhost.localdomain ([2601:1c2:1002:83f0:4e72:b9ff:fe99:466a]) by smtp.gmail.com with ESMTPSA id x3sm1130743pgx.29.2017.07.17.20.19.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 17 Jul 2017 20:19:41 -0700 (PDT) From: John Stultz To: Haojian Zhuang Cc: John Stultz Subject: [PATCH] Update UEFI tools to match updted UEFI sources Date: Mon, 17 Jul 2017 20:19:37 -0700 Message-Id: <1500347977-19955-1-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 2.7.4 Copied over from https://github.com/96boards-hikey/uefi-tools Change-Id: Iee58d079ee565bbb83849d357caac2b21b9be043 Signed-off-by: John Stultz --- uefi-tools/atf-build.sh | 34 +++- uefi-tools/common-functions | 168 +++++++++++++++-- uefi-tools/edk2-build.sh | 388 +++++++++++++++++++++++++++++++++++++++ uefi-tools/edk2-platforms.config | 128 +++++++++++++ uefi-tools/edk2-to-git-am.sh | 20 ++ uefi-tools/handy-snippets.sh | 8 + uefi-tools/parse-platforms.py | 2 +- uefi-tools/platforms.config | 96 +++++++--- uefi-tools/uefi-build.sh | 96 ++++++++-- 9 files changed, 875 insertions(+), 65 deletions(-) create mode 100755 uefi-tools/edk2-build.sh create mode 100644 uefi-tools/edk2-platforms.config create mode 100755 uefi-tools/edk2-to-git-am.sh create mode 100644 uefi-tools/handy-snippets.sh -- 2.7.4 diff --git a/uefi-tools/atf-build.sh b/uefi-tools/atf-build.sh index 0c4c09c..e07c0d8 100755 --- a/uefi-tools/atf-build.sh +++ b/uefi-tools/atf-build.sh @@ -72,10 +72,10 @@ function build_platform 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="$EDK2_DIR/$BL30" + SCP_BL2=`search_packages_path "$BL30"` fi BL31="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o el3_bin`" - BL33="$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o uefi_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) @@ -86,10 +86,10 @@ function build_platform echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\"" if [ X"$BL30" != X"" ]; then - BL30="${EDK2_DIR}"/"${BL30}" + BL30=`search_packages_path "$BL30"` fi if [ X"$BL31" != X"" ]; then - BL31="${EDK2_DIR}"/"${BL31}" + BL31=`search_packages_path "$BL31"` fi # @@ -102,7 +102,7 @@ function build_platform TOS_BIN="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $1 get -o tos_bin`" if [ X"$TOS_BIN" != X"" ]; then - BL32=$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN + BL32=$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/$TOS_BIN fi if [ X"$SPD" != X"" ] && [ X"$BL32" != X"" ]; then @@ -116,8 +116,26 @@ function build_platform 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 # @@ -135,7 +153,7 @@ function build_platform export BL30 BL31 BL32 BL33 echo "BL30=$BL30" - if [ $ATF_BUILDVER -gt 1 ]; then + if [ $ATF_BUILDVER -gt 1 ] && [ X"$BL30" != X"" ]; then export SCP_BL2 echo "SCP_BL2=$BL30" fi @@ -165,9 +183,9 @@ function build_platform # Copy resulting images to UEFI image dir # if [ $VERBOSE -eq 1 ]; then - echo "Copying bl1.bin and fip.bin to "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/"" + 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 "$EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/" + cp -a build/"$ATF_PLATFORM/$BUILD_TYPE"/{bl1,fip}.bin "$WORKSPACE/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/" else return 1 fi diff --git a/uefi-tools/common-functions b/uefi-tools/common-functions index 08f4fbf..4f7d0ad 100644 --- a/uefi-tools/common-functions +++ b/uefi-tools/common-functions @@ -34,6 +34,10 @@ function get_build_arch BUILD_ARCH=ARM;; aarch64*) BUILD_ARCH=AARCH64;; + i?86*) + BUILD_ARCH=IA32;; + x86_64*) + BUILD_ARCH=X64;; *) BUILD_ARCH=other;; esac @@ -45,42 +49,168 @@ function set_cross_compile echo "Target: $PLATFORM_ARCH" echo "Build: $BUILD_ARCH" - if [ "$PLATFORM_ARCH" = "$BUILD_ARCH" ]; then + if [ "$PLATFORM_ARCH" = "$BUILD_ARCH" ]; then TEMP_CROSS_COMPILE= - elif [ "$PLATFORM_ARCH" == "AARCH64" ]; then - if [ X"$CROSS_COMPILE_64" != X"" ]; then - TEMP_CROSS_COMPILE="$CROSS_COMPILE_64" - else - TEMP_CROSS_COMPILE=aarch64-linux-gnu- - fi - elif [ "$PLATFORM_ARCH" == "ARM" ]; then - if [ X"$CROSS_COMPILE_32" != X"" ]; then - TEMP_CROSS_COMPILE="$CROSS_COMPILE_32" - else - TEMP_CROSS_COMPILE=arm-linux-gnueabihf- - fi else - echo "Unsupported target architecture '$PLATFORM_ARCH'!" >&2 + case "$PLATFORM_ARCH" in + AARCH64) + if [ X"$CROSS_COMPILE_64" != X"" ]; then + TEMP_CROSS_COMPILE="$CROSS_COMPILE_64" + else + TEMP_CROSS_COMPILE=aarch64-linux-gnu- + fi + ;; + ARM) + TEMP_CROSS_COMPILE=arm-linux-gnueabihf- ;; + IA32) + TEMP_CROSS_COMPILE=x86_64-linux-gnu- + for family in 6 5 4 3; do + if i$family86-linux-gnu-as -version >/dev/null 2>&1;then + TEMP_CROSS_COMPILE=i$family86-linux-gnu- + break + fi + done + ;; + X64) + TEMP_CROSS_COMPILE=x86_64-linux-gnu- ;; + *) + echo "Unsupported target architecture '$PLATFORM_ARCH'!" >&2 + ;; + esac fi } function get_gcc_version { + $1 -v >/dev/null 2>&1 || return 1 gcc_version=$($1 -dumpversion) + MAJVER=`echo $gcc_version | cut -d. -f1` + case $gcc_version in - 4.6*|4.7*|4.8*|4.9*) + 4*) echo GCC$(echo ${gcc_version} | awk -F. '{print $1$2}') ;; *) - echo "Unknown toolchain version '$gcc_version'" >&2 - echo "Attempting to build using GCC49 profile." >&2 - echo GCC49 + if [ "$MAJVER" -ge 5 ]; then + # We only have a GCC5 build profile for now, so... + # echo GCC$MAJVER + echo GCC5 + else + echo "Unknown toolchain version '$gcc_version'" >&2 + echo "Attempting to build using GCC49 profile." >&2 + echo GCC49 + fi ;; esac + + return 0 } function get_clang_version { clang_version=`$1 --version | head -1 | sed 's/^.*version\s*\([0-9]*\).\([0-9]*\).*/\1\2/g'` - echo "CLANG$clang_version" + case $clang_version in + 35*) + echo "CLANG$clang_version" + ;; + *) + echo "Unknown toolchain version '$clang_version'" >&2 + echo "Attempting to build using CLANG35 profile." >&2 + echo CLANG35 + ;; + esac +} + +function download_patch_openssl +{ + OPENSSL_VER=`ls EDKII_openssl-*.patch | sed 's/^.*-\([0-9.a-z]*\).patch/\1/'` + OPENSSL_TAR=openssl-${OPENSSL_VER}.tar.gz + OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR} + OPENSSL_DIR=openssl-${OPENSSL_VER} + OPENSSL_PATCH=EDKII_openssl-${OPENSSL_VER}.patch + + if [ -e "$WORKSPACE"/CryptoPkg/Include/openssl/opensslconf.h ]; then + echo "OpenSSL already imported!" + return 0 + fi + + # Use cached copy if available + if [ -f "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR" ]; then + tar xzf "$WORKSPACE"/LinaroPkg/"$OPENSSL_TAR" + else + wget -O - -q ${OPENSSL_URL} | tar xzf - + fi + + echo "Importing OpenSSL $OPENSSL_VER" + ( cd ${OPENSSL_DIR}; patch -p1 -i ../${OPENSSL_PATCH} ) + ./Install.sh + + if [ $? -eq 0 ]; then + OPENSSL_CONFIGURED=TRUE + else + echo "OpenSSL $OPENSSL_VER import failed!" >&2 + rm -rf $OPENSSL_TAR $OPENSSL_DIR + return 1 + fi +} + +function clone_process_openssl +{ + if [ -e openssl/include/openssl/opensslconf.h ]; then + echo "OpenSSL already imported!" + return 0 + fi + + OPENSSL_VER=`git ls-remote --tags git://github.com/openssl/openssl.git | awk '{print $2;}' | sed 's-^refs/tags/--g' | grep -v '\^{}$' | grep '^OpenSSL' | grep -v '^OpenSSL_FIPS' | tail -1 | sed -n 's/^OpenSSL_\([0-9]*\)_\([0-9]*\)_\([0-9.a-z]*\)$/openssl-\1.\2.\3\n/p'` + OPENSSL_TAR="$OPENSSL_VER.tar.gz" + if [ -z "$OPENSSL_TAR" ]; then + return 1 + fi + OPENSSL_URL=http://www.openssl.org/source/${OPENSSL_TAR} + if [ ! -f "$OPENSSL_TAR" ]; then + wget -q ${OPENSSL_URL} + else + rm -rf openssl + fi + tar xzf "$OPENSSL_TAR" + mv "$OPENSSL_VER" openssl + # perl process_files.pl # not needed and not currently working + return $? +} + +function import_openssl +{ + # Don't re-import if already done + if [ "$OPENSSL_CONFIGURED" = "TRUE" ]; then + echo "Using existing OpenSSL $OPENSSL_VER" + return 0 + fi + + cd CryptoPkg/Library/OpensslLib/ + if [ -f EDKII_openssl-*.patch ]; then + download_patch_openssl + else + clone_process_openssl + fi + RET=$? + cd - >/dev/null + return $RET +} + +function search_packages_path +{ + file="$1" + + IFS=: + for dir in $PACKAGES_PATH; do + if [ -e "$dir/$file" ]; then + echo "$dir/$file" + unset IFS + return 0 + fi + done + + echo "$file not found in any directory on PACKAGES_PATH!" >&2 + unset IFS + return 1 } diff --git a/uefi-tools/edk2-build.sh b/uefi-tools/edk2-build.sh new file mode 100755 index 0000000..46a9575 --- /dev/null +++ b/uefi-tools/edk2-build.sh @@ -0,0 +1,388 @@ +#!/bin/bash + +# +# edk2-build.sh: evolution of uefi-build.sh for edk2-platforms +# + +unset MAKEFLAGS # BaseTools not safe to build parallel, prevent env overrides + +TOOLS_DIR="`dirname $0`" +. "$TOOLS_DIR"/common-functions +PLATFORM_CONFIG="-c $TOOLS_DIR/edk2-platforms.config" +ARCH= +VERBOSE=0 # Override with -v +ATF_DIR= +TOS_DIR= +TOOLCHAIN="gcc" # Override with -T +WORKSPACE= +EDK2_DIR= +PLATFORMS_DIR= +NON_OSI_DIR= +OPENSSL_CONFIGURED=FALSE + +# Number of threads to use for build +export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1)) + +function do_build +{ + PLATFORM_ARCH=`echo $board | cut -s -d: -f2` + if [ -n "$PLATFORM_ARCH" ]; then + board=`echo $board | cut -d: -f1` + else + PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`" + fi + PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname` ($PLATFORM_ARCH)" + if [ -z "$PLATFORM_ARCH" ]; then + echo "Unknown target architecture - aborting!" >&2 + return 1 + fi + 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="" + COMPONENT_INF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o inf`" + + TEMP_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`" + 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 + + if [ $VERBOSE -eq 1 ]; then + echo "Setting build parallellism to $NUM_THREADS processes" + 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") + PLATFORM_TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc` + ;; + "clang") + PLATFORM_TOOLCHAIN=`get_clang_version clang` + ;; + *) + # Use command-line specified profile directly + PLATFORM_TOOLCHAIN=$TOOLCHAIN + ;; + esac + echo "PLATFORM_TOOLCHAIN is ${PLATFORM_TOOLCHAIN}" + + export ${PLATFORM_TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE + echo "Toolchain prefix: ${PLATFORM_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:" + if [ $VERBOSE -eq 1 ]; then + echo " ${PLATFORM_PREBUILD_CMDS}" + fi + eval ${PLATFORM_PREBUILD_CMDS} + fi + + if [ -n "$COMPONENT_INF" ]; then + # Build a standalone component + if [ $VERBOSE -eq 1 ]; then + echo "build -n $NUM_THREADS -a \"$PLATFORM_ARCH\" -t ${PLATFORM_TOOLCHAIN} -p \"$PLATFORM_DSC\"" \ + "-m \"$COMPONENT_INF\" -b "$target" ${PLATFORM_BUILDFLAGS}" + fi + build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${PLATFORM_TOOLCHAIN} -p "$PLATFORM_DSC" \ + -m "$COMPONENT_INF" -b "$target" ${PLATFORM_BUILDFLAGS} + else + # Build a platform + if [ $VERBOSE -eq 1 ]; then + echo "build -n $NUM_THREADS -a \"$PLATFORM_ARCH\" -t ${PLATFORM_TOOLCHAIN} -p \"$PLATFORM_DSC\"" \ + "-b "$target" ${PLATFORM_BUILDFLAGS}" + fi + build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${PLATFORM_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"_${PLATFORM_TOOLCHAIN} $board" + fi + $TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_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"_${PLATFORM_TOOLCHAIN} $board" + fi + $TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${PLATFORM_TOOLCHAIN} $board + RESULT=$? + popd >/dev/null + fi + fi + result_log $RESULT "$PLATFORM_NAME $target" + done + unset PACKAGES_PATH +} + + +function configure_paths +{ + WORKSPACE="$PWD" + + # Check to see if we are in a UEFI repository + # refuse to continue if we aren't + if [ ! -d "$EDK2_DIR"/BaseTools ] + then + if [ -d "$PWD"/edk2/BaseTools ]; then + EDK2_DIR="$PWD"/edk2 + else + echo "ERROR: can't locate the edk2 directory" >&2 + echo " please specify -e/--edk2-dir" >&2 + exit 1 + fi + fi + + GLOBAL_PACKAGES_PATH="$EDK2_DIR" + + # locate edk2-platforms + if [ -z "$PLATFORMS_DIR" -a -d "$PWD"/edk2-platforms ]; then + PLATFORMS_DIR="$PWD"/edk2-platforms + fi + if [ -n "$PLATFORMS_DIR" ]; then + GLOBAL_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:$PLATFORMS_DIR" + fi + + # locate edk2-non-osi + if [ -z "$NON_OSI_DIR" -a -d "$PWD"/edk2-non-osi ]; then + NON_OSI_DIR="$PWD"/edk2-non-osi + fi + if [ -n "$NON_OSI_DIR" ]; then + GLOBAL_PACKAGES_PATH="$GLOBAL_PACKAGES_PATH:$NON_OSI_DIR" + fi + + # locate arm-trusted-firmware + if [ -z "$ATF_DIR" -a -d "$PWD"/arm-trusted-firmware ]; then + ATF_DIR="$PWD"/arm-trusted-firmware + fi + + export WORKSPACE +} + + +function prepare_build +{ + get_build_arch + export ARCH=$BUILD_ARCH + + export ARCH + cd $EDK2_DIR + PACKAGES_PATH=$GLOBAL_PACKAGES_PATH . edksetup.sh --reconfig + if [ $? -ne 0 ]; then + echo "Sourcing edksetup.sh failed!" >&2 + exit 1 + fi + if [ $VERBOSE -eq 1 ]; then + echo "Building BaseTools" + fi + make -C BaseTools + RET=$? + cd - + if [ $RET -ne 0 ]; then + echo " !!! 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'" + fi + i=$(($i + 1)) +done + +export PLATFORM_CONFIG + +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 + -1) # Disable build parallellism + NUM_THREADS=1 + ;; + -a | --arm-tf-dir) + shift + ATF_DIR="$1" + ;; + -c) # Already parsed above - skip this + option + shift + ;; + -b | --build-target) + shift + echo "Adding Build target: $1" + TARGETS=(${TARGETS[@]} $1) + ;; + -D) # Pass through as -D option to 'build' + shift + echo "Adding Macro: -D $1" + EXTRA_OPTIONS=(${EXTRA_OPTIONS[@]} "-D" $1) + ;; + -e | --edk2-dir) + shift + export EDK2_DIR=$1 + ;; + -h | --help) + usage + exit + ;; + -n | --non-osi-dir) + shift + NON_OSI_DIR=$1 + ;; + -p | --platforms-dir) + shift + PLATFORMS_DIR=$1 + ;; + -s | --tos-dir) + shift + export TOS_DIR="$1" + ;; + -T) # Set specific toolchain tag, or clang/gcc for autoselection + shift + echo "Setting toolchain tag to '$1'" + TOOLCHAIN="$1" + ;; + -v) + VERBOSE=1 + ;; + all) # Add all targets in configuration file to list + builds=(${boards[@]}) + NUM_TARGETS=$(($NUM_TARGETS + 1)) + ;; + *) # Try to match target in configuration file, add to list + MATCH=0 + for board in "${boards[@]}" ; do + if [ "`echo $1 | cut -d: -f1`" == $board ]; then + MATCH=1 + builds=(${builds[@]} "$1") + 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 [ $NUM_TARGETS -le 0 ]; then + echo "No targets specified - exiting!" >&2 + exit 0 +fi + +export VERBOSE + +configure_paths + +prepare_build + +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 + +for board in "${builds[@]}" ; do + do_build +done + +result_print diff --git a/uefi-tools/edk2-platforms.config b/uefi-tools/edk2-platforms.config new file mode 100644 index 0000000..7c32b7d --- /dev/null +++ b/uefi-tools/edk2-platforms.config @@ -0,0 +1,128 @@ +# Platform build configurations for Linaro EDK2 builds +# ==================================================== +# The configuration file format is extremely simplistic: +# - Each platform has a short name. +# - A platform entry starts by the short name held in square brackets, '[]' +# - Within each entry, all options are described in a NAME=VALUE scheme, +# with the name being whatever comes before the first '=' on the line, +# and the value being everything that comes after it. +# +# Mandatory options: +# - LONGNAME A more descriptive name of the platform. +# - DSC Pointer to the EDK2 build description file. (The +# pandaboard is excused, all other ports must have this.) +# - ARCH String describing the architecture to build for. +# Currently supported are AARCH32 and AARCH64. +# - UEFI_BIN Name of executable image produced. +# - UEFI_IMAGE_DIR Build output directory name, relative to 'Build'. +# +# Options for Trusted OS +# Note that OP-TEE (https://github.com/OP-TEE/optee_os) is the only currently +# supported Trusted OS +# - BUILD_TOS Set to "yes" if the build should automatically build +# Trusted OS, mainly for ARM Trusted Firmware. +# If this is set, you must also set ATF_SPD! +# Else we will not know which specific Trusted OS to +# build. +# Set to "debug" to create a debug build. +# - TOS_PLATFORM Platform name for Trusted OS build, if +# different from ARM Trusted Firmware platform +# or UEFI platform name. +# - TOS_PLATFORM_FLAVOR If a core platform has multiple flavors, specify which +# flavor here. +# +# Options for ARM Trusted Firmware platforms +# - BUILD_ATF Set to "yes" if the build should automatically build +# ARM Trusted Firmware and a fip containing UEFI image. +# Set to "debug" to create a debug build. +# - ATF_PLATFORM Platform name for ARM Trusted Firmware build, if +# different from UEFI platform name. +# - SCP_BIN SCP image to pass to ARM Trusted Firmware. +# - TOS_BIN Trusted OS image to pass to ARM Trusted Firmware. +# The path is relative to +# $EDK2_DIR/Build/$PLATFORM_IMAGE_DIR/$BUILD_PROFILE/FV/. +# To actually build the Trusted OS, you must also set +# ATF_SPD. +# - ATF_SPD Name of Secure Payload Dispatcher +# To actually build the Trusted OS, you must also set +# TOS_BIN. +# +# Optional options: +# - BUILDFLAGS Any special flags you want to pass to the build command. +# - ATF_BUILDFLAGS Any special flags you want to pass to the ARM Trusted +# Firmware build command. +# - TOS_BUILDFLAGS Any special flags you want to pass to the Trusted OS +# build command. +# - EXTRA_FILES Any additional files to be copied to output dir. +# - PREBUILD_CMDS Any commands you want to execute before the build step. +# - POSTBUILD_CMDS Any commands you want to execute after the build step. +# - PACKAGES_PATH Additional directories to search for packages under. +# - INF Point to a .inf (in addition to a .dsc) in order to +# build a single component (standalone driver/app). +# + +[juno] +LONGNAME=aarch64 Juno +DSC=Platform/ARM/JunoPkg/ArmJuno.dsc +BUILDFLAGS= +ARCH=AARCH64 +BUILD_ATF=yes +SCP_BIN=Platform/ARM/Juno/bl30.bin +UEFI_BIN=BL33_AP_UEFI.fd +UEFI_IMAGE_DIR=ArmJuno + +# ARM FVP BASE AEMv8-A model +[fvp] +LONGNAME=aarch64 FVP RTSM +DSC=Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc +BUILDFLAGS=-D EDK2_ENABLE_SMSC_91X=1 -D EDK2_ENABLE_PL111=1 +ARCH=AARCH64 +BUILD_ATF=yes +UEFI_BIN=FVP_AARCH64_EFI.fd +UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64 + +[tc2] +LONGNAME=Versatile Express TC2 +BUILDFLAGS=-D ARM_BIGLITTLE_TC2=1 +DSC=Platform/ARM/VExpressPkg/ArmVExpress-CTA15-A7.dsc +ARCH=ARM + +[overdrive] +LONGNAME=AMD Overdrive +DSC=Platform/AMD/OverdriveBoard/OverdriveBoard.dsc +ARCH=AARCH64 + +[overdrive1000] +LONGNAME=SoftIron Overdrive 1000 +DSC=Platform/SoftIron/Overdrive1000Board/Overdrive1000Board.dsc +ARCH=AARCH64 + +[cello] +LONGNAME=LeMaker Cello +DSC=Platform/LeMaker/CelloBoard/CelloBoard.dsc +ARCH=AARCH64 + +[hikey] +LONGNAME=HiKey +DSC=Platform/Hisilicon/HiKey/HiKey.dsc +ARCH=AARCH64 + +[d02] +LONGNAME=Hisilicon D02 +DSC=Platform/Hisilicon/D02/Pv660D02.dsc +ARCH=AARCH64 + +[d03] +LONGNAME=Hisilicon D03 +DSC=Platform/Hisilicon/D03/D03.dsc +ARCH=AARCH64 + +[d05] +LONGNAME=HiSilicon D05 +DSC=Platform/Hisilicon/D05/D05.dsc +ARCH=AARCH64 + +[armada70x0] +LONGNAME=Marvell Armada 70x0 +DSC=Platform/Marvell/Armada/Armada70x0.dsc +ARCH=AARCH64 diff --git a/uefi-tools/edk2-to-git-am.sh b/uefi-tools/edk2-to-git-am.sh new file mode 100755 index 0000000..d3f8a27 --- /dev/null +++ b/uefi-tools/edk2-to-git-am.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# +# Convert one or more git patches that have had it's CR:s stripped out by SMTP +# into something th + +if [ $# -lt 1 ]; then + echo "usage: `basename $0` " >&2 + exit 1 +fi + +convert_file() +{ + sed -i "s/$/\r/g" "$1" + sed -i "s:^\(---\|+++ \)\(.*\)\r$:\1\2:g" "$1" +} + +while [ $# -gt 0 ]; do + convert_file "$1" + shift +done diff --git a/uefi-tools/handy-snippets.sh b/uefi-tools/handy-snippets.sh new file mode 100644 index 0000000..834ca74 --- /dev/null +++ b/uefi-tools/handy-snippets.sh @@ -0,0 +1,8 @@ +# +# First step in looking for duplicate file GUIDs +# +# find . -name "*.inf" | \ +# xargs grep -H FILE_GUID | \ +# sed 's/^\(.*\):[ \t]*FILE_GUID[ \t]*=[ \t]*\([a-f.A-F.0-9.-]*\).*\r$/\2 \1/' | \ +# sort +# diff --git a/uefi-tools/parse-platforms.py b/uefi-tools/parse-platforms.py index 5aa4283..af44038 100755 --- a/uefi-tools/parse-platforms.py +++ b/uefi-tools/parse-platforms.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/python import sys, os, argparse, ConfigParser diff --git a/uefi-tools/platforms.config b/uefi-tools/platforms.config index adaf6c0..6db1340 100644 --- a/uefi-tools/platforms.config +++ b/uefi-tools/platforms.config @@ -46,6 +46,9 @@ # - ATF_SPD Name of Secure Payload Dispatcher # To actually build the Trusted OS, you must also set # TOS_BIN. +# - SPM_BIN Prebuilt Secure Partition image to pass to ARM Trusted Firmware. +# The path is relative to +# $EDK2_DIR/Build/StandaloneSmmPkg/$BUILD_PROFILE/FV/. # # Optional options: # - BUILDFLAGS Any special flags you want to pass to the build command. @@ -57,10 +60,8 @@ # - PREBUILD_CMDS Any commands you want to execute before the build step. # - POSTBUILD_CMDS Any commands you want to execute after the build step. # - PACKAGES_PATH Additional directories to search for packages under. -# -# Special options: -# - BUILDCMD Command to call instead of the normal build command. -# Only for pandaboard, not to be used for new ports. +# - INF Point to a .inf (in addition to a .dsc) in order to +# build a single component (standalone driver/app). # [juno] @@ -92,6 +93,26 @@ BUILD_ATF=yes UEFI_BIN=FVP_AARCH64_EFI.fd UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64 +# ARM FVP BASE AEMv8-A model +[fvp_mm_standalone] +LONGNAME=FVP Base for MM Standalone image in secure world +DSC=StandaloneSmmPkg/StandaloneSmmPkg.dsc +ARCH=AARCH64 +UEFI_BIN=FVP_AARCH64_EFI_MM_STANDALONE.fd +UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64-MM-Standalone + +[fvp_mm_normal] +LONGNAME=FVP Base for UEFI image with MM support in normal world +DSC=OpenPlatformPkg/Platforms/ARM/VExpress/ArmVExpress-FVP-AArch64.dsc +BUILDFLAGS=-D EDK2_OUT_DIR=Build/ArmVExpress-FVP-AArch64-MM-Normal -D ARM_STANDALONE_MM_ENABLE=TRUE +ARCH=AARCH64 +BUILD_ATF=debug +UEFI_BIN=FVP_AARCH64_EFI.fd +UEFI_IMAGE_DIR=ArmVExpress-FVP-AArch64-MM-Normal +ATF_PLATFORM=fvp +SPM_BIN=STANDALONESMM.fd +ATF_BUILDFLAGS=ARM_BL31_IN_DRAM=1 + [tc2] LONGNAME=Versatile Express TC2 BUILDFLAGS=-D ARM_BIGLITTLE_TC2=1 @@ -100,14 +121,6 @@ ARCH=ARM UEFI_BIN=ARM_VEXPRESS_CTA15A7_EFI.fd UEFI_IMAGE_DIR=ArmVExpress-CTA15-A7 -[panda] -LONGNAME=TI Pandaboard -BUILDCMD=./PandaBoardPkg/build.sh -BUILDFLAGS= -ARCH=ARM -UEFI_BIN=MLO -UEFI_IMAGE_DIR=PandaBoard - [beagle] LONGNAME=BeagleBoard BUILDFLAGS= @@ -130,14 +143,6 @@ ARCH=ARM UEFI_BIN=D01.fd UEFI_IMAGE_DIR=D01 -[bbb] -LONGNAME=Texas Instruments BeagleBone Black -BUILDFLAGS= -DSC=TexasInstrumentsPkg/BeagleBoneBlackPkg/BeagleBoneBlackPkg.dsc -ARCH=ARM -UEFI_BIN=BEAGLEBONEBLACK_EFI.fd -UEFI_IMAGE_DIR=BeagleBoneBlack - [qemu] LONGNAME=QEMU ARM Emulator BUILDFLAGS=-D INTEL_BDS @@ -171,6 +176,15 @@ PACKAGES_PATH=OpenPlatformPkg/Platforms/AMD/Styx/Binary UEFI_BIN=STYX_ROM.fd UEFI_IMAGE_DIR=Overdrive +[overdrive1000] +LONGNAME=SoftIron Overdrive 1000 +BUILDFLAGS=-D INTEL_BDS +DSC=OpenPlatformPkg/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc +ARCH=AARCH64 +PACKAGES_PATH=OpenPlatformPkg/Platforms/AMD/Styx/Binary +UEFI_BIN=OVERDRIVE1000_ROM.fd +UEFI_IMAGE_DIR=Overdrive1000Board + [cello] LONGNAME=LeMaker Cello BUILDFLAGS=-D INTEL_BDS @@ -198,13 +212,24 @@ SCP_BIN=OpenPlatformPkg/Platforms/Hisilicon/HiKey/Binary/mcuimage.bin # Uncomment this to use UART0 as the OP-TEE Trusted OS console #TOS_BUILDFLAGS=CFG_CONSOLE_UART=0 +[hikey960] +LONGNAME=Hikey960 +DSC=OpenPlatformPkg/Platforms/Hisilicon/HiKey960/HiKey960.dsc +ARCH=AARCH64 +UEFI_BIN=BL33_AP_UEFI.fd +UEFI_IMAGE_DIR=HiKey960 +BUILD_ATF=yes +SCP_BIN=OpenPlatformPkg/Platforms/Hisilicon/HiKey960/Binary/lpm3.img +# Uncomment this to use UART5 as the EDK2 console for v1 hardware +#BUILDFLAGS=-DSERIAL_BASE=0xFDF05000 + [xen64] LONGNAME=AArch64 Xen guest BUILDFLAGS= -DSC=ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc +DSC=ArmVirtPkg/ArmVirtXen.dsc ARCH=AARCH64 UEFI_BIN=XEN_EFI.fd -UEFI_IMAGE_DIR=ArmVirtualizationXen-AARCH64 +UEFI_IMAGE_DIR=ArmVirtXen-AARCH64 [aarch64-shell] LONGNAME=AArch64 EFI Shell @@ -243,3 +268,30 @@ DSC=OpenPlatformPkg/Platforms/Hisilicon/D03/D03.dsc ARCH=AARCH64 UEFI_BIN=D03.fd UEFI_IMAGE_DIR=D03 + +[d05] +LONGNAME=HiSilicon D05 +DSC=OpenPlatformPkg/Platforms/Hisilicon/D05/D05.dsc +ARCH=AARCH64 +UEFI_BIN=D05.fd +UEFI_IMAGE_DIR=D05 + +[armada70x0] +LONGNAME=Marvell Armada 70x0 +DSC=OpenPlatformPkg/Platforms/Marvell/Armada/Armada70x0.dsc +ARCH=AARCH64 + +[ovmfx64] +LONGNAME=OVMF Qemu X64 +DSC=OvmfPkg/OvmfPkgX64.dsc +ARCH=X64 + +[hello] +LONGNAME=EDK2 Hello World Example +DSC=MdeModulePkg/MdeModulePkg.dsc +INF=MdeModulePkg/Application/HelloWorld/HelloWorld.inf + +[chaoskey] +LONGNAME=Altus Metrum ChaosKey Driver +DSC=OptionRomPkg/OptionRomPkg.dsc +INF=OpenPlatformPkg/Drivers/Usb/Misc/ChaosKeyDxe/ChaosKeyDxe.inf diff --git a/uefi-tools/uefi-build.sh b/uefi-tools/uefi-build.sh index 0fa50ed..ce5d727 100755 --- a/uefi-tools/uefi-build.sh +++ b/uefi-tools/uefi-build.sh @@ -23,7 +23,7 @@ OPENSSL_CONFIGURED=FALSE # Number of threads to use for build export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1)) -function build_platform +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`" @@ -31,9 +31,23 @@ function build_platform 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_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`" 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=: @@ -60,7 +74,18 @@ function build_platform echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH" fi - set_cross_compile + if [[ "${PLATFORM_BUILDFLAGS}" =~ "SECURE_BOOT_ENABLE=TRUE" ]]; then + import_openssl + fi + + if [ -n "$CROSS_COMPILE_64" -a "$PLATFORM_ARCH" == "AARCH64" ]; then + TEMP_CROSS_COMPILE="$CROSS_COMPILE_64" + elif [ -n "$CROSS_COMPILE_32" -a "$PLATFORM_ARCH" == "ARM" ]; then + TEMP_CROSS_COMPILE="$CROSS_COMPILE_32" + else + set_cross_compile + fi + CROSS_COMPILE="$TEMP_CROSS_COMPILE" echo "Building $PLATFORM_NAME - $PLATFORM_ARCH" @@ -73,12 +98,20 @@ function build_platform case $TOOLCHAIN in "gcc") - export TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc` + TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc` + if [ $? -ne 0 ]; then + echo "${CROSS_COMPILE}gcc not found!" >&2 + return 1 + fi ;; "clang") - export TOOLCHAIN=`get_clang_version clang` + TOOLCHAIN=`get_clang_version clang` + if [ $? -ne 0 ]; then + return 1 + fi ;; esac + export TOOLCHAIN echo "TOOLCHAIN is ${TOOLCHAIN}" export ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE @@ -90,14 +123,17 @@ function build_platform echo "Run pre build commands" eval ${PLATFORM_PREBUILD_CMDS} fi - if [ X"$PLATFORM_BUILDCMD" == X"" ]; then - echo ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" -b "$target" \ - ${PLATFORM_BUILDFLAGS} - build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" -b "$target" \ - ${PLATFORM_BUILDFLAGS} + + 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 - ${PLATFORM_BUILDCMD} -b "$target" ${PLATFORM_BUILDFLAGS} + # 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 @@ -127,6 +163,31 @@ function build_platform } +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` @@ -142,11 +203,12 @@ function uefishell ;; esac export ARCH + export EDK_TOOLS_PATH=`pwd`/BaseTools + clearcache + . edksetup.sh BaseTools if [ $VERBOSE -eq 1 ]; then echo "Building BaseTools" fi - export EDK_TOOLS_PATH=`pwd`/BaseTools - . edksetup.sh BaseTools make -C $EDK_TOOLS_PATH if [ $? -ne 0 ]; then echo " !!! UEFI BaseTools failed to build !!! " >&2 @@ -187,7 +249,7 @@ do fi case "$FILE_ARG" in /*) - PLATFORM_CONFIG="-c \"$FILE_ARG\"" + PLATFORM_CONFIG="-c $FILE_ARG" ;; *) PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`" @@ -225,6 +287,10 @@ while [ "$1" != "" ]; do shift ATF_DIR="$1" ;; + "-A" ) + shift + DEFAULT_PLATFORM_ARCH="$1" + ;; "-c" ) # Already parsed above - skip this + option shift @@ -325,7 +391,7 @@ if [ X"$TOOLCHAIN" = X"" ]; then fi for board in "${builds[@]}" ; do - build_platform + do_build done result_print