|
1 | | -# Proka Kernel - A kernel for ProkaOS |
2 | | -# Copyright (C) RainSTR Studio 2025, All Rights Reserved. |
3 | | -# |
4 | | -# This is the Makefile, which will build the C and ASM code, in |
5 | | -# order to help us to make a Rust kernel more easily. |
6 | | -# |
7 | | -# |
8 | | -.PHONY: clean debug run iso |
9 | | -# Define some basic variables |
10 | | -BUILD_DIRS = kernel |
11 | | -OBJ_DIR = $(PWD)/target/obj |
12 | | -LDFLAGS = -nostdlib |
13 | | -XORRISOFLAGS = -as mkisofs --efi-boot limine/limine-uefi-cd.bin |
14 | | -QEMU_FLAGS := -bios ./assets/OVMF.fd -cdrom proka-kernel.iso --machine q35 -m 1G |
15 | | -# QEMU_KVM := -enable-kvm -cpu host |
16 | | -# QEMU_reOUT := > ./qemu.log |
17 | | -QEMU_OUT := -serial stdio $(QEMU_reOUT) |
18 | | -# Build the clean codes (easy, just run the Makefile in each dirs) |
19 | | -all: |
20 | | - # Iterate all the BUILD_DIRS. |
21 | | - $(foreach dir, $(BUILD_DIRS), make -C $(dir) OBJ_DIR=$(OBJ_DIR);) |
| 1 | +# Proka Kernel - Root Makefile |
| 2 | +# Copyright (C) RainSTR Studio 2025-2026, All Rights Reserved. |
| 3 | + |
| 4 | +.DEFAULT_GOAL := all |
| 5 | + |
| 6 | +# Verbosity control |
| 7 | +ifeq ($(V),1) |
| 8 | + Q := |
| 9 | +else |
| 10 | + Q := @ |
| 11 | +endif |
| 12 | + |
| 13 | +# Core variables |
| 14 | +BUILD_DIRS ?= kernel |
| 15 | +TARGET_DIR ?= $(CURDIR)/target |
| 16 | +OBJ_DIR ?= $(TARGET_DIR)/obj |
| 17 | +ISO_DIR ?= $(TARGET_DIR)/iso |
| 18 | +ISO_IMAGE ?= proka-kernel.iso |
| 19 | +INITRD ?= assets/initrd.cpio |
| 20 | + |
| 21 | +# Build tools & flags |
| 22 | +XORRISO ?= xorriso |
| 23 | +XORRISOFLAGS ?= -as mkisofs --efi-boot limine/limine-uefi-cd.bin -quiet |
| 24 | +QEMU ?= qemu-system-x86_64 |
| 25 | +QEMU_FLAGS ?= -bios ./assets/OVMF.fd -cdrom $(ISO_IMAGE) --machine q35 -m 1G -enable-kvm |
| 26 | +QEMU_OUT ?= -serial stdio |
| 27 | +QEMU_EXTRA ?= |
| 28 | + |
| 29 | +# Profile handling (default to release) |
| 30 | +PROFILE ?= dev |
| 31 | +export PROFILE |
| 32 | + |
| 33 | +.PHONY: all debug clean distclean run rundebug menuconfig iso $(BUILD_DIRS) |
| 34 | + |
| 35 | +# Standard build targets |
| 36 | +all: $(BUILD_DIRS) |
22 | 37 |
|
23 | 38 | debug: |
24 | | - # Iterate all the BUILD_DIRS, but use debug. |
25 | | - $(foreach dir, $(BUILD_DIRS), make -C $(dir) OBJ_DIR=$(OBJ_DIR) PROFILE=dev;) |
26 | | - |
27 | | -## Build the ISO image |
28 | | -# This code is from TMXQWQ/TKernel2 in github |
29 | | -iso: debug kernel/kernel initrd |
30 | | - mkdir -p iso |
31 | | - cp -r ./assets/rootfs/* ./iso/ |
32 | | - cp ./assets/initrd.cpio ./iso/initrd.cpio |
33 | | - rm -f ./assets/initrd.cpio |
34 | | - cp ./kernel/kernel ./iso/kernel |
35 | | - touch ./proka-kernel.iso |
36 | | - xorriso $(XORRISOFLAGS) ./iso -o ./proka-kernel.iso \ |
37 | | - 2> /dev/null |
38 | | - rm -rf ./iso |
39 | | - @echo "ISO image built: proka-kernel.iso" |
40 | | - |
41 | | -initrd: |
42 | | - cd ./assets/initrd && find . -print | cpio -H newc -v -o > ../initrd.cpio && cd ../.. |
| 39 | + $(Q)$(MAKE) PROFILE=dev all |
| 40 | + |
| 41 | +$(BUILD_DIRS): |
| 42 | + @echo "Entering directory: $@" |
| 43 | + $(Q)mkdir -p $(OBJ_DIR) |
| 44 | + $(Q)$(MAKE) -C $@ OBJ_DIR=$(OBJ_DIR) V=$(V) |
| 45 | + |
| 46 | +# ISO image creation |
| 47 | +iso: all $(INITRD) |
| 48 | + @echo "Creating ISO image: $(ISO_IMAGE)" |
| 49 | + $(Q)mkdir -p $(ISO_DIR) |
| 50 | + $(Q)cp -r ./assets/rootfs/* $(ISO_DIR)/ |
| 51 | + $(Q)cp $(INITRD) $(ISO_DIR)/initrd.cpio |
| 52 | + $(Q)cp ./kernel/kernel $(ISO_DIR)/kernel |
| 53 | + $(Q)$(XORRISO) $(XORRISOFLAGS) $(ISO_DIR) -o $(ISO_IMAGE) |
| 54 | + $(Q)rm -rf $(ISO_DIR) |
| 55 | + @echo "ISO build complete." |
| 56 | + |
| 57 | +# Initrd creation |
| 58 | +INITRD_SRC := $(shell find assets/initrd -type f 2>/dev/null) |
| 59 | +$(INITRD): $(INITRD_SRC) |
| 60 | + @echo "Creating initrd: $@" |
| 61 | + $(Q)mkdir -p assets |
| 62 | + $(Q)cd assets/initrd && find . -print | cpio -H newc -o > ../initrd.cpio 2>/dev/null |
43 | 63 |
|
| 64 | +# Execution & Debugging |
44 | 65 | run: iso |
45 | | - qemu-system-x86_64 -enable-kvm $(QEMU_FLAGS) $(QEMU_OUT) |
46 | | - @echo "QEMU started" |
| 66 | + $(Q)$(QEMU) $(QEMU_FLAGS) $(QEMU_OUT) $(QEMU_EXTRA) |
47 | 67 |
|
48 | | -rundebug: iso |
49 | | - qemu-system-x86_64 -enable-kvm $(QEMU_FLAGS) $(QEMU_OUT) -s -S |
| 68 | +rundebug: |
| 69 | + $(Q)$(MAKE) QEMU_EXTRA="-s -S" run |
50 | 70 |
|
51 | 71 | menuconfig: |
52 | | - cd ./kernel && cargo anaxa menuconfig |
| 72 | + $(Q)$(MAKE) -C kernel menuconfig |
53 | 73 |
|
| 74 | +# Cleanup |
54 | 75 | clean: |
55 | | - make -C kernel clean |
56 | | - rm -rf proka-kernel.iso target |
| 76 | + @for dir in $(BUILD_DIRS); do \ |
| 77 | + $(MAKE) -C $$dir clean V=$(V); \ |
| 78 | + done |
| 79 | + $(Q)rm -f $(ISO_IMAGE) $(INITRD) |
| 80 | + $(Q)rm -rf $(OBJ_DIR) |
| 81 | + @echo "Cleaned." |
57 | 82 |
|
| 83 | +distclean: clean |
| 84 | + $(Q)rm -rf $(TARGET_DIR) |
| 85 | + @echo "Full cleanup complete." |
0 commit comments