qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 07/12] roms: build edk2 firmware binaries and


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-devel] [PATCH v2 07/12] roms: build edk2 firmware binaries and variable store templates
Date: Thu, 14 Mar 2019 19:55:54 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.5.1

On 3/14/19 7:38 PM, Philippe Mathieu-Daudé wrote:
> Hi Laszlo,
> 
> On 3/13/19 10:00 PM, Laszlo Ersek wrote:
>> Add the "efi" target to "Makefile".
>>
>> Introduce "Makefile.edk2" for building and cleaning the firmware images
>> and varstore templates.
>>
>> Collect the common bits from the recipes in the helper script
>> "edk2-build.sh".
>>
>> Signed-off-by: Laszlo Ersek <address@hidden>
>> ---
>>
>> Notes:
>>     v2:
>>     
>>     - drop comma after copyright year, in both new files [Eric]
>>     
>>     - define the SHELL macro as /bin/bash near the top of "Makefile.edk2",
>>       so that various bashisms (e.g. the "source" built-in, and the ==
>>       operator of "[") work even if /bin/sh isn't bash [Phil, Eric]
>>     
>>     - rework "Makefile.edk2" to produce xz-compressed flash device files
>>       [Dan, Michael, Phil]:
>>     
>>       - add implicit rule for compression,
>>     
>>       - mark uncompressed FD files as intermediate,
>>     
>>       - factor out the "flashdevs" macro for sharing between the "all" and
>>         ".INTERMEDIATE" targets
>>     
>>     - due to said rework above, do not pick up Phil's R-b / T-b, and
>>       Michal's and Michael's R-b's
>>
>>  roms/Makefile      |   5 +
>>  roms/Makefile.edk2 | 148 ++++++++++++++++++++
>>  roms/edk2-build.sh |  55 ++++++++
>>  3 files changed, 208 insertions(+)
>>
>> diff --git a/roms/Makefile b/roms/Makefile
>> index 2e83ececa25a..054b432834ba 100644
>> --- a/roms/Makefile
>> +++ b/roms/Makefile
>> @@ -61,6 +61,7 @@ default:
>>      @echo "  skiboot        -- update skiboot.lid"
>>      @echo "  u-boot.e500    -- update u-boot.e500"
>>      @echo "  u-boot.sam460  -- update u-boot.sam460"
>> +    @echo "  efi            -- update UEFI (edk2) platform firmware"
>>  
>>  bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
>>      cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
>> @@ -143,6 +144,9 @@ skiboot:
>>      $(MAKE) -C skiboot CROSS=$(powerpc64_cross_prefix)
>>      cp skiboot/skiboot.lid ../pc-bios/skiboot.lid
>>  
>> +efi: edk2-basetools
>> +    $(MAKE) -f Makefile.edk2
>> +
>>  clean:
>>      rm -rf seabios/.config seabios/out seabios/builds
>>      $(MAKE) -C sgabios clean
>> @@ -153,3 +157,4 @@ clean:
>>      rm -rf u-boot/build.e500
>>      $(MAKE) -C u-boot-sam460ex distclean
>>      $(MAKE) -C skiboot clean
>> +    $(MAKE) -f Makefile.edk2 clean
>> diff --git a/roms/Makefile.edk2 b/roms/Makefile.edk2
>> new file mode 100644
>> index 000000000000..e5c3036949c8
>> --- /dev/null
>> +++ b/roms/Makefile.edk2
>> @@ -0,0 +1,148 @@
>> +# Makefile for building firmware binaries and variable store templates for a
>> +# number of virtual platforms in edk2.
>> +#
>> +# 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.
>> +
>> +SHELL = /bin/bash
>> +
>> +toolchain = $(shell source ./edk2-funcs.sh && qemu_edk2_get_toolchain $(1))
>> +
>> +licenses := \
>> +    edk2/License.txt \
>> +    edk2/OvmfPkg/License.txt \
>> +    edk2/CryptoPkg/Library/OpensslLib/openssl/LICENSE
>> +
>> +# The "edk2-arm-vars.fd" varstore template is suitable for aarch64 as well.
>> +# Similarly, the "edk2-i386-vars.fd" varstore template is suitable for 
>> x86_64
>> +# as well, independently of "secure" too.
>> +flashdevs := \
>> +    aarch64-code \
>> +    arm-code \
>> +    i386-code \
>> +    i386-secure-code \
>> +    x86_64-code \
>> +    x86_64-secure-code \
>> +    \
>> +    arm-vars \
>> +    i386-vars
>> +
>> +all: $(foreach flashdev,$(flashdevs),../pc-bios/edk2-$(flashdev).fd.xz) \
>> +    ../pc-bios/edk2-licenses.txt
>> +
>> +../pc-bios/edk2-%.fd.xz: ../pc-bios/edk2-%.fd
>> +    xz -9 -e -c $< > $@
> 
> I'm not sure but I think we should add new entries to .gitignore now:
> 
> $ git status
> Changes not staged for commit:
>   (use "git add <file>..." to update what will be committed)
>   (use "git checkout -- <file>..." to discard changes in working directory)
> 
>         modified:   pc-bios/edk2-aarch64-code.fd.xz
>         modified:   pc-bios/edk2-arm-code.fd.xz
>         modified:   pc-bios/edk2-i386-code.fd.xz
>         modified:   pc-bios/edk2-i386-secure-code.fd.xz
>         modified:   pc-bios/edk2-x86_64-code.fd.xz
>         modified:   pc-bios/edk2-x86_64-secure-code.fd.xz
> 
> This change might be enough:
> 
> -- >8 --
> diff --git a/.gitignore b/.gitignore
> @@ -96,7 +96,7 @@
>  *.gcno
>  *.gcov
>  /pc-bios/bios-pq/status
> -/pc-bios/edk2-*.fd
> +/pc-bios/edk2-*.fd.xz
>  /pc-bios/vgabios-pq/status
>  /pc-bios/optionrom/linuxboot.asm
>  /pc-bios/optionrom/linuxboot.bin
> ---
> 
> I don't want to bikeshed again, but I understood the idea of that series
> was for Igor to use the binaries without having to rebuild them.
> 
> Previously we had the .fd directly usable, and 'make .fd' would rebuild
> them. Now they aren't directly usable.
> 
> IOW I was expecting the opposite Make rule:
> 
> ../pc-bios/edk2-%.fd: ../pc-bios/edk2-%.fd.xz
>       xz -d -c $< > $@
> 
> And the next rules to include the final compression.
> 
> So someone wanting to use simply decompress from the repository, while
> to rebuild a .fd you git clone and etc..

