summaryrefslogtreecommitdiff
path: root/scripts/build/toolchain.mk
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-07-11 22:48:30 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-07-11 22:48:30 +0800
commit3ad39e9878310e5317ee73c9b353c1e2c1c5c4ee (patch)
tree4bd5a49ef60ad1e371c0984cd46838368c5ef83a /scripts/build/toolchain.mk
parent48ef95c24e9ac3d11200b61af617a01b10b507d1 (diff)
downloadlume-3ad39e9878310e5317ee73c9b353c1e2c1c5c4ee.tar.gz
lume-3ad39e9878310e5317ee73c9b353c1e2c1c5c4ee.tar.xz
lib: establish Zircon libc++ and KTL foundation
Diffstat (limited to 'scripts/build/toolchain.mk')
-rw-r--r--scripts/build/toolchain.mk45
1 files changed, 36 insertions, 9 deletions
diff --git a/scripts/build/toolchain.mk b/scripts/build/toolchain.mk
index 49d4f0a..d244981 100644
--- a/scripts/build/toolchain.mk
+++ b/scripts/build/toolchain.mk
@@ -10,10 +10,30 @@ LLVM ?= 0
LLVM_VERSION ?= 20
LD_TYPE ?= bfd
LLVM_BINUTILS ?= 0
-CXX_STDLIB ?= libstdc++
+CXX_STDLIB ?= libc++
CXX_ABI ?= lume
COMPILER_RUNTIME ?= compiler-default
+# One pinned libc++ header snapshot is shared by GCC and Clang. Platform C
+# declarations and libc++ configuration come from the Zircon libc/KTL layer,
+# not from a Linux or Fuchsia userland __config_site.
+LIBCXX_ROOT ?= third_party/libcxx
+LIBCXX_INCLUDE := $(LIBCXX_ROOT)/include/c++/v1
+KTL_INCLUDE := lib/ktl/include
+KTL_AFTER_INCLUDE := lib/ktl/include-after
+KERNEL_LIBC_INCLUDE := lib/libc/include
+KERNEL_LIBC_AFTER_INCLUDE := lib/libc/include-after
+
+ifeq ($(wildcard $(LIBCXX_INCLUDE)/__config),)
+$(error missing pinned libc++ headers under '$(LIBCXX_INCLUDE)')
+endif
+ifeq ($(wildcard $(KTL_INCLUDE)/__config_site),)
+$(error missing KTL libc++ configuration under '$(KTL_INCLUDE)')
+endif
+ifneq ($(CXX_STDLIB),libc++)
+$(error unsupported CXX_STDLIB '$(CXX_STDLIB)' (LumeOS uses its pinned libc++ headers))
+endif
+
GCC_TOOLCHAIN ?=
CROSS_COMPILE ?=
@@ -64,29 +84,36 @@ 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
+TOOLCHAIN_CXXFLAGS :=
+COMPILER_RESOURCE_DIR := $(strip $(shell $(CXX) $(CLANG_TARGET_FLAGS) -print-resource-dir 2>/dev/null))
+COMPILER_RESOURCE_INCLUDE := $(COMPILER_RESOURCE_DIR)/include
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
+COMPILER_RESOURCE_INCLUDE := $(strip $(shell $(CXX) -print-file-name=include 2>/dev/null))
endif
+ifeq ($(wildcard $(COMPILER_RESOURCE_INCLUDE)/stddef.h),)
+$(error missing compiler resource headers under '$(COMPILER_RESOURCE_INCLUDE)')
+endif
+
+# Kernel and phys code must not observe the Linux target sysroot. Supply only
+# compiler intrinsic headers explicitly; the target graph provides the kernel
+# libc and KTL layers, followed by the pinned libc++ headers for C++.
+TOOLCHAIN_CFLAGS += -nostdinc -isystem $(COMPILER_RESOURCE_INCLUDE)
+TOOLCHAIN_CXXFLAGS += -isystem $(LIBCXX_INCLUDE)
+
ifeq ($(LLVM_BINUTILS),1)
AR := llvm-ar$(CLANG_SUFFIX)
NM := llvm-nm$(CLANG_SUFFIX)