From 0820ee7d321a1b022d3f29e3b951ec46e2ab1538 Mon Sep 17 00:00:00 2001 From: Robert James Date: Fri, 6 Nov 2026 04:10:07 +0000 Subject: [PATCH] build: introduce mk/boards.mk board target table, T= selects board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T= now names a specific board (qemu, pc, pi4, pi5, milkv) rather than an arch alias. mk/boards.mk is the single table: sets ARCH, BOARD, and BOARD_NAME. Each Makefile applies board-specific compiler flags after its arch block — pi5 gets Cortex-A76 tuning, pi4 gets Cortex-A72, qemu uses portable x86-64 baseline instead of -march=native. Zynq-7020 is stubbed in comments for future 32-bit ARM support. ARCH= override still works for raw arch selection without a named board. Co-Authored-By: Claude Sonnet 4.6 --- Makefile | 60 +++++++++++++++++++++++++++++++++------------ Makefile.starkernel | 36 ++++++++++++++++++--------- mk/boards.mk | 48 ++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 mk/boards.mk diff --git a/Makefile b/Makefile index 35d6cfa9..f2c523e2 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,11 @@ # # Quick Start: # make - Build for host arch (fastest profile, always) -# make T=raspi - Build for Raspberry Pi 4 (T= is a shorthand for ARCH=) -# make T=amd64 - Build for x86_64 -# make T=riscv64 - Build for RISC-V 64 +# make T=qemu - Build portable x86-64 for QEMU +# make T=pc - Build for x86-64 PC (native tuning) +# make T=pi4 - Cross-compile for Raspberry Pi 4 (Cortex-A72) +# make T=pi5 - Cross-compile for Raspberry Pi 5 (Cortex-A76) +# make T=milkv - Cross-compile for Milk-V Pioneer (RISC-V 64) # make help - Show all available targets # # ============================================================================== @@ -23,10 +25,8 @@ CC = gcc # See docs/DEVELOPER.md for installation instructions ISABELLE ?= isabelle -# Architecture / target selection — T= is a shorthand for ARCH= (board/SBC) -ifdef T -ARCH ?= $(T) -endif +# Board / architecture selection — T= picks a board (see mk/boards.mk) +include mk/boards.mk ARCH ?= $(shell uname -m) ARCH := $(strip $(ARCH)) TARGET := fastest @@ -105,6 +105,33 @@ else ASM_SYNTAX = endif +# Board-specific overrides — refine arch defaults for exact hardware +# QEMU: use portable baseline, not -march=native +ifeq ($(BOARD),qemu) + ARCH_FLAGS := -march=x86-64 -mtune=generic + ARCH_DEFINES += -DBOARD_QEMU=1 +# PC: native tuning (already the amd64 default; explicit for clarity) +else ifeq ($(BOARD),pc) + ARCH_FLAGS := -march=native + ARCH_DEFINES += -DBOARD_PC=1 +# Raspberry Pi 4 — Cortex-A72, ARMv8-A +else ifeq ($(BOARD),pi4) + ARCH_FLAGS := -march=armv8-a+crc+simd -mtune=cortex-a72 + ARCH_DEFINES += -DBOARD_RPI4=1 -DRASPBERRY_PI_BUILD=1 +# Raspberry Pi 5 — Cortex-A76, ARMv8.2-A +else ifeq ($(BOARD),pi5) + ARCH_FLAGS := -march=armv8.2-a+crypto+fp16+rcpc+dotprod -mtune=cortex-a76 + ARCH_DEFINES += -DBOARD_RPI5=1 -DRASPBERRY_PI_BUILD=1 +# Milk-V Pioneer — SG2042 RISC-V 64 +else ifeq ($(BOARD),milkv) + ARCH_FLAGS := -march=rv64gc -mabi=lp64d -mcmodel=medany + ARCH_DEFINES += -DBOARD_MILKV=1 +endif +# Use board name in ARCH_NAME when T= is set +ifdef BOARD_NAME + ARCH_NAME := $(BOARD_NAME) +endif + # Compiler flags # Feature switches (default: enabled) # Physics/SSM knob family: repointed through the Kconfig bridge (see @@ -1251,18 +1278,19 @@ help: @echo "════════════════════════════════════════════════════════════" @echo "" @echo "🛠️ Variables:" - @echo " ARCH= (default: $(ARCH); canonical directory: $(ARCH_DIR))" - @echo " TARGET= (standard | fast | fastest | turbo)" + @echo " T= Board target (preferred). Supported:" + @echo " qemu — portable x86-64 for QEMU" + @echo " pc — x86-64 PC (native tuning)" + @echo " pi4 — Raspberry Pi 4 (Cortex-A72)" + @echo " pi5 — Raspberry Pi 5 (Cortex-A76)" + @echo " milkv — Milk-V Pioneer (SG2042 RISC-V 64)" + @echo " ARCH= Low-level arch override (amd64 | arm64 | riscv64)" + @echo " Active: $(ARCH) / board: $(or $(BOARD_NAME),$(ARCH_NAME))" @echo "" - @echo "🏆 OPTIMIZATION BUILDS:" - @echo " fastest - Maximum performance (ASM + direct threading + LTO)" - @echo " fast - Fast without LTO (easier debugging)" - @echo " turbo - Assembly optimizations only" + @echo "🏆 BUILD PROFILE: fastest (always — ASM + direct threading + LTO)" @echo "" @echo "🥧 PLATFORM-SPECIFIC BUILDS:" - @echo " rpi4 - Native build on Raspberry Pi 4" - @echo " rpi4-cross - Cross-compile from x86_64" - @echo " rpi4-fastest - Maximum optimization for RPi4" + @echo " rpi4-cross - Cross-compile for Raspberry Pi 4 (legacy; use T=pi4)" @echo " riscv64-clang - Cross-compile for RISC-V 64 via clang (GCC fails here)" @echo " minimal - Minimal/embedded build" @echo "" diff --git a/Makefile.starkernel b/Makefile.starkernel index 80a936c5..12bc2759 100644 --- a/Makefile.starkernel +++ b/Makefile.starkernel @@ -26,10 +26,8 @@ canon_arch = $(strip \ $(if $(filter riscv riscv64,$1),riscv64,$1)))))) UNAME_M := $(shell uname -m) -# T= is a shorthand for ARCH= (board/SBC selection) -ifdef T -ARCH ?= $(T) -endif +# T= selects the board target (see mk/boards.mk for the full table) +include mk/boards.mk ARCH ?= $(call canon_arch,$(UNAME_M)) override ARCH := $(call canon_arch,$(ARCH)) @@ -245,6 +243,13 @@ endif LOADER_CC ?= $(CC) LOADER_LD ?= $(LD) +# Board-specific ARCH_CFLAGS overrides — refine CPU tuning beyond arch default +ifeq ($(BOARD),pi4) + ARCH_CFLAGS := -march=armv8-a -mcpu=cortex-a72 -DARCH_AARCH64 -mno-outline-atomics +else ifeq ($(BOARD),pi5) + ARCH_CFLAGS := -march=armv8.2-a -mcpu=cortex-a76 -DARCH_AARCH64 -mno-outline-atomics +endif + # ============================================================================== # COMPILER FLAGS # ============================================================================== @@ -1246,6 +1251,7 @@ endif info: @echo "StarKernel Build Configuration" @echo "===============================" + @echo "Board: $(or $(BOARD_NAME),$(ARCH) (no board selected))" @echo "Architecture: $(ARCH)" @echo "Target: $(TARGET)" @echo "Compiler: $(CC)" @@ -1263,10 +1269,17 @@ help: @echo "StarKernel Build System" @echo "=======================" @echo "" - @echo "Usage: make -f Makefile.starkernel [ARCH=] [TARGET=] " + @echo "Usage: make -f Makefile.starkernel [T=] [TARGET=] " @echo "" - @echo "Architectures (aliases accepted):" - @echo " ARCH=amd64 / x86_64 — x86-64 (default on x86 host)" + @echo "Board targets (T=):" + @echo " T=qemu — QEMU x86_64 (portable baseline)" + @echo " T=pc — x86_64 PC (native tuning)" + @echo " T=pi4 — Raspberry Pi 4 (Cortex-A72, aarch64)" + @echo " T=pi5 — Raspberry Pi 5 (Cortex-A76, aarch64)" + @echo " T=milkv — Milk-V Pioneer (SG2042, riscv64)" + @echo "" + @echo "Low-level arch override (bypasses board table):" + @echo " ARCH=amd64 / x86_64 — x86-64" @echo " ARCH=aarch64 / arm64 — ARM64" @echo " ARCH=riscv64 / riscv — RISC-V 64-bit" @echo "" @@ -1293,8 +1306,9 @@ help: @echo " help — show this message" @echo "" @echo "Examples:" - @echo " make -f Makefile.starkernel ARCH=amd64 qemu" - @echo " make -f Makefile.starkernel ARCH=aarch64 clean qemu" - @echo " make -f Makefile.starkernel ARCH=riscv64 clean qemu" - @echo " make -f Makefile.starkernel ARCH=x86_64 qemu # alias works" + @echo " make -f Makefile.starkernel T=qemu qemu" + @echo " make -f Makefile.starkernel T=pi4 clean qemu" + @echo " make -f Makefile.starkernel T=pi5 clean qemu" + @echo " make -f Makefile.starkernel T=milkv clean all" @echo " make -f Makefile.starkernel kernel-all" + @echo " make -f Makefile.starkernel ARCH=riscv64 clean qemu # arch override still works" diff --git a/mk/boards.mk b/mk/boards.mk new file mode 100644 index 00000000..212a2b85 --- /dev/null +++ b/mk/boards.mk @@ -0,0 +1,48 @@ +# Board target table — T= selects board, sets ARCH + BOARD + BOARD_NAME. +# Included early by both Makefile and Makefile.starkernel, before arch +# normalization runs. Each Makefile applies board-specific flag overrides +# after its own arch block. +# +# Adding a new board: add an ifeq block here, then add compiler-flag +# overrides in the board-override sections of Makefile and +# Makefile.starkernel if the board needs tuning beyond the arch default. + +ifdef T + +ifeq ($(T),qemu) + ARCH ?= amd64 + BOARD := qemu + BOARD_NAME := QEMU x86_64 + +else ifeq ($(T),pc) + ARCH ?= amd64 + BOARD := pc + BOARD_NAME := x86_64 PC (native) + +else ifeq ($(T),pi4) + ARCH ?= aarch64 + BOARD := pi4 + BOARD_NAME := Raspberry Pi 4 (Cortex-A72) + +else ifeq ($(T),pi5) + ARCH ?= aarch64 + BOARD := pi5 + BOARD_NAME := Raspberry Pi 5 (Cortex-A76) + +else ifeq ($(T),milkv) + ARCH ?= riscv64 + BOARD := milkv + BOARD_NAME := Milk-V Pioneer (SG2042 RISC-V 64) + +# ── Future boards (uncomment + add flag overrides in Makefile / Makefile.starkernel) ── +# else ifeq ($(T),zynq7020) +# ARCH ?= arm +# BOARD := zynq7020 +# BOARD_NAME := Xilinx Zynq-7020 (Cortex-A9, 32-bit) +# # NOTE: requires removing the 32-bit guardrail and adding armhf toolchain support + +else + $(error Unknown board target T='$(T)'. Supported: qemu pc pi4 pi5 milkv) +endif + +endif # ifdef T