Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
roms: lift "edk2-funcs.sh" from "tests/uefi-test-tools/build.sh"
Extract the dense logic for architecture and toolchain massaging from "tests/uefi-test-tools/build.sh", to a set of small functions. We'll reuse these functions for building full platform firmware images. Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Tested-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com>
- Loading branch information
Showing
2 changed files
with
246 additions
and
91 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,240 @@ | ||
# Shell script that defines functions for determining some environmental | ||
# characteristics for the edk2 "build" utility. | ||
# | ||
# This script is meant to be sourced, in a bash environment. | ||
# | ||
# Copyright (C) 2019 Red Hat, Inc. | ||
# | ||
# This program and the accompanying materials are licensed and made available | ||
# under the terms and conditions of the BSD License that accompanies this | ||
# distribution. The full text of the license may be found at | ||
# <http://opensource.org/licenses/bsd-license.php>. | ||
# | ||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT | ||
# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||
|
||
|
||
# Verify whether the QEMU system emulation target is supported by the UEFI spec | ||
# and edk2. Print a message to the standard error, and return with nonzero | ||
# status, if verification fails. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_verify_arch() | ||
{ | ||
local emulation_target="$1" | ||
local program_name=$(basename -- "$0") | ||
|
||
case "$emulation_target" in | ||
(arm|aarch64|i386|x86_64) | ||
;; | ||
(*) | ||
printf '%s: unknown/unsupported QEMU system emulation target "%s"\n' \ | ||
"$program_name" "$emulation_target" >&2 | ||
return 1 | ||
;; | ||
esac | ||
} | ||
|
||
|
||
# Translate the QEMU system emulation target to the edk2 architecture | ||
# identifier. Print the result to the standard output. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_get_arch() | ||
{ | ||
local emulation_target="$1" | ||
|
||
if ! qemu_edk2_verify_arch "$emulation_target"; then | ||
return 1 | ||
fi | ||
|
||
case "$emulation_target" in | ||
(arm) | ||
printf 'ARM\n' | ||
;; | ||
(aarch64) | ||
printf 'AARCH64\n' | ||
;; | ||
(i386) | ||
printf 'IA32\n' | ||
;; | ||
(x86_64) | ||
printf 'X64\n' | ||
;; | ||
esac | ||
} | ||
|
||
|
||
# Translate the QEMU system emulation target to the gcc cross-compilation | ||
# architecture identifier. Print the result to the standard output. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_get_gcc_arch() | ||
{ | ||
local emulation_target="$1" | ||
|
||
if ! qemu_edk2_verify_arch "$emulation_target"; then | ||
return 1 | ||
fi | ||
|
||
case "$emulation_target" in | ||
(arm|aarch64|x86_64) | ||
printf '%s\n' "$emulation_target" | ||
;; | ||
(i386) | ||
printf 'i686\n' | ||
;; | ||
esac | ||
} | ||
|
||
|
||
# Determine the gcc cross-compiler prefix (if any) for use with the edk2 | ||
# toolchain. Print the result to the standard output. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_get_cross_prefix() | ||
{ | ||
local emulation_target="$1" | ||
local gcc_arch | ||
local host_arch | ||
|
||
if ! gcc_arch=$(qemu_edk2_get_gcc_arch "$emulation_target"); then | ||
return 1 | ||
fi | ||
|
||
host_arch=$(uname -m) | ||
|
||
if [ "$gcc_arch" == "$host_arch" ] || | ||
( [ "$gcc_arch" == i686 ] && [ "$host_arch" == x86_64 ] ); then | ||
# no cross-compiler needed | ||
: | ||
else | ||
printf '%s-linux-gnu-\n' "$gcc_arch" | ||
fi | ||
} | ||
|
||
|
||
# Determine the edk2 toolchain tag for the QEMU system emulation target. Print | ||
# the result to the standard output. Print a message to the standard error, and | ||
# return with nonzero status, if the (conditional) gcc version check fails. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_get_toolchain() | ||
{ | ||
local emulation_target="$1" | ||
local program_name=$(basename -- "$0") | ||
local cross_prefix | ||
local gcc_version | ||
|
||
if ! qemu_edk2_verify_arch "$emulation_target"; then | ||
return 1 | ||
fi | ||
|
||
case "$emulation_target" in | ||
(arm|aarch64) | ||
printf 'GCC5\n' | ||
;; | ||
|
||
(i386|x86_64) | ||
if ! cross_prefix=$(qemu_edk2_get_cross_prefix "$emulation_target"); then | ||
return 1 | ||
fi | ||
|
||
gcc_version=$("${cross_prefix}gcc" -v 2>&1 | tail -1 | awk '{print $3}') | ||
# Run "git-blame" on "OvmfPkg/build.sh" in edk2 for more information on | ||
# the mapping below. | ||
case "$gcc_version" in | ||
([1-3].*|4.[0-3].*) | ||
printf '%s: unsupported gcc version "%s"\n' \ | ||
"$program_name" "$gcc_version" >&2 | ||
return 1 | ||
;; | ||
(4.4.*) | ||
printf 'GCC44\n' | ||
;; | ||
(4.5.*) | ||
printf 'GCC45\n' | ||
;; | ||
(4.6.*) | ||
printf 'GCC46\n' | ||
;; | ||
(4.7.*) | ||
printf 'GCC47\n' | ||
;; | ||
(4.8.*) | ||
printf 'GCC48\n' | ||
;; | ||
(4.9.*|6.[0-2].*) | ||
printf 'GCC49\n' | ||
;; | ||
(*) | ||
printf 'GCC5\n' | ||
;; | ||
esac | ||
;; | ||
esac | ||
} | ||
|
||
|
||
# Determine the name of the environment variable that exposes the | ||
# cross-compiler prefix to the edk2 "build" utility. Print the result to the | ||
# standard output. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_get_cross_prefix_var() | ||
{ | ||
local emulation_target="$1" | ||
local edk2_toolchain | ||
local edk2_arch | ||
|
||
if ! edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target"); then | ||
return 1 | ||
fi | ||
|
||
case "$emulation_target" in | ||
(arm|aarch64) | ||
if ! edk2_arch=$(qemu_edk2_get_arch "$emulation_target"); then | ||
return 1 | ||
fi | ||
printf '%s_%s_PREFIX\n' "$edk2_toolchain" "$edk2_arch" | ||
;; | ||
(i386|x86_64) | ||
printf '%s_BIN\n' "$edk2_toolchain" | ||
;; | ||
esac | ||
} | ||
|
||
|
||
# Set and export the environment variable(s) necessary for cross-compilation, | ||
# whenever needed by the edk2 "build" utility. | ||
# | ||
# Parameters: | ||
# $1: QEMU system emulation target | ||
qemu_edk2_set_cross_env() | ||
{ | ||
local emulation_target="$1" | ||
local cross_prefix | ||
local cross_prefix_var | ||
|
||
if ! cross_prefix=$(qemu_edk2_get_cross_prefix "$emulation_target"); then | ||
return 1 | ||
fi | ||
|
||
if [ -z "$cross_prefix" ]; then | ||
# Nothing to do. | ||
return 0 | ||
fi | ||
|
||
if ! cross_prefix_var=$(qemu_edk2_get_cross_prefix_var \ | ||
"$emulation_target"); then | ||
return 1 | ||
fi | ||
|
||
eval "export $cross_prefix_var=\$cross_prefix" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters