[clang] [llvm] [Fuchsia][CMake] Add a modular Fuchsia toolchain configuration (PR #122023)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 7 16:06:48 PST 2025


https://github.com/zeroomega created https://github.com/llvm/llvm-project/pull/122023

This patch implements a new CMake configuration for building Fuchsia toolchain in a modular way. It splits the config for LLVM/Clang and the Runtimes. Allow them to be reused in different build scenarios. This patch also paves the way for setting up a libcxx pre-submit builder for the Fuchsia toolchain.

>From b69cde18e65018d62cef3be2e05d1a26f339492b Mon Sep 17 00:00:00 2001
From: Haowei Wu <haowei at google.com>
Date: Tue, 7 Jan 2025 15:43:44 -0800
Subject: [PATCH] [Fuchsia][CMake] Add a modular Fuchsia toolchain
 configuration

This patch implements a new CMake configuration for building
Fuchsia toolchain in a modular way. It splits the config for
LLVM/Clang and the Runtimes. Allow them to be reused in different
build scenarios. This patch also paves the way for setting
up a libcxx pre-submit builder for the Fuchsia toolchain.
---
 clang/cmake/caches/Fuchsia-modular.cmake | 147 +++++++++++++++
 runtimes/cmake/fuchsia/Common.cmake      |  22 +++
 runtimes/cmake/fuchsia/Linux.cmake       | 217 +++++++++++++++++++++++
 3 files changed, 386 insertions(+)
 create mode 100644 clang/cmake/caches/Fuchsia-modular.cmake
 create mode 100644 runtimes/cmake/fuchsia/Common.cmake
 create mode 100644 runtimes/cmake/fuchsia/Linux.cmake

diff --git a/clang/cmake/caches/Fuchsia-modular.cmake b/clang/cmake/caches/Fuchsia-modular.cmake
new file mode 100644
index 00000000000000..3cc1792d4a90a4
--- /dev/null
+++ b/clang/cmake/caches/Fuchsia-modular.cmake
@@ -0,0 +1,147 @@
+# This file sets up a CMakeCache for building a single stage of a Fuchsia toolchain.
+# It can be used to just build LLVM+Clang without building any runtimes
+# Or LLVM+Clang+runtimes.
+set(LLVM_TARGETS_TO_BUILD X86;ARM;AArch64;RISCV CACHE STRING "")
+
+set(PACKAGE_VENDOR Fuchsia CACHE STRING "")
+
+set(_FUCHSIA_ENABLE_PROJECTS "bolt;clang;clang-tools-extra;lld;llvm;polly")
+
+set(LLVM_ENABLE_BACKTRACES OFF CACHE BOOL "")
+set(LLVM_ENABLE_DIA_SDK OFF CACHE BOOL "")
+set(LLVM_ENABLE_FATLTO ON CACHE BOOL "")
+set(LLVM_ENABLE_HTTPLIB ON CACHE BOOL "")
+set(LLVM_ENABLE_LIBCXX ON CACHE BOOL "")
+set(LLVM_ENABLE_LIBEDIT OFF CACHE BOOL "")
+set(LLVM_ENABLE_LLD ON CACHE BOOL "")
+set(LLVM_ENABLE_LTO ON CACHE BOOL "")
+set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE BOOL "")
+set(LLVM_ENABLE_PLUGINS OFF CACHE BOOL "")
+set(LLVM_ENABLE_TERMINFO OFF CACHE BOOL "")
+set(LLVM_ENABLE_UNWIND_TABLES OFF CACHE BOOL "")
+set(LLVM_ENABLE_Z3_SOLVER OFF CACHE BOOL "")
+set(LLVM_ENABLE_ZLIB ON CACHE BOOL "")
+set(LLVM_FORCE_BUILD_RUNTIME ON CACHE BOOL "")
+set(LLVM_INCLUDE_DOCS OFF CACHE BOOL "")
+set(LLVM_INCLUDE_EXAMPLES OFF CACHE BOOL "")
+set(LLVM_STATIC_LINK_CXX_STDLIB ON CACHE BOOL "")
+set(LLVM_USE_RELATIVE_PATHS_IN_FILES ON CACHE BOOL "")
+set(LLDB_ENABLE_CURSES OFF CACHE BOOL "")
+set(LLDB_ENABLE_LIBEDIT OFF CACHE BOOL "")
+
+if(WIN32)
+  set(FUCHSIA_DISABLE_DRIVER_BUILD ON)
+endif()
+
+if (NOT FUCHSIA_DISABLE_DRIVER_BUILD)
+  set(LLVM_TOOL_LLVM_DRIVER_BUILD ON CACHE BOOL "")
+  set(LLVM_DRIVER_TARGET llvm-driver)
+endif()
+
+set(CLANG_DEFAULT_CXX_STDLIB libc++ CACHE STRING "")
+set(CLANG_DEFAULT_LINKER lld CACHE STRING "")
+set(CLANG_DEFAULT_OBJCOPY llvm-objcopy CACHE STRING "")
+set(CLANG_DEFAULT_RTLIB compiler-rt CACHE STRING "")
+set(CLANG_DEFAULT_UNWINDLIB libunwind CACHE STRING "")
+set(CLANG_ENABLE_ARCMT OFF CACHE BOOL "")
+set(CLANG_ENABLE_STATIC_ANALYZER ON CACHE BOOL "")
+set(CLANG_PLUGIN_SUPPORT OFF CACHE BOOL "")
+
+set(ENABLE_LINKER_BUILD_ID ON CACHE BOOL "")
+set(ENABLE_X86_RELAX_RELOCATIONS ON CACHE BOOL "")
+
+# TODO(#67176): relative-vtables doesn't play well with different default
+# visibilities. Making everything hidden visibility causes other complications
+# let's choose default visibility for our entire toolchain.
+set(CMAKE_C_VISIBILITY_PRESET default CACHE STRING "")
+set(CMAKE_CXX_VISIBILITY_PRESET default CACHE STRING "")
+
+set(CMAKE_BUILD_TYPE Release CACHE STRING "")
+
+# Setup the runtimes for Fuchsia toolchain.
+set(FUCHSIA_TOOLCHAIN_RUNTIME_PLATFORMS "" CACHE STRING "")
+LIST(LENGTH FUCHSIA_TOOLCHAIN_RUNTIME_PLATFORMS platform_count)
+if (NOT platform_count EQUAL 0)
+    set(FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE "END2END" CACHE STRING "")
+    set(LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi;libunwind" CACHE STRING "")
+    set(FUCHSIA_TOOLCHAIN_RUNTIME_BUILTIN_TARGETS "" CACHE STRING "")
+    set(FUCHSIA_TOOLCHAIN_RUNTIME_RUNTIME_TARGETS "" CACHE STRING "")
+    set(FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_ID_LINK "" CACHE STRING "")
+    set(FUCHSIA_RUNTIME_COMPONENTS "builtins;runtimes" CACHE STRING "")
+endif()
+
+foreach(platform IN LISTS FUCHSIA_TOOLCHAIN_RUNTIME_PLATFORMS)
+    include(${CMAKE_CURRENT_LIST_DIR}/../../../runtimes/cmake/fuchsia/${platform}.cmake)
+endforeach()
+
+
+# Setup toolchain.
+set(LLVM_INSTALL_TOOLCHAIN_ONLY ON CACHE BOOL "")
+set(LLVM_TOOLCHAIN_TOOLS
+  dsymutil
+  llvm-ar
+  llvm-config
+  llvm-cov
+  llvm-cxxfilt
+  llvm-debuginfod
+  llvm-debuginfod-find
+  llvm-dlltool
+  ${LLVM_DRIVER_TARGET}
+  llvm-dwarfdump
+  llvm-dwp
+  llvm-ifs
+  llvm-gsymutil
+  llvm-lib
+  llvm-libtool-darwin
+  llvm-lipo
+  llvm-ml
+  llvm-mt
+  llvm-nm
+  llvm-objcopy
+  llvm-objdump
+  llvm-otool
+  llvm-pdbutil
+  llvm-profdata
+  llvm-rc
+  llvm-ranlib
+  llvm-readelf
+  llvm-readobj
+  llvm-size
+  llvm-strings
+  llvm-strip
+  llvm-symbolizer
+  llvm-undname
+  llvm-xray
+  opt-viewer
+  sancov
+  scan-build-py
+  CACHE STRING "")
+
+set(LLVM_Toolchain_DISTRIBUTION_COMPONENTS
+  bolt
+  clang
+  lld
+  clang-apply-replacements
+  clang-doc
+  clang-format
+  clang-resource-headers
+  clang-include-fixer
+  clang-refactor
+  clang-scan-deps
+  clang-tidy
+  clangd
+  find-all-symbols
+  ${FUCHSIA_RUNTIME_COMPONENTS}
+  ${LLVM_TOOLCHAIN_TOOLS}
+  CACHE STRING "")
+
+if (NOT platform_count EQUAL 0)
+  set(LLVM_BUILTIN_TARGETS "${FUCHSIA_TOOLCHAIN_RUNTIME_BUILTIN_TARGETS}" CACHE STRING "")
+  set(LLVM_RUNTIME_TARGETS "${FUCHSIA_TOOLCHAIN_RUNTIME_RUNTIME_TARGETS}" CACHE STRING "")
+  set(RUNTIME_BUILD_ID_LINK "${FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_ID_LINK}" CACHE STRING "")
+endif()
+
+set(_FUCHSIA_DISTRIBUTIONS Toolchain)
+
+set(LLVM_DISTRIBUTIONS ${_FUCHSIA_DISTRIBUTIONS} CACHE STRING "")
+set(LLVM_ENABLE_PROJECTS ${_FUCHSIA_ENABLE_PROJECTS} CACHE STRING "")
diff --git a/runtimes/cmake/fuchsia/Common.cmake b/runtimes/cmake/fuchsia/Common.cmake
new file mode 100644
index 00000000000000..f994191ef72d27
--- /dev/null
+++ b/runtimes/cmake/fuchsia/Common.cmake
@@ -0,0 +1,22 @@
+include(${CMAKE_CURRENT_LIST_DIR}/../../../cmake/Modules/LLVMVersion.cmake)
+
+# If build end2end. Expect FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE set to END2END
+# if build standalone. Expect FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE set to BUILTIN or RUNTIMES
+set(FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE "" CACHE STRING "")
+
+if(NOT (FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "END2END" OR FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "BUILTIN" OR FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "RUNTIMES"))
+  message(FATAL_ERROR "FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE needs to be set to END2END or BUILTIN or RUNTIMES")
+endif()
+
+function(SET_COMMON_ENTRIES RUNTIME_TARGET CONFIG_PREFIX SYSTEM_NAME SYSROOT_PATH COMPILER_FLAGS LINKER_FLAGS)
+  set(target ${RUNTIME_TARGET})
+  set(${CONFIG_PREFIX}CMAKE_SYSTEM_NAME ${SYSTEM_NAME} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_C_FLAGS ${COMPILER_FLAGS} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_CXX_FLAGS ${COMPILER_FLAGS} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_ASM_FLAGS ${COMPILER_FLAGS} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_SYSROOT ${SYSROOT_PATH} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_SHARED_LINKER_FLAGS ${LINKER_FLAGS} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_MODULE_LINKER_FLAGS ${LINKER_FLAGS} CACHE STRING "")
+  set(${CONFIG_PREFIX}CMAKE_EXE_LINKER_FLAGS ${LINKER_FLAGS} CACHE STRING "")
+endfunction()
\ No newline at end of file
diff --git a/runtimes/cmake/fuchsia/Linux.cmake b/runtimes/cmake/fuchsia/Linux.cmake
new file mode 100644
index 00000000000000..a754be89827b7c
--- /dev/null
+++ b/runtimes/cmake/fuchsia/Linux.cmake
@@ -0,0 +1,217 @@
+include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake)
+
+# This file sets up the builtins and runtimes for the Linux platform for
+# a Fuchsia toolchain build. It can be used in an end to end toolchain build,
+# or be used standalone.
+
+# If build end2end. Expect FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE set to END2END
+# And FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS to contain a list of targets
+# if build standalone. Expect FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE set to BUILTIN or RUNTIMES
+# and FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS to contain a single target triple.
+
+# Due to a limitation in compiler-rt and runtimes cmake configuration, both
+# depends on the cmake files under LLVM's build directory. Therefore, in order to
+# build runtimes in standalone mode, the LLVM+Clang needs to be built first.
+
+# Example of building a x86_64-unknown-linux-gnu builtins:
+
+# cmake \
+#   -GNinja \
+#   -DCMAKE_MAKE_PROGRAM=ninja \
+#   -DCMAKE_INSTALL_PREFIX="" \
+#   -DCMAKE_C_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang \             
+#   -DCMAKE_CXX_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang++ \             
+#   -DCMAKE_ASM_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang \             
+#   -DCLANG_REPOSITORY_STRING="https://llvm.googlesource.com/llvm-project" \
+#   -DCMAKE_AR=LLVM_CLANG_BUILD_DIR/bin/llvm-ar \             
+#   -DCMAKE_LINKER=LLVM_CLANG_BUILD_DIR/bin/ld.lld \             
+#   -DCMAKE_NM=LLVM_CLANG_BUILD_DIR/bin/llvm-nm \             
+#   -DCMAKE_OBJCOPY=LLVM_CLANG_BUILD_DIR/bin/llvm-objcopy \             
+#   -DCMAKE_OBJDUMP=LLVM_CLANG_BUILD_DIR/bin/llvm-objdump \             
+#   -DCMAKE_RANLIB=LLVM_CLANG_BUILD_DIR/bin/llvm-ranlib \             
+#   -DCMAKE_READELF=LLVM_CLANG_BUILD_DIR/bin/llvm-readelf \             
+#   -DCMAKE_STRIP=LLVM_CLANG_BUILD_DIR/bin/llvm-strip \             
+#   -DCMAKE_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_aarch64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_armv7-unknown-linux-gnueabihf_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_i386-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_riscv64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_x86_64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DFUCHSIA_SDK=/mnt/nvme_crypt/SRC/llvm-prebuilts/fuchsia-idk \
+#   -DLLVM_ENABLE_LTO=False \
+#   -DLLVM_ENABLE_ASSERTIONS=True \
+#   -DLLVM_ENABLE_BACKTRACES=True \                                            
+#   -DFUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE=BUILTIN \                         
+#   -DFUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS="x86_64-unknown-linux-gnu" \
+#   -DLLVM_CMAKE_DIR=LLVM_CLANG_BUILD_DIR/lib/cmake/llvm \
+#   -C ../runtimes/cmake/fuchsia/linux.cmake ../compiler-rt/lib/builtins
+
+# Example of building a x86_64-unknown-linux-gnu runtimes:
+
+# cmake \
+#   -GNinja \
+#   -DCMAKE_MAKE_PROGRAM=ninja \
+#   -DCMAKE_INSTALL_PREFIX="" \
+#   -DCMAKE_C_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang \             
+#   -DCMAKE_CXX_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang++ \             
+#   -DCMAKE_ASM_COMPILER=LLVM_CLANG_BUILD_DIR/bin/clang \             
+#   -DCLANG_REPOSITORY_STRING="https://llvm.googlesource.com/llvm-project" \
+#   -DCMAKE_AR=LLVM_CLANG_BUILD_DIR/bin/llvm-ar \             
+#   -DCMAKE_LINKER=LLVM_CLANG_BUILD_DIR/bin/ld.lld \             
+#   -DCMAKE_NM=LLVM_CLANG_BUILD_DIR/bin/llvm-nm \             
+#   -DCMAKE_OBJCOPY=LLVM_CLANG_BUILD_DIR/bin/llvm-objcopy \             
+#   -DCMAKE_OBJDUMP=LLVM_CLANG_BUILD_DIR/bin/llvm-objdump \             
+#   -DCMAKE_RANLIB=LLVM_CLANG_BUILD_DIR/bin/llvm-ranlib \             
+#   -DCMAKE_READELF=LLVM_CLANG_BUILD_DIR/bin/llvm-readelf \             
+#   -DCMAKE_STRIP=LLVM_CLANG_BUILD_DIR/bin/llvm-strip \             
+#   -DCMAKE_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_aarch64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_armv7-unknown-linux-gnueabihf_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_i386-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_riscv64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DLINUX_x86_64-unknown-linux-gnu_SYSROOT=LINUX_SYSROOT_PATH \
+#   -DFUCHSIA_SDK=/mnt/nvme_crypt/SRC/llvm-prebuilts/fuchsia-idk \
+#   -DLLVM_ENABLE_LTO=False \
+#   -DLLVM_ENABLE_ASSERTIONS=True \
+#   -DLLVM_ENABLE_BACKTRACES=True \                                            
+#   -DFUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE=RUNTIMES \                         
+#   -DFUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS="x86_64-unknown-linux-gnu" \
+#   -DLLVM_CMAKE_DIR=LLVM_CLANG_BUILD_DIR/lib/cmake/llvm \
+#   -C ../runtimes/cmake/fuchsia/linux.cmake ../runtimes
+
+set(FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS "" CACHE STRING "")
+
+LIST(LENGTH FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS target_count)
+if (NOT FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "END2END")
+  if (NOT target_count EQUAL 1)
+    message(FATAL_ERROR "FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS should only contain 1 target when not in END2END mode")
+  endif()
+  set(BUILTIN_TARGETS "" CACHE STRING "")
+  set(RUNTIME_TARGETS "" CACHE STRING "")
+else()
+  if (target_count EQUAL 0)
+    set(FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS aarch64-unknown-linux-gnu;armv7-unknown-linux-gnueabihf;i386-unknown-linux-gnu;riscv64-unknown-linux-gnu;x86_64-unknown-linux-gnu)
+  endif()
+endif()
+
+function(SET_LINUX_COMMON_ENTRIES RUNTIME_TARGET CONFIG_PREFIX)
+  SET_COMMON_ENTRIES("${RUNTIME_TARGET}" "${CONFIG_PREFIX}" "Linux" "${LINUX_${target}_SYSROOT}" "--target=${target}" "-fuse-ld=lld")
+endfunction()
+
+function(SET_EXTRA_BUILTIN_ENTRIES RUNTIME_TARGET CONFIG_PREFIX)
+  set(${CONFIG_PREFIX}COMPILER_RT_BUILD_STANDALONE_LIBATOMIC ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}COMPILER_RT_LIBATOMIC_USE_PTHREAD ON CACHE BOOL "")
+endfunction()
+
+function(SET_COMMON_STANDALONE_ARGS RUNTIME_TARGET)
+  set(target ${RUNTIME_TARGET})
+  if (NOT CMAKE_C_COMPILER)
+    message(FATAL_ERROR "CMAKE_C_COMPILER not defined")
+  endif()
+  message(NOTICE "CMAKE_C_COMPILER is ${CMAKE_C_COMPILER}")
+  cmake_path(GET CMAKE_C_COMPILER PARENT_PATH toolchain_bin)
+  cmake_path(GET toolchain_bin PARENT_PATH toolchain_dir)
+  set(CMAKE_C_COMPILER_WORKS ON CACHE STRING "")
+  set(CMAKE_CXX_COMPILER_WORKS ON CACHE STRING "")
+  set(CMAKE_ASM_COMPILER_WORKS ON CACHE STRING "")
+  set(CMAKE_EXPORT_COMPILE_COMMANDS 1 CACHE STRING "")
+  # TODO, set LLVM_HOST_TRIPLE LLVM_CONFIG_PATH
+  set(PACKAGE_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}" CACHE STRING "")
+  set(LLVM_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../llvm" CACHE STRING "")
+  set(LLVM_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../llvm" CACHE STRING "")
+  set(LLVM_BINARY_DIR ${toolchain_dir} CACHE STRING "")
+  set(LLVM_HAVE_LINK_VERSION_SCRIPT 1 CACHE STRING "")
+  set(LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO OFF CACHE STRING "")
+  set(LLVM_USE_RELATIVE_PATHS_IN_FILES ON CACHE STRING "")
+  set(LLVM_ENABLE_WERROR OFF CACHE STRING "")
+  set(LLVM_SOURCE_PREFIX "" CACHE STRING "")
+  set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ON CACHE STRING "")
+  set(COMPILER_RT_DEFAULT_TARGET_ONLY ON CACHE STRING "")
+  set(HAVE_LLVM_LIT ON CACHE STRING "")
+  set(CLANG_RESOURCE_DIR "" CACHE STRING "")
+  set(CMAKE_C_COMPILER_TARGET ${target} CACHE STRING "")
+  set(CMAKE_CXX_COMPILER_TARGET ${target} CACHE STRING "")
+  set(CMAKE_ASM_COMPILER_TARGET ${target} CACHE STRING "")
+  set(LLVM_DEFAULT_TARGET_TRIPLE ${target} CACHE STRING "")
+endfunction()
+
+function(SET_BUILTINS_STANDALONE_ARGS RUNTIME_TARGET)
+  cmake_path(GET CMAKE_C_COMPILER PARENT_PATH toolchain_bin)
+  cmake_path(GET toolchain_bin PARENT_PATH toolchain_dir)
+  set(LLVM_LIBRARY_OUTPUT_INTDIR "${toolchain_dir}/lib" CACHE STRING "")
+  set(COMPILER_RT_INSTALL_BINARY_DIR "lib/clang/${LLVM_VERSION_MAJOR}/bin" CACHE STRING "")
+  set(COMPILER_RT_INSTALL_DATA_DIR "lib/clang/${LLVM_VERSION_MAJOR}/share" CACHE STRING "")
+  set(COMPILER_RT_INSTALL_INCLUDE_DIR "lib/clang/${LLVM_VERSION_MAJOR}/include" CACHE STRING "")
+  set(COMPILER_RT_INSTALL_LIBRARY_DIR "lib/clang/${LLVM_VERSION_MAJOR}/lib" CACHE STRING "")
+  set(COMPILER_RT_OUTPUT_DIR "${toolchain_dir}/lib/clang/${LLVM_VERSION_MAJOR}" CACHE STRING "")
+endfunction()
+
+function(SET_RUNTIMES_STANDALONE_ARGS RUNTIME_TARGET)
+  set(target ${RUNTIME_TARGET})
+  if (NOT CMAKE_C_COMPILER)
+      message(FATAL_ERROR "CMAKE_C_COMPILER not defined")
+  endif()
+  cmake_path(GET CMAKE_C_COMPILER PARENT_PATH toolchain_bin)
+  set(LLVM_ENABLE_PROJECTS_USED ON CACHE STRING "")
+  set(LLVM_RUNTIMES_TARGET ${target} CACHE STRING "")
+  set(COMPILER_RT_BUILD_BUILTINS OFF CACHE STRING "")
+  set(LLVM_LIBC_FULL_BUILD ON CACHE STRING "")
+  set(LLVM_USE_LINKER lld CACHE STRING "")
+  set(LLVM_TOOLS_DIR ${toolchain_bin} CACHE STRING "")
+  set(LLVM_INCLUDE_TESTS ON CACHE STRING "")
+  set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE STRING "")
+endfunction()
+
+function(SET_EXTRA_RUNTIMES_ENTRIES RUNTIME_TARGET CONFIG_PREFIX)
+  set(target ${RUNTIME_TARGET})
+  set(${CONFIG_PREFIX}COMPILER_RT_CXX_LIBRARY "libcxx" CACHE STRING "")
+  set(${CONFIG_PREFIX}COMPILER_RT_USE_BUILTINS_LIBRARY ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}COMPILER_RT_USE_ATOMIC_LIBRARY ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}COMPILER_RT_USE_LLVM_UNWINDER ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}COMPILER_RT_CAN_EXECUTE_TESTS ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}COMPILER_RT_BUILD_STANDALONE_LIBATOMIC ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBUNWIND_ENABLE_SHARED OFF CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBUNWIND_USE_COMPILER_RT ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXXABI_USE_COMPILER_RT ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXXABI_ENABLE_SHARED OFF CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXXABI_USE_LLVM_UNWINDER ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXXABI_INSTALL_LIBRARY OFF CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXX_USE_COMPILER_RT ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXX_ENABLE_SHARED OFF CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXX_ENABLE_STATIC_ABI_LIBRARY ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LIBCXX_ABI_VERSION 2 CACHE STRING "")
+  set(${CONFIG_PREFIX}LLVM_ENABLE_ASSERTIONS OFF CACHE BOOL "")
+  set(${CONFIG_PREFIX}SANITIZER_CXX_ABI "libc++" CACHE STRING "")
+  set(${CONFIG_PREFIX}SANITIZER_CXX_ABI_INTREE ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}SANITIZER_TEST_CXX "libc++" CACHE STRING "")
+  set(${CONFIG_PREFIX}SANITIZER_TEST_CXX_INTREE ON CACHE BOOL "")
+  set(${CONFIG_PREFIX}LLVM_TOOLS_DIR "${CMAKE_BINARY_DIR}/bin" CACHE BOOL "")
+  set(${CONFIG_PREFIX}LLVM_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi;libunwind" CACHE STRING "")
+endfunction()
+
+
+foreach(target IN LISTS FUCHSIA_TOOLCHAIN_LINUX_RUNTIMES_TARGETS)
+  if (FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "END2END")
+    SET_LINUX_COMMON_ENTRIES(${target} BUILTINS_${target}_)
+    SET_EXTRA_BUILTIN_ENTRIES(${target} BUILTINS_${target}_)
+    SET_LINUX_COMMON_ENTRIES(${target} RUNTIMES_${target}_)
+    SET_EXTRA_RUNTIMES_ENTRIES(${target} RUNTIMES_${target}_)
+    list(APPEND FUCHSIA_TOOLCHAIN_RUNTIME_BUILTIN_TARGETS "${target}")
+    list(APPEND FUCHSIA_TOOLCHAIN_RUNTIME_RUNTIME_TARGETS "${target}")
+    list(APPEND FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_ID_LINK "${target}")
+  endif()
+    
+  if (FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "BUILTIN")
+    SET_LINUX_COMMON_ENTRIES(${target} "")
+    SET_EXTRA_BUILTIN_ENTRIES(${target} "")
+    SET_COMMON_STANDALONE_ARGS(${target})
+    SET_BUILTINS_STANDALONE_ARGS(${target})
+  endif()
+
+  if (FUCHSIA_TOOLCHAIN_RUNTIME_BUILD_MODE STREQUAL "RUNTIMES")
+    SET_LINUX_COMMON_ENTRIES(${target} "")
+    SET_EXTRA_RUNTIMES_ENTRIES(${target} "")
+    SET_COMMON_STANDALONE_ARGS(${target})
+    SET_RUNTIMES_STANDALONE_ARGS(${target})
+  endif()
+endforeach()



More information about the llvm-commits mailing list