qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

Makefile (5275B)


      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 	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)'
    107 
    108 clean:
    109 	rm -rf Build Conf log
    110 	$(MAKE) -C $(edk2_dir)/BaseTools clean