summaryrefslogtreecommitdiff
path: root/scripts/build/toolchain.mk
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-07-10 23:20:03 +0800
commit48ef95c24e9ac3d11200b61af617a01b10b507d1 (patch)
tree57f0e26ab98e795b19839b6eece98ca58a4b702d /scripts/build/toolchain.mk
parentb9ff206e6bd3f4d67851263a6f2acb5f575cf3b0 (diff)
downloadlume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.gz
lume-48ef95c24e9ac3d11200b61af617a01b10b507d1.tar.xz
build: introduce declarative non-recursive build graph
Diffstat (limited to 'scripts/build/toolchain.mk')
-rw-r--r--scripts/build/toolchain.mk103
1 files changed, 103 insertions, 0 deletions
diff --git a/scripts/build/toolchain.mk b/scripts/build/toolchain.mk
new file mode 100644
index 0000000..49d4f0a
--- /dev/null
+++ b/scripts/build/toolchain.mk
@@ -0,0 +1,103 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2026 Richard Qin
+
+# Toolchain selection:
+# make GCC + GNU ld
+# make LLVM=1 Clang + GNU ld
+# make LLVM=1 LD_TYPE=lld Clang + LLD
+
+LLVM ?= 0
+LLVM_VERSION ?= 20
+LD_TYPE ?= bfd
+LLVM_BINUTILS ?= 0
+CXX_STDLIB ?= libstdc++
+CXX_ABI ?= lume
+COMPILER_RUNTIME ?= compiler-default
+
+GCC_TOOLCHAIN ?=
+CROSS_COMPILE ?=
+
+ifeq ($(ARCH),riscv)
+TARGET_TRIPLE := riscv64-unknown-linux-gnu
+ifeq ($(strip $(GCC_TOOLCHAIN)),)
+ifneq ($(wildcard /opt/riscv64-glibc/bin/riscv64-unknown-linux-gnu-g++),)
+GCC_TOOLCHAIN := /opt/riscv64-glibc
+endif
+endif
+ifeq ($(strip $(CROSS_COMPILE)),)
+ifneq ($(strip $(GCC_TOOLCHAIN)),)
+CROSS_COMPILE := $(GCC_TOOLCHAIN)/bin/$(TARGET_TRIPLE)-
+else
+CROSS_COMPILE := $(TARGET_TRIPLE)-
+endif
+endif
+else ifeq ($(ARCH),aarch64)
+TARGET_TRIPLE := aarch64-linux-gnu
+else ifeq ($(ARCH),x86_64)
+TARGET_TRIPLE := x86_64-linux-gnu
+endif
+
+ifeq ($(strip $(CROSS_COMPILE)),)
+CROSS_COMPILE := $(TARGET_TRIPLE)-
+endif
+ifeq ($(strip $(GCC_TOOLCHAIN)),)
+GCC_TOOLCHAIN := $(patsubst %/bin/,%, $(dir $(CROSS_COMPILE)))
+endif
+
+GCC_SYSROOT := $(strip $(shell $(CROSS_COMPILE)g++ -print-sysroot 2>/dev/null))
+
+CLANG_SUFFIX := $(if $(LLVM_VERSION),-$(LLVM_VERSION),)
+CLANG ?= clang$(CLANG_SUFFIX)
+CLANGXX ?= clang++$(CLANG_SUFFIX)
+LLD ?= ld.lld$(CLANG_SUFFIX)
+
+CLANG_TARGET_FLAGS := --target=$(TARGET_TRIPLE)
+ifneq ($(strip $(GCC_TOOLCHAIN)),)
+CLANG_TARGET_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
+endif
+ifneq ($(strip $(GCC_SYSROOT)),)
+CLANG_TARGET_FLAGS += --sysroot=$(GCC_SYSROOT)
+endif
+
+ifeq ($(LLVM),1)
+CC := $(CLANG)
+CXX := $(CLANGXX)
+COMPILER_FAMILY := clang
+TOOLCHAIN_CFLAGS := $(CLANG_TARGET_FLAGS)
+ifeq ($(CXX_STDLIB),libstdc++)
+TOOLCHAIN_CXXFLAGS := -stdlib=libstdc++
+else
+$(error unsupported CXX_STDLIB '$(CXX_STDLIB)' for the current imported runtime)
+endif
+ifeq ($(LD_TYPE),lld)
+LD := $(LLD)
+LINKER_FAMILY := lld
+else
+ifneq ($(CXX_STDLIB),libstdc++)
+$(error GCC configuration currently requires CXX_STDLIB=libstdc++)
+endif
+LD := $(CROSS_COMPILE)ld
+LINKER_FAMILY := bfd
+endif
+else
+CC := $(CROSS_COMPILE)gcc
+CXX := $(CROSS_COMPILE)g++
+LD := $(CROSS_COMPILE)ld
+COMPILER_FAMILY := gcc
+LINKER_FAMILY := bfd
+endif
+
+ifeq ($(LLVM_BINUTILS),1)
+AR := llvm-ar$(CLANG_SUFFIX)
+NM := llvm-nm$(CLANG_SUFFIX)
+OBJCOPY := llvm-objcopy$(CLANG_SUFFIX)
+OBJDUMP := llvm-objdump$(CLANG_SUFFIX)
+READELF := llvm-readelf$(CLANG_SUFFIX)
+else
+AR := $(CROSS_COMPILE)ar
+NM := $(CROSS_COMPILE)nm
+OBJCOPY := $(CROSS_COMPILE)objcopy
+OBJDUMP := $(CROSS_COMPILE)objdump
+READELF := $(CROSS_COMPILE)readelf
+endif
+SIZE := $(CROSS_COMPILE)size