This reverts commit 173a7a7daa
Fixes https://bugzilla.tianocore.org/show_bug.cgi?id=4528
The build.sh qemu option starts the correct qemu executable for the
selected architecture (build.sh -a option, or implicit) and uses the
correct previously built OVMF image for the selected architecture and
build target (build.sh -b option, or implicit).
With this revert, the above step will fail if there is no matching
previously built OVMF image. This is advantageous over rebuilding each
time the build.sh qemu option is used (as in the reverted commit),
because it provides a quick way to run a just-built OVMF image in place,
while:
a) Starting immediately (saving the time required for a rebuild on each
usage, if the VM is started multiple times)
b) Preserving the NVRAM contents between multiple runs (i.e. until the
image is next rebuilt)
Signed-off-by: Mike Beaton <mjsbeaton@gmail.com>
275 lines
6.2 KiB
Bash
Executable File
275 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
# Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR>
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
#
|
|
|
|
set -e
|
|
shopt -s nocasematch
|
|
|
|
|
|
#
|
|
# Setup workspace if it is not set
|
|
#
|
|
if [ -z "$WORKSPACE" ]
|
|
then
|
|
echo Initializing workspace
|
|
if [ ! -e `pwd`/edksetup.sh ]
|
|
then
|
|
cd ..
|
|
fi
|
|
# This version is for the tools in the BaseTools project.
|
|
# this assumes svn pulls have the same root dir
|
|
# export EDK_TOOLS_PATH=`pwd`/../BaseTools
|
|
# This version is for the tools source in edk2
|
|
export EDK_TOOLS_PATH=`pwd`/BaseTools
|
|
echo $EDK_TOOLS_PATH
|
|
source edksetup.sh BaseTools
|
|
else
|
|
echo Building from: $WORKSPACE
|
|
fi
|
|
|
|
#
|
|
# Configure defaults for various options
|
|
#
|
|
|
|
ARCH_IA32=no
|
|
ARCH_X64=no
|
|
BUILDTARGET=DEBUG
|
|
BUILD_OPTIONS=
|
|
PLATFORMFILE=
|
|
THREADNUMBER=0
|
|
LAST_ARG=
|
|
RUN_QEMU=no
|
|
ENABLE_FLASH=no
|
|
|
|
#
|
|
# Pick a default tool type for a given OS
|
|
#
|
|
TARGET_TOOLS=MYTOOLS
|
|
case `uname` in
|
|
CYGWIN*)
|
|
echo Cygwin not fully supported yet.
|
|
;;
|
|
Darwin*)
|
|
Major=$(uname -r | cut -f 1 -d '.')
|
|
# Major is Darwin version, not OS X version.
|
|
# OS X Yosemite 10.10.2 returns 14.
|
|
case $Major in
|
|
[156789])
|
|
echo OvmfPkg requires OS X Snow Leopard 10.6 or newer OS
|
|
exit 1
|
|
;;
|
|
10)
|
|
TARGET_TOOLS=XCODE32
|
|
;;
|
|
1[12])
|
|
TARGET_TOOLS=XCLANG
|
|
;;
|
|
*)
|
|
# Mavericks and future assume XCODE5 (clang + lldb)
|
|
TARGET_TOOLS=XCODE5
|
|
;;
|
|
esac
|
|
;;
|
|
Linux*)
|
|
gcc_version=$(gcc -v 2>&1 | tail -1 | awk '{print $3}')
|
|
case $gcc_version in
|
|
[1-3].*|4.[0-7].*)
|
|
echo OvmfPkg requires GCC4.8 or later
|
|
exit 1
|
|
;;
|
|
4.8.*)
|
|
TARGET_TOOLS=GCC48
|
|
;;
|
|
4.9.*|6.[0-2].*)
|
|
TARGET_TOOLS=GCC49
|
|
;;
|
|
*)
|
|
TARGET_TOOLS=GCC5
|
|
;;
|
|
esac
|
|
esac
|
|
|
|
#
|
|
# Scan command line to override defaults
|
|
#
|
|
|
|
for arg in "$@"
|
|
do
|
|
if [ -z "$LAST_ARG" ]; then
|
|
case $arg in
|
|
-a|-b|-t|-p|-n)
|
|
LAST_ARG=$arg
|
|
;;
|
|
qemu)
|
|
RUN_QEMU=yes
|
|
shift
|
|
break
|
|
;;
|
|
--enable-flash)
|
|
ENABLE_FLASH=yes
|
|
;;
|
|
*)
|
|
BUILD_OPTIONS="$BUILD_OPTIONS $arg"
|
|
;;
|
|
esac
|
|
else
|
|
case $LAST_ARG in
|
|
-a)
|
|
if [[ x"$arg" != x"IA32" && x"$arg" != x"X64" ]]; then
|
|
echo Unsupported processor architecture: $arg
|
|
echo Only IA32 or X64 is supported
|
|
exit 1
|
|
fi
|
|
eval ARCH_$arg=yes
|
|
;;
|
|
-b)
|
|
BUILDTARGET=$arg
|
|
;;
|
|
-p)
|
|
PLATFORMFILE=$arg
|
|
;;
|
|
-t)
|
|
TARGET_TOOLS=$arg
|
|
;;
|
|
-n)
|
|
THREADNUMBER=$arg
|
|
;;
|
|
*)
|
|
BUILD_OPTIONS="$BUILD_OPTIONS $arg"
|
|
;;
|
|
esac
|
|
LAST_ARG=
|
|
fi
|
|
shift
|
|
done
|
|
|
|
if [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "yes" ]]; then
|
|
PROCESSOR=IA32X64
|
|
Processor=Ia32X64
|
|
BUILD_OPTIONS="$BUILD_OPTIONS -a IA32 -a X64"
|
|
PLATFORM_BUILD_DIR=Ovmf3264
|
|
BUILD_ROOT_ARCH=X64
|
|
elif [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "no" ]]; then
|
|
PROCESSOR=IA32
|
|
Processor=Ia32
|
|
BUILD_OPTIONS="$BUILD_OPTIONS -a IA32"
|
|
PLATFORM_BUILD_DIR=Ovmf$Processor
|
|
BUILD_ROOT_ARCH=$PROCESSOR
|
|
else
|
|
PROCESSOR=X64
|
|
Processor=X64
|
|
BUILD_OPTIONS="$BUILD_OPTIONS -a X64"
|
|
PLATFORM_BUILD_DIR=Ovmf$Processor
|
|
BUILD_ROOT_ARCH=X64
|
|
fi
|
|
|
|
case $PROCESSOR in
|
|
IA32)
|
|
if [ -n "$QEMU_COMMAND" ]; then
|
|
#
|
|
# The user set the QEMU_COMMAND variable. We'll use it to run QEMU.
|
|
#
|
|
:
|
|
elif [ -x `which qemu-system-i386` ]; then
|
|
QEMU_COMMAND=qemu-system-i386
|
|
elif [ -x `which qemu-system-x86_64` ]; then
|
|
QEMU_COMMAND=qemu-system-x86_64
|
|
elif [ -x `which qemu` ]; then
|
|
QEMU_COMMAND=qemu
|
|
else
|
|
echo Unable to find QEMU for IA32 architecture!
|
|
exit 1
|
|
fi
|
|
;;
|
|
X64|IA32X64)
|
|
if [ -z "$QEMU_COMMAND" ]; then
|
|
#
|
|
# The user didn't set the QEMU_COMMAND variable.
|
|
#
|
|
QEMU_COMMAND=qemu-system-x86_64
|
|
fi
|
|
;;
|
|
*)
|
|
echo Unsupported processor architecture: $PROCESSOR
|
|
echo Only IA32 or X64 is supported
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if [ -z "$PLATFORMFILE" ]; then
|
|
PLATFORMFILE=$WORKSPACE/OvmfPkg/OvmfPkg$Processor.dsc
|
|
fi
|
|
|
|
if [[ "$RUN_QEMU" == "yes" ]]; then
|
|
qemu_version=$($QEMU_COMMAND -version 2>&1 | \
|
|
grep -o -E 'version [0-9]+\.[0-9]+\.[0-9]+' | \
|
|
awk '{print $2}')
|
|
case $qemu_version in
|
|
1.[6-9].*|[2-9].*.*|[1-9][0-9]*.*.*)
|
|
ENABLE_FLASH=yes
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
#
|
|
# Uncomment this block for parameter parsing debug
|
|
#
|
|
#echo RUN_QEMU=$RUN_QEMU
|
|
#echo BUILD_OPTIONS=$BUILD_OPTIONS
|
|
#echo BUILDTARGET=$BUILDTARGET
|
|
#echo TARGET_TOOLS=$TARGET_TOOLS
|
|
#echo PROCESSOR=$PROCESSOR
|
|
#echo Remaining for qemu: $*
|
|
#exit 1
|
|
|
|
BUILD_ROOT=$WORKSPACE/Build/$PLATFORM_BUILD_DIR/"$BUILDTARGET"_"$TARGET_TOOLS"
|
|
FV_DIR=$BUILD_ROOT/FV
|
|
BUILD_ROOT_ARCH=$BUILD_ROOT/$BUILD_ROOT_ARCH
|
|
QEMU_FIRMWARE_DIR=$BUILD_ROOT/QEMU
|
|
|
|
if [[ ! -f `which build` || ! -f `which GenFv` ]];
|
|
then
|
|
# build the tools if they don't yet exist. Bin scheme
|
|
echo Building tools as they are not in the path
|
|
make -C $WORKSPACE/BaseTools
|
|
elif [[ ( -f `which build` || -f `which GenFv` ) && ! -d $EDK_TOOLS_PATH/Source/C/bin ]];
|
|
then
|
|
# build the tools if they don't yet exist. BinWrapper scheme
|
|
echo Building tools no $EDK_TOOLS_PATH/Source/C/bin directory
|
|
make -C $WORKSPACE/BaseTools
|
|
else
|
|
echo using prebuilt tools
|
|
fi
|
|
|
|
#
|
|
# Run previously built OVMF image for current build options, in place.
|
|
# Do not rebuild first, rather allow multiple runs of a previously built
|
|
# image to start quickly (without rebuild), and with preserved NVRAM contents
|
|
# between runs (until the next rebuild).
|
|
#
|
|
if [[ "$RUN_QEMU" == "yes" ]]; then
|
|
if [[ ! -d $QEMU_FIRMWARE_DIR ]]; then
|
|
mkdir $QEMU_FIRMWARE_DIR
|
|
fi
|
|
ln -sf $FV_DIR/OVMF.fd $QEMU_FIRMWARE_DIR/bios.bin
|
|
if [[ "$ENABLE_FLASH" == "yes" ]]; then
|
|
QEMU_COMMAND="$QEMU_COMMAND -drive if=pflash,format=raw,file=$QEMU_FIRMWARE_DIR/bios.bin"
|
|
else
|
|
QEMU_COMMAND="$QEMU_COMMAND -L $QEMU_FIRMWARE_DIR"
|
|
fi
|
|
echo Running: $QEMU_COMMAND "$@"
|
|
$QEMU_COMMAND "$@"
|
|
exit $?
|
|
fi
|
|
|
|
#
|
|
# Build the edk2 OvmfPkg
|
|
#
|
|
echo Running edk2 build for OvmfPkg$Processor
|
|
build -p $PLATFORMFILE $BUILD_OPTIONS -b $BUILDTARGET -t $TARGET_TOOLS -n $THREADNUMBER
|
|
exit $?
|