1 # Makefile for the test helper UEFI applications that run in guests.
3 # Copyright (C) 2019, Red Hat, Inc.
5 # This program and the accompanying materials are licensed and made available
6 # under the terms and conditions of the BSD License that accompanies this
7 # distribution. The full text of the license may be found at
8 # <http://opensource.org/licenses/bsd-license.php>.
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
11 # WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 edk2_dir
:= ..
/..
/roms
/edk2
14 images_dir
:= ..
/data
/uefi-boot-images
15 emulation_targets
:= arm aarch64 i386 x86_64
16 uefi_binaries
:= bios-tables-test
17 intermediate_suffixes
:= .efi .fat .iso.raw
19 images
: $(foreach binary
,$(uefi_binaries
), \
20 $(foreach target
,$(emulation_targets
), \
21 $(images_dir
)/$(binary
).
$(target
).iso.qcow2
))
23 # Preserve all intermediate targets if the build succeeds.
24 # - Intermediate targets help with development & debugging.
25 # - Preserving intermediate targets also keeps spurious changes out of the
26 # final build products, in case the user re-runs "make" without any changes
27 # to the UEFI source code. Normally, the intermediate files would have been
28 # removed by the last "make" invocation, hence the re-run would rebuild them
29 # from the unchanged UEFI sources. Unfortunately, the "mkdosfs" and
30 # "genisoimage" utilities embed timestamp-based information in their outputs,
31 # which causes git to report differences for the tracked qcow2 ISO images.
32 .SECONDARY
: $(foreach binary
,$(uefi_binaries
), \
33 $(foreach target
,$(emulation_targets
), \
34 $(foreach suffix,$(intermediate_suffixes
), \
35 Build
/$(binary
).
$(target
)$(suffix))))
37 # In the pattern rules below, the stem (%, $*) stands for
38 # "$(binary).$(target)".
40 # Convert the raw ISO image to a qcow2 one, enabling compression, and using a
41 # small cluster size. This allows for small binary files under git control,
42 # hence for small binary patches.
43 $(images_dir
)/%.iso.qcow2
: Build
/%.iso.raw
44 mkdir
-p
-- $(images_dir
)
45 $${QTEST_QEMU_IMG
:-qemu-img
} convert
-f raw
-O qcow2
-c \
46 -o cluster_size
=512 -- $< $@
48 # Embed the "UEFI system partition" into an ISO9660 file system as an ElTorito
50 Build
/%.iso.raw
: Build
/%.fat
51 genisoimage
-input-charset ASCII
-efi-boot
$(notdir $<) -no-emul-boot \
54 # Define chained macros in order to map QEMU system emulation targets to
55 # *short* UEFI architecture identifiers. Periods are allowed in, and ultimately
56 # stripped from, the argument.
57 map_arm_to_uefi
= $(subst arm
,ARM
,$(1))
58 map_aarch64_to_uefi
= $(subst aarch64
,AA64
,$(call map_arm_to_uefi
,$(1)))
59 map_i386_to_uefi
= $(subst i386
,IA32
,$(call map_aarch64_to_uefi
,$(1)))
60 map_x86_64_to_uefi
= $(subst x86_64
,X64
,$(call map_i386_to_uefi
,$(1)))
61 map_to_uefi
= $(subst .
,,$(call map_x86_64_to_uefi
,$(1)))
63 # Format a "UEFI system partition", using the UEFI binary as the default boot
64 # loader. Add 10% size for filesystem metadata, round up to the next KB, and
65 # make sure the size is large enough for a FAT filesystem. Name the filesystem
66 # after the UEFI binary. (Excess characters are automatically dropped from the
68 Build
/%.fat
: Build
/%.efi
70 uefi_bin_b
=$$(stat
--format
=%s
-- $<) && \
71 uefi_fat_kb
=$$(( (uefi_bin_b
* 11 / 10 + 1023) / 1024 )) && \
72 uefi_fat_kb
=$$(( uefi_fat_kb
>= 64 ? uefi_fat_kb
: 64 )) && \
73 mkdosfs
-C
$@
-n
$(basename $(@F
)) -- $$uefi_fat_kb
74 MTOOLS_SKIP_CHECK
=1 mmd
-i
$@
::EFI
75 MTOOLS_SKIP_CHECK
=1 mmd
-i
$@
::EFI
/BOOT
76 MTOOLS_SKIP_CHECK
=1 mcopy
-i
$@
-- $< \
77 ::EFI
/BOOT
/BOOT
$(call map_to_uefi
,$(suffix $*)).EFI
79 # In the pattern rules below, the stem (%, $*) stands for "$(target)" only. The
80 # association between the UEFI binary (such as "bios-tables-test") and the
81 # component name from the edk2 platform DSC file (such as "BiosTablesTest") is
82 # explicit in each rule.
84 # "build.sh" invokes the "build" utility of edk2 BaseTools. In any given edk2
85 # workspace, at most one "build" instance may be operating at a time. Therefore
86 # we must serialize the rebuilding of targets in this Makefile.
89 # In turn, the "build" utility of edk2 BaseTools invokes another "make".
90 # Although the outer "make" process advertises its job server to all child
91 # processes via MAKEFLAGS in the environment, the outer "make" closes the job
92 # server file descriptors (exposed in MAKEFLAGS) before executing a recipe --
93 # unless the recipe is recognized as a recursive "make" recipe. Recipes that
94 # call $(MAKE) are classified automatically as recursive; for "build.sh" below,
95 # we must mark the recipe manually as recursive, by using the "+" indicator.
96 # This way, when the inner "make" starts a parallel build of the target edk2
97 # module, it can communicate with the outer "make"'s job server.
98 Build
/bios-tables-test.
%.efi
: build-edk2-tools
99 +.
/build.sh
$(edk2_dir
) BiosTablesTest
$* $@
102 cd
$(edk2_dir
)/BaseTools
&& git submodule update
--init
--force
103 $(MAKE
) -C
$(edk2_dir
)/BaseTools \
104 PYTHON_COMMAND
=$${EDK2_PYTHON_COMMAND
:-python3
} \
105 EXTRA_OPTFLAGS
='$(EDK2_BASETOOLS_OPTFLAGS)' \
106 EXTRA_LDFLAGS
='$(EDK2_BASETOOLS_LDFLAGS)'
109 rm -rf Build Conf log
110 $(MAKE
) -C
$(edk2_dir
)/BaseTools
clean