Files
qemu/tests/vm/Makefile.include
John Snow 5abfe61b40 tests: replace check-venv with vm-venv target
With the qemu.qmp and qemu.machine dependencies now installed by default
at configure time and additional dependencies required by functional
testing installed on demand, we do not need the explicit "check-venv" target.

...However, to facilitate running VM tests without running configure, we
move some of the former logic into tests/vm/Makefile.include to create a
new venv (vm-venv) on-demand when running VM tests from the source tree.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20260218213416.674483-17-jsnow@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
2026-02-24 13:11:29 -05:00

160 lines
5.6 KiB
Makefile

# Makefile for VM tests
# Hack to allow running in an unconfigured build tree
ifeq ($(realpath $(SRC_PATH)),$(realpath .))
VM_PYTHON = $(SRC_PATH)/vm-venv/bin/python3
VM_VENV = vm-venv
else
VM_PYTHON = $(PYTHON)
VM_VENV =
endif
VM_VENV_TOKEN=$(SRC_PATH)/vm-venv/tooling.group $(SRC_PATH)/vm-venv/functests.group
$(VM_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml
/usr/bin/env python3 $(SRC_PATH)/python/scripts/mkvenv.py create vm-venv
$(SRC_PATH)/vm-venv/bin/python3 \
$(SRC_PATH)/python/scripts/mkvenv.py ensuregroup --online \
$(SRC_PATH)/pythondeps.toml tooling functests
.PHONY: vm-venv
vm-venv: $(VM_VENV_TOKEN)
# end hackery
.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),)
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 " ROOT_USER=1 - Login as root user for interactive shell"
@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 "$@" \
--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 "$<" \
$(if $(ROOT_USER),--interactive-root,-interactive) \
false, \
" VM-BOOT-SSH $*") || true