modules-$(CONFIG_LINUXBOOT) += linuxboot

linuxboot_version := git
linuxboot_repo := https://github.com/osresearch/linuxboot
linuxboot_base_dir := linuxboot-$(linuxboot_version)

# linuxboot builds are specialized on a per-target basis.
# They can be specialized by defining $(CONFIG_LINUXBOOT_BOARD)
# otherwise it is assumed that it will have the same name
# as the Heads BOARD.
linuxboot_board := $(or $(CONFIG_LINUXBOOT_BOARD),$(BOARD))
linuxboot_dir := linuxboot-$(linuxboot_version)/build/$(linuxboot_board)

linuxboot_configure := \
	echo >&2 "Pre-building edk2" ; \
	$(MAKE) \
		-C $(build)/$(linuxboot_base_dir) \
		BOARD=$(linuxboot_board) \
		edk2.force \
	|| exit 1 ; \
	if [ "$(linuxboot_board)" = "qemu" ]; then \
		echo >&2 "Pre-building edk2 OVMF" ; \
		( cd $(build)/$(linuxboot_base_dir)/edk2/OvmfPkg ; \
		./build.sh -n $(CPUS) \
		) || exit 1 ; \
	fi ; \
	touch .config ; \

ifdef CUSTOM
	CUSTOMPWD=$(pwd)/$(CUSTOM)
endif

linuxboot_target := \
	-C $(build)/$(linuxboot_base_dir) \
	BOARD=$(linuxboot_board) \
	KERNEL=$(build)/$(BOARD)/bzImage \
	INITRD=$(build)/$(BOARD)/initrd.cpio.xz \
	CUSTOM=$(CUSTOMPWD) \
	CROSS=$(CROSS) \
	$(if $(CONFIG_LINUXBOOT_ROM), ROM=$(pwd)/$(CONFIG_LINUXBOOT_ROM)) \
	all

#
# Most mainboards will define a ROM file that contains the vendor ROM
# for the image.  Provide a reasonable error if the ROM file doesn't exist.
#
ifneq "$(CONFIG_LINUXBOOT_ROM)" ""
ifneq "y" "$(shell [ -r '$(CONFIG_LINUXBOOT_ROM)' ] && echo y)"
$(error $(CONFIG_LINUXBOOT_ROM): you must provide a ROM file)
endif

endif


# The output file from the LinuxBoot build is a full ROM
# ready to flash onto the mainboard.  There might be partial
# firmware volumes as well, but that depends on the board
# so this only retrieves the final one
linuxboot_output := build/$(linuxboot_board)/linuxboot.rom
linuxboot_rom := $(build)/$(linuxboot_dir)/$(linuxboot_output)

ifneq ($(CONFIG_LINUXBOOT),)
$(build)/$(BOARD)/$(LB_OUTPUT_FILE): $(build)/$(linuxboot_dir)/.build
	$(call do-copy,$(dir $<)linuxboot.rom,$@)
	@touch $@
endif

# Also force a rebuild if any of the input files are updated
$(build)/$(linuxboot_dir)/.build: \
	$(CONFIG_LINUXBOOT_ROM) \
	$(build)/$(BOARD)/bzImage \
	$(build)/$(BOARD)/initrd.cpio.xz \


linuxboot.run: $(build)/$(BOARD)/$(LB_OUTPUT_FILE)
	$(MAKE) -C $(build)/$(linuxboot_base_dir)  \
		BOARD:=$(linuxboot_board) \
		KERNEL=$(build)/$(BOARD)/bzImage \
		INITRD=$(build)/$(BOARD)/initrd.cpio.xz \
		CUSTOM=$(CUSTOMPWD) \
		run
