diff options
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) |
