tonarchy

tonarchy

https://git.tonybtw.com/tonarchy.git git://git.tonybtw.com/tonarchy.git
3,386 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 install static build build-container test test-nix test-disk 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-disk:
69
	@if [ ! -f "$(TEST_DISK)" ]; then \
70
		echo "No test disk found. Run 'make test' first to install."; \
71
		exit 1; \
72
	fi
73
	@OVMF_CODE=$$(find /usr/share/edk2 /usr/share/OVMF -name "OVMF_CODE*.fd" 2>/dev/null | grep x64 | head -1); \
74
	if [ -z "$$OVMF_CODE" ]; then \
75
		echo "Error: OVMF not found. Install with: sudo pacman -S edk2-ovmf"; \
76
		exit 1; \
77
	fi; \
78
	echo "Booting from installed disk: $(TEST_DISK)"; \
79
	echo "SSH available at: ssh -p 2222 user@localhost"; \
80
	qemu-system-x86_64 \
81
		-cpu host -enable-kvm -machine q35,accel=kvm \
82
		-smp $$(nproc) \
83
		-m 8192 \
84
		-drive file=$(TEST_DISK),format=qcow2,if=virtio \
85
		-drive if=pflash,format=raw,readonly=on,file=$$OVMF_CODE \
86
		-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
87
		-vga virtio \
88
		-display gtk \
89
		-usb -device usb-tablet \
90
		-netdev user,id=net0,hostfwd=tcp::2222-:22 \
91
		-device virtio-net-pci,netdev=net0 \
92
		-boot menu=on
93
94
clean-vm:
95
	rm -f $(TEST_DISK) OVMF_VARS.fd
96
97
clean-iso:
98
	rm -rf out/*.iso
99
	sudo rm -rf /tmp/tonarchy_iso_work
100
101
clean: clean-iso clean-vm
102
	rm -f $(TARGET) $(TARGET)-static build_iso
103
104
install: $(TARGET)
105
	install -Dm755 $(TARGET) /usr/local/bin/$(TARGET)
106
	cp -r packages /usr/share/tonarchy/
107
	cp -r configs /usr/share/tonarchy/