universalisos/microkernel/Makefile
Fábio Coutada 62e8454f91 build: add UEFI ISO builder, test boot scripts, EIM config
- make-uefi-iso.sh: UEFI ISO image builder
- test_boot.S, test_boot.ld: test boot assembly and linker script
- eim_config.toml: EIM (External Interface Module) configuration
- edk2-ovmf RPM for UEFI firmware
- GAP_ANALYSIS_PIKEOS_PARITY.md: PikeOS parity gap analysis
2026-07-15 15:33:07 +01:00

232 lines
7.4 KiB
Makefile

# UniversalisOS Microkernel — Multi-target Makefile
#
# Usage:
# make (default: QEMU lm3s6965evb)
# make TARGET=stm32f0 (STM32F0 Nucleo boards)
# make TARGET=stm32g0 (STM32G0 Nucleo boards)
# make TARGET=stm32l0 (STM32L0 Nucleo/Discovery)
# make TARGET=nxp_kl (NXP Kinetis KL25Z/KL43Z/KL46Z/KW41Z)
# make TARGET=nxp_lpc (NXP LPC1114)
# make TARGET=nuvoton_nano (Nuvoton NANO130)
# make run (run in QEMU — ARMv6m only)
# make clean (clean build artifacts)
# === Target selection ===
TARGET ?= lm3s6965evb
# Target → port directory mapping
ifeq ($(TARGET),lm3s6965evb)
PORT_DIR = ports/armv6m
CPU = -mcpu=cortex-m0 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = lm3s6965evb
QEMU_CPU = cortex-m3
QEMU_MEM = 16K
else ifeq ($(TARGET),stm32f0)
PORT_DIR = ports/stm32f0
CPU = -mcpu=cortex-m0 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = stm32f072b-discovery
QEMU_CPU = cortex-m0
QEMU_MEM = 16K
else ifeq ($(TARGET),stm32g0)
PORT_DIR = ports/stm32g0
CPU = -mcpu=cortex-m0plus -mthumb
QEMU = qemu-system-arm
QEMU_MACH = stm32g071b-st
QEMU_CPU = cortex-m0plus
QEMU_MEM = 36K
else ifeq ($(TARGET),stm32l0)
PORT_DIR = ports/stm32l0
CPU = -mcpu=cortex-m0plus -mthumb
QEMU = qemu-system-arm
QEMU_MACH = stm32l073rz
QEMU_CPU = cortex-m0plus
QEMU_MEM = 20K
else ifeq ($(TARGET),nxp_kl)
PORT_DIR = ports/nxp_kl
CPU = -mcpu=cortex-m0plus -mthumb
QEMU = qemu-system-arm
QEMU_MACH = frdm-kl25z
QEMU_CPU = cortex-m0plus
QEMU_MEM = 16K
else ifeq ($(TARGET),nxp_lpc)
PORT_DIR = ports/nxp_lpc
CPU = -mcpu=cortex-m0 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = lpc1114
QEMU_CPU = cortex-m0
QEMU_MEM = 4K
else ifeq ($(TARGET),nuvoton_nano)
PORT_DIR = ports/nuvoton_nano
CPU = -mcpu=cortex-m0 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = numaker-pfm-nano130
QEMU_CPU = cortex-m0
QEMU_MEM = 16K
else ifeq ($(TARGET),lpc55s69)
PORT_DIR = ports/lpc55s69
CPU = -mcpu=cortex-m33 -mthumb -mfloat-abi=hard
QEMU = echo
QEMU_MACH = mps2-an505
QEMU_CPU = cortex-m33
QEMU_MEM = 256K
TIER_CFG = -DUOS_TIER=2 -DUOS_HAS_TZ=1 -DUOS_HAS_MPU=1
else ifeq ($(TARGET),mps2_m4)
PORT_DIR = ports/mps2_m4
CPU = -mcpu=cortex-m4 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = mps2-an386
QEMU_CPU = cortex-m4
QEMU_MEM = 512K
TIER_CFG = -DUOS_TIER=1 -DUOS_HAS_MPU=1
CFLAGS_TIER = $(TIER_CFG)
else ifeq ($(TARGET),nordic_nrf51)
PORT_DIR = ports/nordic_nrf51
CPU = -mcpu=cortex-m0 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = microbit
QEMU_CPU = cortex-m0
QEMU_MEM = 16K
else ifeq ($(TARGET),silabs_efm32)
PORT_DIR = ports/silabs_efm32
CPU = -mcpu=cortex-m3 -mthumb
QEMU = qemu-system-arm
QEMU_MACH = lm3s811evb
QEMU_CPU = cortex-m3
QEMU_MEM = 32K
else ifeq ($(TARGET),ambiq_apollo)
PORT_DIR = ports/ambiq_apollo
CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
QEMU = qemu-system-arm
QEMU_MACH = ast1030-evb
QEMU_CPU = cortex-m4
QEMU_MEM = 256K
else ifeq ($(TARGET),esp32)
XTENSA_ROOT = $(HOME)/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20260121/xtensa-esp-elf
PORT_DIR = ports/esp32
override CC = $(XTENSA_ROOT)/bin/xtensa-esp32-elf-gcc
override AS = $(XTENSA_ROOT)/bin/xtensa-esp32-elf-as
override LD = $(XTENSA_ROOT)/bin/xtensa-esp32-elf-ld
override OBJCOPY = $(XTENSA_ROOT)/bin/xtensa-esp32-elf-objcopy
override SIZE = $(XTENSA_ROOT)/bin/xtensa-esp32-elf-size
CPU = -mlongcalls -mtext-section-literals -mabi=call0
CFLAGS = $(TIER_CFG) $(CPU) -Iinclude -Iports/esp32 -Iports/common
LDFLAGS = -T ports/esp32/linker.ld
QEMU = echo
QEMU_MACH = esp32
QEMU_CPU = esp32
else ifeq ($(TARGET),esp32s3)
XTENSA_ROOT = $(HOME)/.espressif/tools/xtensa-esp-elf/esp-14.2.0_20260121/xtensa-esp-elf
PORT_DIR = ports/esp32
override CC = $(XTENSA_ROOT)/bin/xtensa-esp32s3-elf-gcc
override AS = $(XTENSA_ROOT)/bin/xtensa-esp32s3-elf-as
override LD = $(XTENSA_ROOT)/bin/xtensa-esp32s3-elf-ld
override OBJCOPY = $(XTENSA_ROOT)/bin/xtensa-esp32s3-elf-objcopy
override SIZE = $(XTENSA_ROOT)/bin/xtensa-esp32s3-elf-size
CPU = -mlongcalls -mtext-section-literals -mabi=call0
CFLAGS = $(TIER_CFG) $(CPU) -Iinclude -Iports/esp32 -Iports/common
LDFLAGS = -T ports/esp32/linker_s3.ld
QEMU = echo
QEMU_MACH = esp32s3
QEMU_CPU = esp32s3
else
$(error Unknown target: $(TARGET). Valid: lm3s6965evb stm32f0 stm32g0 stm32l0 nxp_kl nxp_lpc nuvoton_nano)
endif
# === Build configuration ===
CC = arm-none-eabi-gcc
AS = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
SIZE ?= arm-none-eabi-size
INCLUDES = -Iinclude -I$(PORT_DIR) -Iports/common
TIER_CFG ?=
CFLAGS = $(TIER_CFG) $(CPU) -std=c99 -Os -Wall -Wextra -Werror \
-ffreestanding -fno-builtin -fno-exceptions \
-ffunction-sections -fdata-sections $(INCLUDES)
ASFLAGS = -mabi=call0 $(INCLUDES)
LIBGCC = $(shell $(CC) $(CPU) -print-libgcc-file-name)
ifeq ($(filter esp32 esp32s3,$(TARGET)),)
LDFLAGS = $(CPU) -nostartfiles -Wl,--gc-sections -T $(PORT_DIR)/linker.ld
endif
BUILD_DIR = build/$(TARGET)
# === Source files ===
CORE_DIR = src/core
PERSONALITY_DIR = src/personality
TEST_DIR = test
CORE_SRC = $(wildcard $(CORE_DIR)/*.c)
PERSONALITY_SRC = $(wildcard $(PERSONALITY_DIR)/*.c)
PORT_SRC = $(wildcard $(PORT_DIR)/*.c)
PORT_ASM = $(wildcard $(PORT_DIR)/*.S)
PORT_ASM = $(wildcard $(PORT_DIR)/*.S)
TEST_SRC = test/test_hrt3.c
COMMON_DIR = ports/common
ifeq ($(filter esp32 esp32s3,$(TARGET)),)
COMMON_ASM = $(wildcard $(COMMON_DIR)/*.S)
else
COMMON_ASM = $(filter-out $(COMMON_DIR)/uos_port_context.S,$(wildcard $(COMMON_DIR)/*.S))
endif
CORE_OBJ = $(patsubst $(CORE_DIR)/%.c,$(BUILD_DIR)/core/%.o,$(CORE_SRC))
PERSONALITY_OBJ = $(patsubst $(PERSONALITY_DIR)/%.c,$(BUILD_DIR)/pers/%.o,$(PERSONALITY_SRC))
PORT_OBJ = $(patsubst $(PORT_DIR)/%.c,$(BUILD_DIR)/port/%.o,$(PORT_SRC))
PORT_AOBJ = $(patsubst $(PORT_DIR)/%.S,$(BUILD_DIR)/port/%.o,$(PORT_ASM))
PORT_AOBJ = $(patsubst $(PORT_DIR)/%.S,$(BUILD_DIR)/port/%.o,$(PORT_ASM))
TEST_OBJ = $(patsubst $(TEST_DIR)/%.c,$(BUILD_DIR)/test/%.o,$(TEST_SRC))
COMMON_AOBJ = $(patsubst $(COMMON_DIR)/%.S,$(BUILD_DIR)/common/%.o,$(COMMON_ASM))
OBJS = $(CORE_OBJ) $(PERSONALITY_OBJ) $(PORT_OBJ) $(PORT_AOBJ) $(COMMON_AOBJ) $(TEST_OBJ)
TARGET_ELF = $(BUILD_DIR)/universalisos.elf
TARGET_BIN = $(BUILD_DIR)/universalisos.bin
# === Rules ===
.PHONY: all clean run size
all: $(TARGET_ELF) size
$(TARGET_ELF): $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) $(LIBGCC) -o $@
$(OBJCOPY) -O binary $@ $(TARGET_BIN)
$(BUILD_DIR)/core/%.o: $(CORE_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/port/%.o: $(PORT_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/pers/%.o: $(PERSONALITY_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/port/%.o: $(PORT_DIR)/%.S
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/common/%.o: $(COMMON_DIR)/%.S
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
$(BUILD_DIR)/test/%.o: $(TEST_DIR)/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
size: $(TARGET_ELF)
@$(SIZE) $(TARGET_ELF)
run: $(TARGET_ELF)
$(QEMU) -M $(QEMU_MACH) -cpu $(QEMU_CPU) -m $(QEMU_MEM) \
-nographic -kernel $(TARGET_ELF)
clean:
rm -rf build