1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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
|