From 48ef95c24e9ac3d11200b61af617a01b10b507d1 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Fri, 10 Jul 2026 23:20:03 +0800 Subject: build: introduce declarative non-recursive build graph --- scripts/build/toolchain.mk | 103 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 scripts/build/toolchain.mk (limited to 'scripts/build/toolchain.mk') 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 -- cgit v1.2.3