]>
Commit | Line | Data |
---|---|---|
77db55fc LE |
1 | # Makefile for the test helper UEFI applications that run in guests. |
2 | # | |
3 | # Copyright (C) 2019, Red Hat, Inc. | |
4 | # | |
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>. | |
9 | # | |
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. | |
12 | ||
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 | |
18 | ||
19 | images: $(foreach binary,$(uefi_binaries), \ | |
20 | $(foreach target,$(emulation_targets), \ | |
21 | $(images_dir)/$(binary).$(target).iso.qcow2)) | |
22 | ||
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)))) | |
36 | ||
37 | # In the pattern rules below, the stem (%, $*) stands for | |
38 | # "$(binary).$(target)". | |
39 | ||
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 -- $< $@ | |
47 | ||
48 | # Embed the "UEFI system partition" into an ISO9660 file system as an ElTorito | |
49 | # boot image. | |
50 | Build/%.iso.raw: Build/%.fat | |
51 | genisoimage -input-charset ASCII -efi-boot $(notdir $<) -no-emul-boot \ | |
52 | -quiet -o $@ -- $< | |
53 | ||
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))) | |
62 | ||
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 | |
67 | # filesystem label.) | |
68 | Build/%.fat: Build/%.efi | |
69 | rm -f -- $@ | |
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 | |
78 | ||
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. | |
83 | ||
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. | |
87 | .NOTPARALLEL: | |
88 | ||
89 | # In turn, the "build" utility of edk2 BaseTools invokes another "make". | |
90 | # Although the outer "make" process advertizes 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 $* $@ | |
100 | ||
101 | build-edk2-tools: | |
102 | $(MAKE) -C $(edk2_dir)/BaseTools | |
103 | ||
104 | clean: | |
105 | rm -rf Build Conf log | |
106 | $(MAKE) -C $(edk2_dir)/BaseTools clean |