tonarchy

tonarchy

https://git.tonybtw.com/tonarchy.git git://git.tonybtw.com/tonarchy.git
4,926 bytes raw
1
CC = gcc
2
CFLAGS = -std=c23 -Wall -Wextra -O2 -Wno-format-truncation
3
LDFLAGS =
4
STATIC_LDFLAGS = -static
5
6
TARGET = tonarchy
7
SRC = src/tonarchy.c
8
LATEST_ISO = $(shell ls -t out/*.iso 2>/dev/null | head -1)
9
TEST_DISK = test-disk.qcow2
10
11
.PHONY: all clean static build build-container test test-nix test-disk test-nvme release clean-iso clean-vm
12
13
all: $(TARGET)
14
15
static: $(TARGET)-static
16
17
build_iso: src/build_iso.c src/build_iso.h
18
	$(CC) $(CFLAGS) src/build_iso.c -o build_iso
19
20
$(TARGET): $(SRC)
21
	$(CC) $(CFLAGS) $(SRC) -o $(TARGET) $(LDFLAGS)
22
23
$(TARGET)-static: $(SRC)
24
	$(CC) $(CFLAGS) $(SRC) -o $(TARGET)-static $(STATIC_LDFLAGS)
25
26
build: build_iso
27
	./build_iso --iso-profile ./iso --out-dir ./out
28
29
build-container: build_iso
30
	./build_iso --iso-profile ./iso --out-dir ./out --container podman
31
32
test-nix:
33
	@if [ -z "$(LATEST_ISO)" ]; then echo "No ISO found. Run 'nix run .#build_iso -- --container podman' first"; exit 1; fi
34
	./vm-test "$(LATEST_ISO)"
35
36
test:
37
	@if [ -z "$(LATEST_ISO)" ]; then echo "No ISO found. Run 'make build' first"; exit 1; fi
38
	@if [ ! -f "$(TEST_DISK)" ]; then \
39
		echo "Creating test disk..."; \
40
		qemu-img create -f qcow2 "$(TEST_DISK)" 20G; \
41
	fi
42
	@OVMF_CODE=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_CODE*.fd" 2>/dev/null | grep x64 | head -1); \
43
	if [ -z "$$OVMF_CODE" ]; then \
44
		echo "Error: OVMF not found. Install with: sudo pacman -S edk2-ovmf"; \
45
		exit 1; \
46
	fi; \
47
	OVMF_VARS=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_VARS*.fd" 2>/dev/null | grep x64 | head -1); \
48
	if [ ! -f ./OVMF_VARS.fd ]; then \
49
		cp "$$OVMF_VARS" ./OVMF_VARS.fd; \
50
	fi; \
51
	echo "Starting UEFI VM with ISO: $(LATEST_ISO)"; \
52
	qemu-system-x86_64 \
53
		-cpu host -enable-kvm -machine q35,accel=kvm \
54
		-smp $$(nproc) \
55
		-m 8192 \
56
		-drive file=$(TEST_DISK),format=qcow2,if=virtio \
57
		-drive if=pflash,format=raw,readonly=on,file=$$OVMF_CODE \
58
		-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
59
		-drive file="$(LATEST_ISO)",media=cdrom,readonly=on,cache=none \
60
		-boot order=d \
61
		-vga virtio \
62
		-display gtk \
63
		-usb -device usb-tablet \
64
		-netdev user,id=net0,hostfwd=tcp::2222-:22 \
65
		-device virtio-net-pci,netdev=net0 \
66
		-boot menu=on
67
68
test-nvme:
69
	@if [ -z "$(LATEST_ISO)" ]; then echo "No ISO found. Run 'make build' first"; exit 1; fi
70
	@if [ ! -f "$(TEST_DISK)" ]; then \
71
		echo "Creating test disk..."; \
72
		qemu-img create -f qcow2 "$(TEST_DISK)" 20G; \
73
	fi
74
	@OVMF_CODE=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_CODE*.fd" 2>/dev/null | grep x64 | head -1); \
75
	if [ -z "$$OVMF_CODE" ]; then \
76
		echo "Error: OVMF not found. Install with: sudo pacman -S edk2-ovmf"; \
77
		exit 1; \
78
	fi; \
79
	OVMF_VARS=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_VARS*.fd" 2>/dev/null | grep x64 | head -1); \
80
	if [ ! -f ./OVMF_VARS.fd ]; then \
81
		cp "$$OVMF_VARS" ./OVMF_VARS.fd; \
82
	fi; \
83
	echo "Starting UEFI VM with NVMe disk: $(LATEST_ISO)"; \
84
	qemu-system-x86_64 \
85
		-cpu host -enable-kvm -machine q35,accel=kvm \
86
		-smp $$(nproc) \
87
		-m 8192 \
88
		-drive file=$(TEST_DISK),format=qcow2,if=none,id=nvme0 \
89
		-device nvme,serial=deadbeef,drive=nvme0 \
90
		-drive if=pflash,format=raw,readonly=on,file=$$OVMF_CODE \
91
		-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
92
		-drive file="$(LATEST_ISO)",media=cdrom,readonly=on,cache=none \
93
		-boot order=d \
94
		-vga virtio \
95
		-display gtk \
96
		-usb -device usb-tablet \
97
		-netdev user,id=net0,hostfwd=tcp::2222-:22 \
98
		-device virtio-net-pci,netdev=net0 \
99
		-boot menu=on
100
101
test-disk:
102
	@if [ ! -f "$(TEST_DISK)" ]; then \
103
		echo "No test disk found. Run 'make test' first to install."; \
104
		exit 1; \
105
	fi
106
	@OVMF_CODE=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_CODE*.fd" 2>/dev/null | grep x64 | head -1); \
107
	if [ -z "$$OVMF_CODE" ]; then \
108
		echo "Error: OVMF not found. Install with: sudo pacman -S edk2-ovmf"; \
109
		exit 1; \
110
	fi; \
111
	echo "Booting from installed disk: $(TEST_DISK)"; \
112
	echo "SSH available at: ssh -p 2222 user@localhost"; \
113
	qemu-system-x86_64 \
114
		-cpu host -enable-kvm -machine q35,accel=kvm \
115
		-smp $$(nproc) \
116
		-m 8192 \
117
		-drive file=$(TEST_DISK),format=qcow2,if=virtio \
118
		-drive if=pflash,format=raw,readonly=on,file=$$OVMF_CODE \
119
		-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
120
		-vga virtio \
121
		-display gtk \
122
		-usb -device usb-tablet \
123
		-netdev user,id=net0,hostfwd=tcp::2222-:22 \
124
		-device virtio-net-pci,netdev=net0 \
125
		-boot menu=on
126
127
release: build
128
	@if [ -z "$(LATEST_ISO)" ]; then echo "No ISO found after build"; exit 1; fi
129
	@echo "Generating checksums for $(LATEST_ISO)..."
130
	@cd out && sha256sum $(notdir $(LATEST_ISO)) > $(notdir $(LATEST_ISO)).sha256
131
	@cd out && md5sum $(notdir $(LATEST_ISO)) > $(notdir $(LATEST_ISO)).md5
132
	@echo "Release files ready in out/:"
133
	@ls -lh out/$(notdir $(LATEST_ISO))*
134
135
clean-vm:
136
	rm -f $(TEST_DISK) OVMF_VARS.fd
137
138
clean-iso:
139
	rm -rf out/*.iso out/*.sha256 out/*.md5
140
	sudo rm -rf /tmp/tonarchy_iso_work
141
142
clean: clean-iso clean-vm
143
	rm -f $(TARGET) $(TARGET)-static build_iso