tests/uefi-test-tools: add build scripts
Introduce the following build scripts under "tests/uefi-test-tools":
* "build.sh" builds a single module (a UEFI application) from
UefiTestToolsPkg, for a single QEMU emulation target.
"build.sh" relies on cross-compilers when the emulation target and the
build host architecture don't match. The cross-compiler prefix is
computed according to a fixed, Linux-specific pattern. No attempt is
made to copy or reimplement the GNU Make magic from "qemu/roms/Makefile"
for cross-compiler prefix determination. The reason is that the build
host OSes that are officially supported by edk2, and those that are
supported by QEMU, intersect only in Linux. (Note that the UNIXGCC
toolchain is being removed from edk2,
<https://bugzilla.tianocore.org/show_bug.cgi?id=1377>.)
* "Makefile" currently builds the "UefiTestToolsPkg/BiosTablesTest"
application, for arm, aarch64, i386, and x86_64, with the help of
"build.sh".
"Makefile" turns each resultant UEFI executable into a UEFI-bootable,
qcow2-compressed ISO image. The ISO images are output as
"tests/data/uefi-boot-images/bios-tables-test.<TARGET>.iso.qcow2".
Each ISO image should be passed to QEMU as follows:
-drive id=boot-cd,if=none,readonly,format=qcow2,file=$ISO \
-device virtio-scsi-pci,id=scsi0 \
-device scsi-cd,drive=boot-cd,bus=scsi0.0,bootindex=0 \
"Makefile" assumes that "mkdosfs", "mtools", and "genisoimage" are
present.
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Cc: Shannon Zhao <shannon.zhaosl@gmail.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20190204160325.4914-5-lersek@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2019-02-04 19:03:24 +03:00
|
|
|
# Makefile for the test helper UEFI applications that run in guests.
|
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
|
|
|
|
edk2_dir := ../../roms/edk2
|
|
|
|
images_dir := ../data/uefi-boot-images
|
|
|
|
emulation_targets := arm aarch64 i386 x86_64
|
|
|
|
uefi_binaries := bios-tables-test
|
|
|
|
intermediate_suffixes := .efi .fat .iso.raw
|
|
|
|
|
|
|
|
images: $(foreach binary,$(uefi_binaries), \
|
|
|
|
$(foreach target,$(emulation_targets), \
|
|
|
|
$(images_dir)/$(binary).$(target).iso.qcow2))
|
|
|
|
|
|
|
|
# Preserve all intermediate targets if the build succeeds.
|
|
|
|
# - Intermediate targets help with development & debugging.
|
|
|
|
# - Preserving intermediate targets also keeps spurious changes out of the
|
|
|
|
# final build products, in case the user re-runs "make" without any changes
|
|
|
|
# to the UEFI source code. Normally, the intermediate files would have been
|
|
|
|
# removed by the last "make" invocation, hence the re-run would rebuild them
|
|
|
|
# from the unchanged UEFI sources. Unfortunately, the "mkdosfs" and
|
|
|
|
# "genisoimage" utilities embed timestamp-based information in their outputs,
|
|
|
|
# which causes git to report differences for the tracked qcow2 ISO images.
|
|
|
|
.SECONDARY: $(foreach binary,$(uefi_binaries), \
|
|
|
|
$(foreach target,$(emulation_targets), \
|
|
|
|
$(foreach suffix,$(intermediate_suffixes), \
|
|
|
|
Build/$(binary).$(target)$(suffix))))
|
|
|
|
|
|
|
|
# In the pattern rules below, the stem (%, $*) stands for
|
|
|
|
# "$(binary).$(target)".
|
|
|
|
|
|
|
|
# Convert the raw ISO image to a qcow2 one, enabling compression, and using a
|
|
|
|
# small cluster size. This allows for small binary files under git control,
|
|
|
|
# hence for small binary patches.
|
|
|
|
$(images_dir)/%.iso.qcow2: Build/%.iso.raw
|
|
|
|
mkdir -p -- $(images_dir)
|
|
|
|
$${QTEST_QEMU_IMG:-qemu-img} convert -f raw -O qcow2 -c \
|
|
|
|
-o cluster_size=512 -- $< $@
|
|
|
|
|
|
|
|
# Embed the "UEFI system partition" into an ISO9660 file system as an ElTorito
|
|
|
|
# boot image.
|
|
|
|
Build/%.iso.raw: Build/%.fat
|
|
|
|
genisoimage -input-charset ASCII -efi-boot $(notdir $<) -no-emul-boot \
|
|
|
|
-quiet -o $@ -- $<
|
|
|
|
|
|
|
|
# Define chained macros in order to map QEMU system emulation targets to
|
|
|
|
# *short* UEFI architecture identifiers. Periods are allowed in, and ultimately
|
|
|
|
# stripped from, the argument.
|
|
|
|
map_arm_to_uefi = $(subst arm,ARM,$(1))
|
|
|
|
map_aarch64_to_uefi = $(subst aarch64,AA64,$(call map_arm_to_uefi,$(1)))
|
|
|
|
map_i386_to_uefi = $(subst i386,IA32,$(call map_aarch64_to_uefi,$(1)))
|
|
|
|
map_x86_64_to_uefi = $(subst x86_64,X64,$(call map_i386_to_uefi,$(1)))
|
|
|
|
map_to_uefi = $(subst .,,$(call map_x86_64_to_uefi,$(1)))
|
|
|
|
|
|
|
|
# Format a "UEFI system partition", using the UEFI binary as the default boot
|
|
|
|
# loader. Add 10% size for filesystem metadata, round up to the next KB, and
|
|
|
|
# make sure the size is large enough for a FAT filesystem. Name the filesystem
|
|
|
|
# after the UEFI binary. (Excess characters are automatically dropped from the
|
|
|
|
# filesystem label.)
|
|
|
|
Build/%.fat: Build/%.efi
|
|
|
|
rm -f -- $@
|
|
|
|
uefi_bin_b=$$(stat --format=%s -- $<) && \
|
|
|
|
uefi_fat_kb=$$(( (uefi_bin_b * 11 / 10 + 1023) / 1024 )) && \
|
|
|
|
uefi_fat_kb=$$(( uefi_fat_kb >= 64 ? uefi_fat_kb : 64 )) && \
|
|
|
|
mkdosfs -C $@ -n $(basename $(@F)) -- $$uefi_fat_kb
|
|
|
|
MTOOLS_SKIP_CHECK=1 mmd -i $@ ::EFI
|
|
|
|
MTOOLS_SKIP_CHECK=1 mmd -i $@ ::EFI/BOOT
|
|
|
|
MTOOLS_SKIP_CHECK=1 mcopy -i $@ -- $< \
|
|
|
|
::EFI/BOOT/BOOT$(call map_to_uefi,$(suffix $*)).EFI
|
|
|
|
|
|
|
|
# In the pattern rules below, the stem (%, $*) stands for "$(target)" only. The
|
|
|
|
# association between the UEFI binary (such as "bios-tables-test") and the
|
|
|
|
# component name from the edk2 platform DSC file (such as "BiosTablesTest") is
|
|
|
|
# explicit in each rule.
|
|
|
|
|
|
|
|
# "build.sh" invokes the "build" utility of edk2 BaseTools. In any given edk2
|
|
|
|
# workspace, at most one "build" instance may be operating at a time. Therefore
|
|
|
|
# we must serialize the rebuilding of targets in this Makefile.
|
|
|
|
.NOTPARALLEL:
|
|
|
|
|
|
|
|
# In turn, the "build" utility of edk2 BaseTools invokes another "make".
|
|
|
|
# Although the outer "make" process advertizes its job server to all child
|
|
|
|
# processes via MAKEFLAGS in the environment, the outer "make" closes the job
|
|
|
|
# server file descriptors (exposed in MAKEFLAGS) before executing a recipe --
|
|
|
|
# unless the recipe is recognized as a recursive "make" recipe. Recipes that
|
|
|
|
# call $(MAKE) are classified automatically as recursive; for "build.sh" below,
|
|
|
|
# we must mark the recipe manually as recursive, by using the "+" indicator.
|
|
|
|
# This way, when the inner "make" starts a parallel build of the target edk2
|
|
|
|
# module, it can communicate with the outer "make"'s job server.
|
|
|
|
Build/bios-tables-test.%.efi: build-edk2-tools
|
|
|
|
+./build.sh $(edk2_dir) BiosTablesTest $* $@
|
|
|
|
|
|
|
|
build-edk2-tools:
|
2019-09-20 11:38:07 +03:00
|
|
|
$(MAKE) -C $(edk2_dir)/BaseTools \
|
edk2 build scripts: work around TianoCore#1607 without forcing Python 2
It turns out that forcing python2 for running the edk2 "build" utility is
neither necessary nor sufficient.
Forcing python2 is not sufficient for two reasons:
- QEMU is moving away from python2, with python2 nearing EOL,
- according to my most recent testing, the lacking dependency information
in the makefiles that are generated by edk2's "build" utility can cause
parallel build failures even when "build" is executed by python2.
And forcing python2 is not necessary because we can still return to the
original idea of filtering out jobserver-related options from MAKEFLAGS.
So do that.
While at it, cut short edk2's auto-detection of the python3.* minor
version, by setting PYTHON_COMMAND to "python3" (which we expect to be
available wherever we intend to build edk2).
With this patch, the guest UEFI binaries that are used as part of the BIOS
tables test, and the OVMF and ArmVirtQemu platform firmwares, will be
built strictly in a single job, regardless of an outermost "-jN" make
option. Alas, there appears to be no reliable way to build edk2 in an
(outer make, inner make) environment, with a jobserver enabled.
Cc: Eduardo Habkost <ehabkost@redhat.com>
Cc: John Snow <jsnow@redhat.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Reported-by: John Snow <jsnow@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20190920083808.21399-3-lersek@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
2019-09-20 11:38:08 +03:00
|
|
|
PYTHON_COMMAND=$${EDK2_PYTHON_COMMAND:-python3} \
|
2019-09-20 11:38:07 +03:00
|
|
|
EXTRA_OPTFLAGS='$(EDK2_BASETOOLS_OPTFLAGS)' \
|
|
|
|
EXTRA_LDFLAGS='$(EDK2_BASETOOLS_LDFLAGS)'
|
tests/uefi-test-tools: add build scripts
Introduce the following build scripts under "tests/uefi-test-tools":
* "build.sh" builds a single module (a UEFI application) from
UefiTestToolsPkg, for a single QEMU emulation target.
"build.sh" relies on cross-compilers when the emulation target and the
build host architecture don't match. The cross-compiler prefix is
computed according to a fixed, Linux-specific pattern. No attempt is
made to copy or reimplement the GNU Make magic from "qemu/roms/Makefile"
for cross-compiler prefix determination. The reason is that the build
host OSes that are officially supported by edk2, and those that are
supported by QEMU, intersect only in Linux. (Note that the UNIXGCC
toolchain is being removed from edk2,
<https://bugzilla.tianocore.org/show_bug.cgi?id=1377>.)
* "Makefile" currently builds the "UefiTestToolsPkg/BiosTablesTest"
application, for arm, aarch64, i386, and x86_64, with the help of
"build.sh".
"Makefile" turns each resultant UEFI executable into a UEFI-bootable,
qcow2-compressed ISO image. The ISO images are output as
"tests/data/uefi-boot-images/bios-tables-test.<TARGET>.iso.qcow2".
Each ISO image should be passed to QEMU as follows:
-drive id=boot-cd,if=none,readonly,format=qcow2,file=$ISO \
-device virtio-scsi-pci,id=scsi0 \
-device scsi-cd,drive=boot-cd,bus=scsi0.0,bootindex=0 \
"Makefile" assumes that "mkdosfs", "mtools", and "genisoimage" are
present.
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Cc: Shannon Zhao <shannon.zhaosl@gmail.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20190204160325.4914-5-lersek@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2019-02-04 19:03:24 +03:00
|
|
|
|
|
|
|
clean:
|
|
|
|
rm -rf Build Conf log
|
|
|
|
$(MAKE) -C $(edk2_dir)/BaseTools clean
|