| 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
|