diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2026-07-11 22:48:30 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2026-07-11 22:48:30 +0800 |
| commit | 3ad39e9878310e5317ee73c9b353c1e2c1c5c4ee (patch) | |
| tree | 4bd5a49ef60ad1e371c0984cd46838368c5ef83a /scripts/build/toolchain.mk | |
| parent | 48ef95c24e9ac3d11200b61af617a01b10b507d1 (diff) | |
| download | lume-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.mk | 45 |
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) |
