From: "Philippe Mathieu-Daudé" <philmd@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>,
berrange@redhat.com, imammedo@redhat.com, kraxel@redhat.com,
mst@redhat.com, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 01/10] roms: lift "edk2-funcs.sh" from "tests/uefi-test-tools/build.sh"
Date: Sun, 10 Mar 2019 18:23:37 +0100 [thread overview]
Message-ID: <7c7aa3c9-8dd4-3a76-b508-7c7fca10364a@redhat.com> (raw)
In-Reply-To: <57cc72f8-1999-94ec-8c7f-7f92cb40faa3@redhat.com>
Hi Laszlo,
On 3/10/19 4:17 PM, Philippe Mathieu-Daudé wrote:
> On 3/9/19 1:48 AM, Laszlo Ersek wrote:
>> 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>
>> ---
>> roms/edk2-funcs.sh | 240 ++++++++++++++++++++
>> tests/uefi-test-tools/build.sh | 97 +-------
>> 2 files changed, 246 insertions(+), 91 deletions(-)
>>
>> diff --git a/roms/edk2-funcs.sh b/roms/edk2-funcs.sh
>> new file mode 100644
>> index 000000000000..908c7665c6ed
>> --- /dev/null
>> +++ b/roms/edk2-funcs.sh
>> @@ -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.
>> +#
>> +# 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"
Testing on Ubuntu (bionic), the gcc-arm-linux-gnueabihf provides the
arm-linux-gnueabihf-gcc binary, therefore I use:
GCC5_ARM_PREFIX="arm-linux-gnueabihf-" make -C roms efi
But this function enforce cross prefix to be arm-linux-gnu- :(
I tried with the following Linaro toolchains:
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf.tar.xz
With the distrib toolchain or the Linaro enumerated, I get:
/bin/sh: 1: arm-linux-gnu-gcc: not found
>> + 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"
>> +}
>> diff --git a/tests/uefi-test-tools/build.sh b/tests/uefi-test-tools/build.sh
>> index 155cb75c4ddb..e2b52c855c39 100755
>> --- a/tests/uefi-test-tools/build.sh
>> +++ b/tests/uefi-test-tools/build.sh
>> @@ -38,97 +38,12 @@ if [ $ret -ne 0 ]; then
>> exit $ret
>> fi
>>
>> -# Map the QEMU system emulation target to the following types of architecture
>> -# identifiers:
>> -# - edk2,
>> -# - gcc cross-compilation.
>> -# Cover only those targets that are supported by the UEFI spec and edk2.
>> -case "$emulation_target" in
>> - (arm)
>> - edk2_arch=ARM
>> - gcc_arch=arm
>> - ;;
>> - (aarch64)
>> - edk2_arch=AARCH64
>> - gcc_arch=aarch64
>> - ;;
>> - (i386)
>> - edk2_arch=IA32
>> - gcc_arch=i686
>> - ;;
>> - (x86_64)
>> - edk2_arch=X64
>> - gcc_arch=x86_64
>> - ;;
>> - (*)
>> - printf '%s: unknown/unsupported QEMU system emulation target "%s"\n' \
>> - "$program_name" "$emulation_target" >&2
>> - exit 1
>> - ;;
>> -esac
>> -
>> -# Check if cross-compilation is needed.
>> -host_arch=$(uname -m)
>> -if [ "$gcc_arch" == "$host_arch" ] ||
>> - ( [ "$gcc_arch" == i686 ] && [ "$host_arch" == x86_64 ] ); then
>> - cross_prefix=
>> -else
>> - cross_prefix=${gcc_arch}-linux-gnu-
>> -fi
>> -
>> -# Expose cross_prefix (which is possibly empty) to the edk2 tools. While at it,
>> -# determine the suitable edk2 toolchain as well.
>> -# - For ARM and AARCH64, edk2 only offers the GCC5 toolchain tag, which covers
>> -# the gcc-5+ releases.
>> -# - For IA32 and X64, edk2 offers the GCC44 through GCC49 toolchain tags, in
>> -# addition to GCC5. Unfortunately, the mapping between the toolchain tags and
>> -# the actual gcc releases isn't entirely trivial. Run "git-blame" on
>> -# "OvmfPkg/build.sh" in edk2 for more information.
>> -# And, because the above is too simple, we have to assign cross_prefix to an
>> -# edk2 build variable that is specific to both the toolchain tag and the target
>> -# architecture.
>> -case "$edk2_arch" in
>> - (ARM)
>> - edk2_toolchain=GCC5
>> - export GCC5_ARM_PREFIX=$cross_prefix
>> - ;;
>> - (AARCH64)
>> - edk2_toolchain=GCC5
>> - export GCC5_AARCH64_PREFIX=$cross_prefix
>> - ;;
>> - (IA32|X64)
>> - gcc_version=$("${cross_prefix}gcc" -v 2>&1 | tail -1 | awk '{print $3}')
>> - case "$gcc_version" in
>> - ([1-3].*|4.[0-3].*)
>> - printf '%s: unsupported gcc version "%s"\n' \
>> - "$program_name" "$gcc_version" >&2
>> - exit 1
>> - ;;
>> - (4.4.*)
>> - edk2_toolchain=GCC44
>> - ;;
>> - (4.5.*)
>> - edk2_toolchain=GCC45
>> - ;;
>> - (4.6.*)
>> - edk2_toolchain=GCC46
>> - ;;
>> - (4.7.*)
>> - edk2_toolchain=GCC47
>> - ;;
>> - (4.8.*)
>> - edk2_toolchain=GCC48
>> - ;;
>> - (4.9.*|6.[0-2].*)
>> - edk2_toolchain=GCC49
>> - ;;
>> - (*)
>> - edk2_toolchain=GCC5
>> - ;;
>> - esac
>> - eval "export ${edk2_toolchain}_BIN=\$cross_prefix"
>> - ;;
>> -esac
>> +# Fetch some option arguments, and set the cross-compilation environment (if
>> +# any), for the edk2 "build" utility.
>> +source "$edk2_dir/../edk2-funcs.sh"
>> +edk2_arch=$(qemu_edk2_get_arch "$emulation_target")
>> +edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target")
>> +qemu_edk2_set_cross_env "$emulation_target"
>>
>> # Build the UEFI binary
>> mkdir -p log
>>
>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>
next prev parent reply other threads:[~2019-03-10 17:23 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-09 0:48 [Qemu-devel] [PATCH 00/10] bundle edk2 platform firmware with QEMU Laszlo Ersek
2019-03-09 0:48 ` [Qemu-devel] [PATCH 01/10] roms: lift "edk2-funcs.sh" from "tests/uefi-test-tools/build.sh" Laszlo Ersek
2019-03-10 15:17 ` Philippe Mathieu-Daudé
2019-03-10 17:23 ` Philippe Mathieu-Daudé [this message]
2019-03-11 12:07 ` Eric Blake
2019-03-11 12:11 ` Eric Blake
2019-03-09 0:48 ` [Qemu-devel] [PATCH 02/10] roms/edk2-funcs.sh: require gcc-4.8+ for building i386 and x86_64 Laszlo Ersek
2019-03-10 15:11 ` Philippe Mathieu-Daudé
2019-03-09 0:48 ` [Qemu-devel] [PATCH 03/10] tests/uefi-test-tools/build.sh: work around TianoCore#1607 Laszlo Ersek
2019-03-09 0:48 ` [Qemu-devel] [PATCH 04/10] roms/edk2: advance to tag edk2-stable201903 Laszlo Ersek
2019-03-10 22:10 ` Philippe Mathieu-Daudé
2019-03-09 0:48 ` [Qemu-devel] [PATCH 05/10] roms/edk2-funcs.sh: add the qemu_edk2_get_thread_count() function Laszlo Ersek
2019-03-10 15:13 ` Philippe Mathieu-Daudé
2019-03-09 0:48 ` [Qemu-devel] [PATCH 06/10] roms/Makefile: replace the $(EFIROM) target with "edk2-basetools" Laszlo Ersek
2019-03-09 1:32 ` Philippe Mathieu-Daudé
2019-03-09 1:53 ` Philippe Mathieu-Daudé
2019-03-10 15:16 ` Philippe Mathieu-Daudé
2019-03-09 0:48 ` [Qemu-devel] [PATCH 07/10] roms: build edk2 firmware binaries and variable store templates Laszlo Ersek
2019-03-09 16:48 ` Philippe Mathieu-Daudé
2019-03-10 15:10 ` Philippe Mathieu-Daudé
2019-03-11 12:09 ` Eric Blake
2019-03-10 11:26 ` Philippe Mathieu-Daudé
2019-03-09 0:48 ` [Qemu-devel] [PATCH 08/10] pc-bios: add " Laszlo Ersek
2019-03-09 0:48 ` [Qemu-devel] [PATCH 09/10] pc-bios: document the edk2 firmware images; add firmware descriptors Laszlo Ersek
2019-03-09 0:48 ` [Qemu-devel] [PATCH 10/10] Makefile: install the edk2 firmware images and their descriptors Laszlo Ersek
2019-03-09 1:20 ` [Qemu-devel] [PATCH 00/10] bundle edk2 platform firmware with QEMU Philippe Mathieu-Daudé
2019-03-11 10:28 ` Daniel P. Berrangé
2019-03-11 12:57 ` Michael S. Tsirkin
2019-03-11 13:00 ` Daniel P. Berrangé
2019-03-11 13:04 ` Michael S. Tsirkin
2019-03-11 13:15 ` Philippe Mathieu-Daudé
2019-03-09 13:10 ` Michal Prívozník
2019-03-11 10:23 ` Daniel P. Berrangé
2019-03-10 3:56 ` Michael S. Tsirkin
2019-03-10 11:21 ` Philippe Mathieu-Daudé
2019-03-11 10:35 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7c7aa3c9-8dd4-3a76-b508-7c7fca10364a@redhat.com \
--to=philmd@redhat.com \
--cc=berrange@redhat.com \
--cc=imammedo@redhat.com \
--cc=kraxel@redhat.com \
--cc=lersek@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).