- 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
232 lines
7.4 KiB
Makefile
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
|