linuxboot/Makefile

119 lines
2.6 KiB
Makefile
Raw Normal View History

#
# Builds the LinuxBoot firmware image.
#
# This requires the vendor firmware image, a Linux kernel and an initrd.cpio.xz file.
#
#
2018-01-26 22:08:20 +00:00
all: linuxboot
-include .config
include Makefile.rules
include Makefile.uefi
# The config file should set the BOARD variable
# as well as point to the bzImage and initrd.cpio files
BOARD ?= qemu
KERNEL ?= bzImage
INITRD ?= initrd.cpio.xz
2018-01-26 22:08:20 +00:00
BUILD := build/$(BOARD)
# Make sure that we have a board file for the user
$(shell \
if [ ! -r boards/$(BOARD)/Makefile.board ]; then \
echo >&2 "BOARD=$(BOARD) is not valid."; \
echo >&2 ; \
echo >&2 "Supported mainboards:"; \
ls boards/*/Makefile.board | cut -d/ -f2 >&2 ; \
echo >&2 ; \
exit 1 ; \
fi; \
mkdir -p $(BUILD) ; \
)
# Bring in the board specific things
include boards/$(BOARD)/Makefile.board
2018-01-26 22:08:20 +00:00
linuxboot: $(BUILD)/linuxboot.rom
# Create a .config file based on the current parameters
config:
echo '# Generated $(DATE)' > .config
echo 'BOARD ?= $(BOARD)' >> .config
echo 'KERNEL ?= $(KERNEL)' >> .config
echo 'INITRD ?= $(INITRD)' >> .config
# edk2 outputs will be in this deeply nested directory
EDK2_OUTPUT_DIR := edk2/Build/MdeModule/DEBUG_GCC5/X64
vendor:
$(EDK2_OUTPUT_DIR)/DxeCore.efi: edk2/.git
$(MAKE) -C edk2
2016-12-13 18:10:21 +00:00
edk2.force: edk2/.git
$(MAKE) -C edk2 build
2017-09-22 19:09:57 +00:00
# If the edk2 directory doesn't exist, checkout a shallow branch of it
# and build the various Dxe/Smm files
edk2/.git:
git clone --depth 1 --branch UDK2018 https://github.com/linuxboot/edk2
2018-01-26 22:08:20 +00:00
$(BUILD)/Linux.ffs: $(KERNEL)
$(BUILD)/Initrd.ffs: $(INITRD)
2018-01-26 22:08:20 +00:00
$(BUILD)/%.ffs: $(EDK2_OUTPUT_DIR)/%.efi
$(create-ffs)
2018-01-26 22:08:20 +00:00
$(BUILD)/%.ffs:
$(create-ffs)
2018-01-26 22:08:20 +00:00
$(BUILD)/%.rom:
cat > $@.tmp $^
@if [ `stat -c'%s' $@.tmp` -ne $$[$($(basename $(notdir $@))-size)] ]; then \
echo >&2 "$@: Wrong output size"; \
exit 1; \
fi
@mv $@.tmp $@
2018-01-26 22:08:20 +00:00
$(BUILD)/%.vol:
./bin/create-fv \
-o $@ \
2018-01-26 22:08:20 +00:00
--size $(or $($(basename $(notdir $@))-size),0x400000) \
--compress $(or $($(basename $(notdir $@))-compress),0) \
$^
create-ffs = \
./bin/create-ffs \
-o $@ \
2018-01-26 22:08:20 +00:00
--name $(basename $(notdir $@)) \
--version 1.0 \
2018-01-26 22:08:20 +00:00
--type $(or $($(basename $(notdir $@))-type),DRIVER) \
--depex "$($(basename $(notdir $@))-depex)" \
--guid "$($(basename $(notdir $@))-guid)" \
$^
2018-01-26 22:08:20 +00:00
#
# Extract all of the firmware files from the vendor provided ROM
#
extract.intermediate: boards/$(BOARD)/$(BOARD).rom
( \
cd $(BUILD) ; \
$(pwd)/bin/extract-firmware \
-o rom \
) < $^ \
| tee $(BUILD)/$(BOARD).txt ; \
.INTERMEDIATE: extract.intermediate
# All of the output volumes depend on extracting the firmware
$(patsubst %.vol,,$(FVS)): extract.intermediate
$(BUILD)/linuxboot.rom: $(FVS)
2018-01-26 22:08:20 +00:00
clean:
$(RM) $(BUILD)/{*.ffs,*.rom,*.vol,*.tmp}