# Makefile for VM tests

# Hack to allow running in an unconfigured build tree
ifeq ($(realpath $(SRC_PATH)),$(realpath .))
VM_PYTHON = PYTHONPATH=$(SRC_PATH)/python /usr/bin/env python3
VM_VENV =
else
VM_PYTHON = $(PYTHON)
VM_VENV = check-venv
endif

.PHONY: vm-build-all vm-clean-all

EFI_AARCH64 = $(wildcard $(BUILD_DIR)/pc-bios/edk2-aarch64-code.fd)

X86_IMAGES := freebsd netbsd openbsd haiku.x86_64
ifneq ($(GENISOIMAGE),)
X86_IMAGES += centos
ifneq ($(EFI_AARCH64),)
ARM64_IMAGES += ubuntu.aarch64 centos.aarch64
endif
endif

HOST_ARCH = $(shell uname -m)
ifeq ($(HOST_ARCH),x86_64)
IMAGES=$(X86_IMAGES) $(if $(USE_TCG),$(ARM64_IMAGES))
else ifeq ($(HOST_ARCH),aarch64)
IMAGES=$(ARM64_IMAGES) $(if $(USE_TCG),$(X86_IMAGES))
endif

IMAGES_DIR := $(HOME)/.cache/qemu-vm/images
IMAGE_FILES := $(patsubst %, $(IMAGES_DIR)/%.img, $(IMAGES))

.PRECIOUS: $(IMAGE_FILES)

ifneq ($(PYTHON),)
HAVE_PYTHON_YAML = $(shell $(PYTHON) -c "import yaml" 2> /dev/null && echo yes)
endif

# 'vm-help' target was historically named 'vm-test'
vm-help vm-test:
	@echo "vm-help: Test QEMU in preconfigured virtual machines"
	@echo
	@echo "  vm-build-freebsd                - Build QEMU in FreeBSD VM"
	@echo "  vm-build-netbsd                 - Build QEMU in NetBSD VM"
	@echo "  vm-build-openbsd                - Build QEMU in OpenBSD VM"
ifneq ($(GENISOIMAGE),)
	@echo "  vm-build-centos                 - Build QEMU in CentOS VM, with Docker"
ifneq ($(EFI_AARCH64),)
	@echo "  vm-build-ubuntu.aarch64         - Build QEMU in ubuntu aarch64 VM"
	@echo "  vm-build-centos.aarch64         - Build QEMU in CentOS aarch64 VM"
else
	@echo "  (to build centos/ubuntu aarch64 images use configure --efi-aarch64)"
endif
else
	@echo "  (install genisoimage to build centos/ubuntu images)"
endif
	@echo "  vm-build-haiku.x86_64           - Build QEMU in Haiku VM"
	@echo ""
	@echo "  vm-build-all                    - Build QEMU in: $(IMAGES)"
	@echo "  vm-clean-all                    - Clean up VM images"
	@echo
	@echo "For trouble-shooting:"
	@echo "  vm-boot-serial-<guest>          - Boot guest, serial console on stdio"
	@echo "  vm-boot-ssh-<guest>             - Boot guest and login via ssh"
	@echo
	@echo "Special variables:"
	@echo "    BUILD_TARGET=foo		 - Override the build target"
	@echo "    DEBUG=1              	 - Enable verbose output on host and interactive debugging"
	@echo '    EXTRA_CONFIGURE_OPTS="..."   - Pass to configure step'
	@echo "    J=[0..9]*            	 - Override the -jN parameter for make commands"
	@echo "    LOG_CONSOLE=1        	 - Log console to file in: ~/.cache/qemu-vm "
	@echo "    USE_TCG=1        	         - Use TCG for cross-arch images"
	@echo "    QEMU=/path/to/qemu		 - Change path to QEMU binary"
ifeq ($(HAVE_PYTHON_YAML),yes)
	@echo "    QEMU_CONFIG=/path/conf.yml   - Change path to VM configuration .yml file."
else
	@echo "    (install python3-yaml to enable support for yaml file to configure a VM.)"
endif
	@echo "                                   See conf_example_*.yml for file format details."
	@echo "    QEMU_IMG=/path/to/qemu-img	 - Change path to qemu-img tool"
	@echo "    QEMU_LOCAL=1                 - Use QEMU binary local to this build."
	@echo "    TARGET_LIST=a,b,c    	 - Override target list in builds"
	@echo "    V=1				 - Enable verbose output on host and guest commands"

vm-build-all: $(addprefix vm-build-, $(IMAGES))

vm-clean-all:
	rm -f $(IMAGE_FILES)

$(IMAGES_DIR)/%.img:	$(SRC_PATH)/tests/vm/% \
			$(SRC_PATH)/tests/vm/basevm.py \
			$(SRC_PATH)/tests/vm/Makefile.include \
			$(VM_VENV)
	@mkdir -p $(IMAGES_DIR)
	$(call quiet-command, \
		$(VM_PYTHON) $< \
		$(if $(V)$(DEBUG), --debug) \
		$(if $(GENISOIMAGE),--genisoimage $(GENISOIMAGE)) \
		$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
		$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
		$(if $(LOG_CONSOLE),--log-console) \
		--source-path $(SRC_PATH) \
		--image "$@" \
		$(if $(filter-out check-venv, $?), --force) \
		--build-image $@, \
		"  VM-IMAGE $*")

# Build in VM $(IMAGE)
vm-build-%: $(IMAGES_DIR)/%.img $(VM_VENV)
	$(call quiet-command, \
		$(VM_PYTHON) $(SRC_PATH)/tests/vm/$* \
		$(if $(V)$(DEBUG), --debug) \
		$(if $(DEBUG), --interactive) \
		$(if $(J),--jobs $(J)) \
		$(if $(V),--verbose) \
		$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
		$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
		$(if $(LOG_CONSOLE),--log-console) \
		--image "$<" \
		$(if $(BUILD_TARGET),--build-target $(BUILD_TARGET)) \
		--snapshot \
		--build-qemu $(SRC_PATH) -- \
		$(if $(TARGET_LIST),--target-list=$(TARGET_LIST)) \
		$(if $(EXTRA_CONFIGURE_OPTS),$(EXTRA_CONFIGURE_OPTS)), \
		"  VM-BUILD $*")

vm-boot-serial-%: $(IMAGES_DIR)/%.img
	qemu-system-x86_64 -enable-kvm -m 4G -smp 2 -nographic \
		-drive if=none,id=vblk,cache=writeback,file="$<" \
		-netdev user,id=vnet \
		-device virtio-blk-pci,drive=vblk \
		-device virtio-net-pci,netdev=vnet \
	|| true

vm-boot-ssh-%: $(IMAGES_DIR)/%.img $(VM_VENV)
	$(call quiet-command, \
		$(VM_PYTHON) $(SRC_PATH)/tests/vm/$* \
		$(if $(J),--jobs $(J)) \
		$(if $(V)$(DEBUG), --debug) \
		$(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
		$(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
		$(if $(LOG_CONSOLE),--log-console) \
		--image "$<" \
		--interactive \
		false, \
		"  VM-BOOT-SSH $*") || true
