summaryrefslogtreecommitdiffstats
path: root/tests/vm/Makefile.include
blob: f8ca619cf2a9333b5e6f18aebfda2f8790e3f34c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# Makefile for VM tests

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

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

IMAGES := freebsd netbsd openbsd centos fedora haiku.x86_64
ifneq ($(GENISOIMAGE),)
IMAGES += ubuntu.i386 centos
ifneq ($(EFI_AARCH64),)
IMAGES += ubuntu.aarch64 centos.aarch64
endif
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"
	@echo "  vm-build-fedora                 - Build QEMU in Fedora VM"
ifneq ($(GENISOIMAGE),)
	@echo "  vm-build-centos                 - Build QEMU in CentOS VM, with Docker"
	@echo "  vm-build-ubuntu.i386            - Build QEMU in ubuntu i386 VM"
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 all VMs"
	@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 "    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 ouput 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
	@mkdir -p $(IMAGES_DIR)
	$(call quiet-command, \
		$(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
	$(call quiet-command, \
		$(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
	$(call quiet-command, \
		$(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