So I processed your series using your FIFO style and reached patch
11/12, and now understand:
- roms/Makefile does build + compression,
- Makefile does the decompression.

This is clever and indeed what I'm expecting, easier for QEMU
developpers as EDK2 consumers :)

Reviewed-by: Philippe Mathieu-Daudé <address@hidden>

Next time I'll reuse my double FIFO scheme again ;)

>> +
>> +# When the build completes, we need not keep the uncompressed flash device
>> +# files.
>> +.INTERMEDIATE: $(foreach 
>> flashdev,$(flashdevs),../pc-bios/edk2-$(flashdev).fd)
>> +
>> +submodules:
>> +    cd edk2 && git submodule update --init --force
>> +
>> +# See notes on the ".NOTPARALLEL" target and the "+" indicator in
>> +# "tests/uefi-test-tools/Makefile".
>> +.NOTPARALLEL:
>> +
>> +../pc-bios/edk2-aarch64-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            aarch64 \
>> +            --arch=AARCH64 \
>> +            --platform=ArmVirtPkg/ArmVirtQemu.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE
>> +    cp edk2/Build/ArmVirtQemu-AARCH64/DEBUG_$(call 
>> toolchain,aarch64)/FV/QEMU_EFI.fd \
>> +            $@
>> +    truncate --size=64M $@
>> +
>> +../pc-bios/edk2-arm-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            arm \
>> +            --arch=ARM \
>> +            --platform=ArmVirtPkg/ArmVirtQemu.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE
>> +    cp edk2/Build/ArmVirtQemu-ARM/DEBUG_$(call 
>> toolchain,arm)/FV/QEMU_EFI.fd \
>> +            $@
>> +    truncate --size=64M $@
>> +
>> +../pc-bios/edk2-i386-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            i386 \
>> +            --arch=IA32 \
>> +            --platform=OvmfPkg/OvmfPkgIa32.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE \
>> +            -D TLS_ENABLE \
>> +            -D TPM2_ENABLE \
>> +            -D TPM2_CONFIG_ENABLE
>> +    cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_CODE.fd $@
>> +
>> +../pc-bios/edk2-i386-secure-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            i386 \
>> +            --arch=IA32 \
>> +            --platform=OvmfPkg/OvmfPkgIa32.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE \
>> +            -D TLS_ENABLE \
>> +            -D TPM2_ENABLE \
>> +            -D TPM2_CONFIG_ENABLE \
>> +            -D SECURE_BOOT_ENABLE \
>> +            -D SMM_REQUIRE
>> +    cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_CODE.fd $@
>> +
>> +../pc-bios/edk2-x86_64-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            x86_64 \
>> +            --arch=X64 \
>> +            --platform=OvmfPkg/OvmfPkgX64.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE \
>> +            -D TLS_ENABLE \
>> +            -D TPM2_ENABLE \
>> +            -D TPM2_CONFIG_ENABLE
>> +    cp edk2/Build/OvmfX64/DEBUG_$(call toolchain,x86_64)/FV/OVMF_CODE.fd $@
>> +
>> +../pc-bios/edk2-x86_64-secure-code.fd: submodules
>> +    +./edk2-build.sh \
>> +            x86_64 \
>> +            --arch=IA32 \
>> +            --arch=X64 \
>> +            --platform=OvmfPkg/OvmfPkgIa32X64.dsc \
>> +            -D NETWORK_IP6_ENABLE \
>> +            -D HTTP_BOOT_ENABLE \
>> +            -D TLS_ENABLE \
>> +            -D TPM2_ENABLE \
>> +            -D TPM2_CONFIG_ENABLE \
>> +            -D SECURE_BOOT_ENABLE \
>> +            -D SMM_REQUIRE
>> +    cp edk2/Build/Ovmf3264/DEBUG_$(call toolchain,x86_64)/FV/OVMF_CODE.fd $@
>> +
>> +../pc-bios/edk2-arm-vars.fd: ../pc-bios/edk2-arm-code.fd
>> +    cp edk2/Build/ArmVirtQemu-ARM/DEBUG_$(call 
>> toolchain,arm)/FV/QEMU_VARS.fd \
>> +            $@
>> +    truncate --size=64M $@
>> +
>> +../pc-bios/edk2-i386-vars.fd: ../pc-bios/edk2-i386-code.fd
>> +    cp edk2/Build/OvmfIa32/DEBUG_$(call toolchain,i386)/FV/OVMF_VARS.fd $@
>> +
>> +# The license file accumulates several individual licenses from under edk2,
>> +# prefixing each individual license with a header (generated by "tail") that
>> +# states its pathname.
>> +../pc-bios/edk2-licenses.txt: submodules
>> +    tail -n $(shell cat $(licenses) | wc -l) $(licenses) > $@
>> +    dos2unix $@
>> +
>> +clean:
>> +    rm -rf edk2/Build
>> +    cd edk2/Conf && \
>> +            rm -rf .cache BuildEnv.sh build_rule.txt target.txt \
>> +                    tools_def.txt
>> diff --git a/roms/edk2-build.sh b/roms/edk2-build.sh
>> new file mode 100755
>> index 000000000000..4f46f8a6a217
>> --- /dev/null
>> +++ b/roms/edk2-build.sh
>> @@ -0,0 +1,55 @@
>> +#!/bin/bash
>> +
>> +# Wrapper shell script for building a  virtual platform firmware in edk2.
>> +#
>> +# 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.
>> +
>> +set -e -u -C
>> +
>> +# Save the command line arguments. We need to reset $# to 0 before sourcing
>> +# "edksetup.sh", as it will inherit address@hidden
>> +emulation_target=$1
>> +shift
>> +num_args=0
>> +args=()
>> +for arg in "$@"; do
>> +  args[num_args++]="$arg"
>> +done
>> +shift $num_args
>> +
>> +cd edk2
>> +
>> +# Work around <https://bugzilla.tianocore.org/show_bug.cgi?id=1607>.
>> +export PYTHON_COMMAND=python2
>> +
>> +# Source "edksetup.sh" carefully.
>> +set +e +u +C
>> +source ./edksetup.sh
>> +ret=$?
>> +set -e -u -C
>> +if [ $ret -ne 0 ]; then
>> +  exit $ret
>> +fi
>> +
>> +# Fetch some option arguments, and set the cross-compilation environment (if
>> +# any), for the edk2 "build" utility.
>> +source ../edk2-funcs.sh
>> +edk2_toolchain=$(qemu_edk2_get_toolchain "$emulation_target")
>> +edk2_thread_count=$(qemu_edk2_get_thread_count "$MAKEFLAGS")
>> +qemu_edk2_set_cross_env "$emulation_target"
>> +
>> +# Build the platform firmware.
>> +build \
>> +  --cmd-len=65536 \
>> +  -n "$edk2_thread_count" \
>> +  --buildtarget=DEBUG \
>> +  --tagname="$edk2_toolchain" \
>> +  "address@hidden"
>>
> 
> Tested-by: Philippe Mathieu-Daudé <address@hidden>
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]