forked from mirror/qemu
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			111 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Makefile
		
	
			
		
		
	
	
			111 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Makefile
		
	
# 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:
 | 
						|
	cd $(edk2_dir)/BaseTools && git submodule update --init --force
 | 
						|
	$(MAKE) -C $(edk2_dir)/BaseTools \
 | 
						|
		PYTHON_COMMAND=$${EDK2_PYTHON_COMMAND:-python3} \
 | 
						|
		EXTRA_OPTFLAGS='$(EDK2_BASETOOLS_OPTFLAGS)' \
 | 
						|
		EXTRA_LDFLAGS='$(EDK2_BASETOOLS_LDFLAGS)'
 | 
						|
 | 
						|
clean:
 | 
						|
	rm -rf Build Conf log
 | 
						|
	$(MAKE) -C $(edk2_dir)/BaseTools clean
 |