| 1 | # Makefile for VM tests |
| 2 | |
| 3 | # Hack to allow running in an unconfigured build tree |
| 4 | ifeq ($(realpath $(SRC_PATH)),$(realpath .)) |
| 5 | VM_PYTHON = $(SRC_PATH)/vm-venv/bin/python3 |
| 6 | VM_VENV = vm-venv |
| 7 | else |
| 8 | VM_PYTHON = $(PYTHON) |
| 9 | VM_VENV = |
| 10 | endif |
| 11 | |
| 12 | VM_VENV_TOKEN=$(SRC_PATH)/vm-venv/tooling.group $(SRC_PATH)/vm-venv/functests.group |
| 13 | |
| 14 | $(VM_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml |
| 15 | /usr/bin/env python3 $(SRC_PATH)/python/scripts/mkvenv.py create vm-venv |
| 16 | $(SRC_PATH)/vm-venv/bin/python3 \ |
| 17 | $(SRC_PATH)/python/scripts/mkvenv.py ensuregroup --online \ |
| 18 | $(SRC_PATH)/pythondeps.toml tooling functests |
| 19 | |
| 20 | .PHONY: vm-venv |
| 21 | vm-venv: $(VM_VENV_TOKEN) |
| 22 | # end hackery |
| 23 | |
| 24 | .PHONY: vm-build-all vm-clean-all |
| 25 | |
| 26 | EFI_AARCH64 = $(wildcard $(BUILD_DIR)/pc-bios/edk2-aarch64-code.fd) |
| 27 | |
| 28 | X86_IMAGES := freebsd netbsd openbsd haiku.x86_64 |
| 29 | ifneq ($(GENISOIMAGE),) |
| 30 | X86_IMAGES += centos |
| 31 | ifneq ($(EFI_AARCH64),) |
| 32 | ARM64_IMAGES += ubuntu.aarch64 centos.aarch64 |
| 33 | endif |
| 34 | endif |
| 35 | |
| 36 | HOST_ARCH = $(shell uname -m) |
| 37 | ifeq ($(HOST_ARCH),x86_64) |
| 38 | IMAGES=$(X86_IMAGES) $(if $(USE_TCG),$(ARM64_IMAGES)) |
| 39 | else ifeq ($(HOST_ARCH),aarch64) |
| 40 | IMAGES=$(ARM64_IMAGES) $(if $(USE_TCG),$(X86_IMAGES)) |
| 41 | endif |
| 42 | |
| 43 | IMAGES_DIR := $(HOME)/.cache/qemu-vm/images |
| 44 | IMAGE_FILES := $(patsubst %, $(IMAGES_DIR)/%.img, $(IMAGES)) |
| 45 | |
| 46 | .PRECIOUS: $(IMAGE_FILES) |
| 47 | |
| 48 | ifneq ($(PYTHON),) |
| 49 | HAVE_PYTHON_YAML = $(shell $(PYTHON) -c "import yaml" 2> /dev/null && echo yes) |
| 50 | endif |
| 51 | |
| 52 | # 'vm-help' target was historically named 'vm-test' |
| 53 | vm-help vm-test: |
| 54 | @echo "vm-help: Test QEMU in preconfigured virtual machines" |
| 55 | @echo |
| 56 | @echo " vm-build-freebsd - Build QEMU in FreeBSD VM" |
| 57 | @echo " vm-build-netbsd - Build QEMU in NetBSD VM" |
| 58 | @echo " vm-build-openbsd - Build QEMU in OpenBSD VM" |
| 59 | ifneq ($(GENISOIMAGE),) |
| 60 | ifneq ($(EFI_AARCH64),) |
| 61 | @echo " vm-build-ubuntu.aarch64 - Build QEMU in ubuntu aarch64 VM" |
| 62 | @echo " vm-build-centos.aarch64 - Build QEMU in CentOS aarch64 VM" |
| 63 | else |
| 64 | @echo " (to build centos/ubuntu aarch64 images use configure --efi-aarch64)" |
| 65 | endif |
| 66 | else |
| 67 | @echo " (install genisoimage to build centos/ubuntu images)" |
| 68 | endif |
| 69 | @echo " vm-build-haiku.x86_64 - Build QEMU in Haiku VM" |
| 70 | @echo "" |
| 71 | @echo " vm-build-all - Build QEMU in: $(IMAGES)" |
| 72 | @echo " vm-clean-all - Clean up VM images" |
| 73 | @echo |
| 74 | @echo "For trouble-shooting:" |
| 75 | @echo " vm-boot-serial-<guest> - Boot guest, serial console on stdio" |
| 76 | @echo " vm-boot-ssh-<guest> - Boot guest and login via ssh" |
| 77 | @echo |
| 78 | @echo "Special variables:" |
| 79 | @echo " BUILD_TARGET=foo - Override the build target" |
| 80 | @echo " DEBUG=1 - Enable verbose output on host and interactive debugging" |
| 81 | @echo " ROOT_USER=1 - Login as root user for interactive shell" |
| 82 | @echo ' EXTRA_CONFIGURE_OPTS="..." - Pass to configure step' |
| 83 | @echo " J=[0..9]* - Override the -jN parameter for make commands" |
| 84 | @echo " LOG_CONSOLE=1 - Log console to file in: ~/.cache/qemu-vm " |
| 85 | @echo " USE_TCG=1 - Use TCG for cross-arch images" |
| 86 | @echo " QEMU=/path/to/qemu - Change path to QEMU binary" |
| 87 | ifeq ($(HAVE_PYTHON_YAML),yes) |
| 88 | @echo " QEMU_CONFIG=/path/conf.yml - Change path to VM configuration .yml file." |
| 89 | else |
| 90 | @echo " (install python3-yaml to enable support for yaml file to configure a VM.)" |
| 91 | endif |
| 92 | @echo " See conf_example_*.yml for file format details." |
| 93 | @echo " QEMU_IMG=/path/to/qemu-img - Change path to qemu-img tool" |
| 94 | @echo " QEMU_LOCAL=1 - Use QEMU binary local to this build." |
| 95 | @echo " TARGET_LIST=a,b,c - Override target list in builds" |
| 96 | @echo " V=1 - Enable verbose output on host and guest commands" |
| 97 | |
| 98 | vm-build-all: $(addprefix vm-build-, $(IMAGES)) |
| 99 | |
| 100 | vm-clean-all: |
| 101 | rm -f $(IMAGE_FILES) |
| 102 | |
| 103 | $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \ |
| 104 | $(SRC_PATH)/tests/vm/basevm.py \ |
| 105 | $(SRC_PATH)/tests/vm/Makefile.include \ |
| 106 | $(VM_VENV) |
| 107 | @mkdir -p $(IMAGES_DIR) |
| 108 | $(call quiet-command, \ |
| 109 | $(VM_PYTHON) $< \ |
| 110 | $(if $(V)$(DEBUG), --debug) \ |
| 111 | $(if $(GENISOIMAGE),--genisoimage $(GENISOIMAGE)) \ |
| 112 | $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \ |
| 113 | $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \ |
| 114 | $(if $(LOG_CONSOLE),--log-console) \ |
| 115 | --source-path $(SRC_PATH) \ |
| 116 | --image "$@" \ |
| 117 | --force \ |
| 118 | --build-image $@, \ |
| 119 | " VM-IMAGE $*") |
| 120 | |
| 121 | # Build in VM $(IMAGE) |
| 122 | vm-build-%: $(IMAGES_DIR)/%.img $(VM_VENV) |
| 123 | $(call quiet-command, \ |
| 124 | $(VM_PYTHON) $(SRC_PATH)/tests/vm/$* \ |
| 125 | $(if $(V)$(DEBUG), --debug) \ |
| 126 | $(if $(DEBUG), --interactive) \ |
| 127 | $(if $(J),--jobs $(J)) \ |
| 128 | $(if $(V),--verbose) \ |
| 129 | $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \ |
| 130 | $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \ |
| 131 | $(if $(LOG_CONSOLE),--log-console) \ |
| 132 | --image "$<" \ |
| 133 | $(if $(BUILD_TARGET),--build-target $(BUILD_TARGET)) \ |
| 134 | --snapshot \ |
| 135 | --build-qemu $(SRC_PATH) -- \ |
| 136 | $(if $(TARGET_LIST),--target-list=$(TARGET_LIST)) \ |
| 137 | $(if $(EXTRA_CONFIGURE_OPTS),$(EXTRA_CONFIGURE_OPTS)), \ |
| 138 | " VM-BUILD $*") |
| 139 | |
| 140 | vm-boot-serial-%: $(IMAGES_DIR)/%.img |
| 141 | qemu-system-x86_64 -enable-kvm -m 4G -smp 2 -nographic \ |
| 142 | -drive if=none,id=vblk,cache=writeback,file="$<" \ |
| 143 | -netdev user,id=vnet \ |
| 144 | -device virtio-blk-pci,drive=vblk \ |
| 145 | -device virtio-net-pci,netdev=vnet \ |
| 146 | || true |
| 147 | |
| 148 | vm-boot-ssh-%: $(IMAGES_DIR)/%.img $(VM_VENV) |
| 149 | $(call quiet-command, \ |
| 150 | $(VM_PYTHON) $(SRC_PATH)/tests/vm/$* \ |
| 151 | $(if $(J),--jobs $(J)) \ |
| 152 | $(if $(V)$(DEBUG), --debug) \ |
| 153 | $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \ |
| 154 | $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \ |
| 155 | $(if $(LOG_CONSOLE),--log-console) \ |
| 156 | --image "$<" \ |
| 157 | $(if $(ROOT_USER),--interactive-root,--interactive) \ |
| 158 | false, \ |
| 159 | " VM-BOOT-SSH $*") || true |