Files
opencoreC/Makefile
T

116 lines
4.2 KiB
Makefile

# opencoreC - Root Unified Makefile
# Target Architecture: x86_64 Long Mode (Microkernel OS)
SHELL := /usr/bin/env bash
# Toolchain definitions
CC := gcc
CXX := g++
LD := ld
CARGO := cargo
QEMU := qemu-system-x86_64
# Directory layout
BUILD_DIR := build
CONFIG_DIR := config
INCLUDE_DIR := include
LIB_DIR := lib
HAL_DIR := hal
SERVERS_DIR := servers
KERNEL_DIR := kernel
ISO_DIR := $(BUILD_DIR)/iso_root
# Common Freestanding Flags
COMMON_FLAGS := -Wall -Wextra -O2 -ffreestanding -fno-stack-protector \
-fno-pie -no-pie -mno-red-zone -m64 \
-I$(INCLUDE_DIR) -I$(LIB_DIR)/libc/include
CFLAGS := $(COMMON_FLAGS) -std=c11
CXXFLAGS := $(COMMON_FLAGS) -std=c++20 -fno-exceptions -fno-rtti -I$(LIB_DIR)/libipc_cpp/include
# Outputs
KERNEL_BIN := target/x86_64-unknown-none/release/opencore_kernel
KERNEL_ELF := $(BUILD_DIR)/opencore_kernel.elf
INIT_SERVER := $(BUILD_DIR)/init_server.elf
UART_DRIVER := $(BUILD_DIR)/uart_driver.elf
PROCMGR := $(BUILD_DIR)/procmgr.elf
.PHONY: all kernel libc hal servers iso run clean help
all: kernel libc hal servers
@mkdir -p $(BUILD_DIR)
@cp $(KERNEL_BIN) $(KERNEL_ELF)
@echo "======================================================="
@echo " [SUCCESS] opencoreC Skeleton Build Complete!"
@echo " Kernel: $(KERNEL_ELF)"
@echo " Servers: $(INIT_SERVER), $(UART_DRIVER), $(PROCMGR)"
@echo "======================================================="
kernel:
@echo "[CARGO] Compiling Rust Microkernel (x86_64-unknown-none)..."
@RUSTFLAGS="-C link-arg=-T$(CONFIG_DIR)/linker.ld -C code-model=kernel -C relocation-model=static" \
$(CARGO) build --package opencore_kernel --target x86_64-unknown-none --release
libc:
@mkdir -p $(BUILD_DIR)
@echo "[CC] Compiling bare-metal freestanding libc..."
@$(CC) $(CFLAGS) -c $(LIB_DIR)/libc/src/string.c -o $(BUILD_DIR)/string.o
@$(CC) $(CFLAGS) -c $(LIB_DIR)/libc/src/syscalls.c -o $(BUILD_DIR)/syscalls.o
hal: libc
@mkdir -p $(BUILD_DIR)
@echo "[CC] Compiling HAL and Hardware Drivers..."
@$(CC) $(CFLAGS) -I$(HAL_DIR)/include -c $(HAL_DIR)/src/uart.c -o $(BUILD_DIR)/uart.o
@$(CC) $(CFLAGS) -I$(HAL_DIR)/include -c $(HAL_DIR)/src/pci.c -o $(BUILD_DIR)/pci.o
@$(CC) $(CFLAGS) -I$(HAL_DIR)/include -c $(HAL_DIR)/src/apic.c -o $(BUILD_DIR)/apic.o
servers: libc hal
@mkdir -p $(BUILD_DIR)
@echo "[CXX/CC] Linking Ring 3 User-space Servers..."
@# Init Root Server
@$(CXX) $(CXXFLAGS) -c $(SERVERS_DIR)/init/main.cpp -o $(BUILD_DIR)/init_main.o
@$(LD) -T $(CONFIG_DIR)/user.ld -nostdlib -static -o $(INIT_SERVER) \
$(BUILD_DIR)/init_main.o $(BUILD_DIR)/syscalls.o $(BUILD_DIR)/string.o
@# Standalone UART Driver Server
@$(CC) $(CFLAGS) -I$(HAL_DIR)/include -c $(SERVERS_DIR)/uart_driver/main.c -o $(BUILD_DIR)/uart_driver_main.o
@$(LD) -T $(CONFIG_DIR)/user.ld -nostdlib -static -o $(UART_DRIVER) \
$(BUILD_DIR)/uart_driver_main.o $(BUILD_DIR)/uart.o $(BUILD_DIR)/syscalls.o $(BUILD_DIR)/string.o
@# Process Manager Daemon
@$(CXX) $(CXXFLAGS) -c $(SERVERS_DIR)/procmgr/main.cpp -o $(BUILD_DIR)/procmgr_main.o
@$(LD) -T $(CONFIG_DIR)/user.ld -nostdlib -static -o $(PROCMGR) \
$(BUILD_DIR)/procmgr_main.o $(BUILD_DIR)/syscalls.o $(BUILD_DIR)/string.o
# Staging Limine Boot ISO directory
iso: all
@mkdir -p $(ISO_DIR)/boot $(ISO_DIR)/EFI/BOOT
@cp $(KERNEL_ELF) $(ISO_DIR)/boot/
@cp $(INIT_SERVER) $(ISO_DIR)/boot/
@cp $(UART_DRIVER) $(ISO_DIR)/boot/
@cp limine.conf $(ISO_DIR)/boot/limine.conf
@cp limine.cfg $(ISO_DIR)/boot/limine.cfg
@echo "[ISO] Staged boot files in $(ISO_DIR)/"
run: all
@echo "[QEMU] Launching opencoreC in QEMU (Serial Output to Terminal)..."
@$(QEMU) -M q35 -m 512M \
-serial stdio \
-display none \
-no-reboot \
-no-shutdown \
-kernel $(KERNEL_ELF)
clean:
@echo "[CLEAN] Removing build directory and cargo target..."
@rm -rf $(BUILD_DIR) target
help:
@echo "opencoreC Microkernel Build System"
@echo "Targets:"
@echo " make all - Build kernel, HAL, libc, and user servers"
@echo " make kernel - Build Rust microkernel only"
@echo " make hal - Build freestanding HAL drivers"
@echo " make servers - Build Ring 3 C++ servers"
@echo " make iso - Stage ISO root boot directory"
@echo " make run - Launch QEMU with serial stdio"
@echo " make clean - Clean build artifacts"