https://github.com/petrhosek created https://github.com/llvm/llvm-project/pull/99287
Provide an option to build libc++ against LLVM libc and set the CMake compile and link options appropriately when the option is enabled. >From 7d7a7882b713e056f9194b2dd7d792fb9bb86bb5 Mon Sep 17 00:00:00 2001 From: Petr Hosek <pho...@google.com> Date: Wed, 17 Jul 2024 00:32:39 -0700 Subject: [PATCH] [libc][libcxx] Support for building libc++ against LLVM libc Provide an option to build libc++ against LLVM libc and set the CMake compile and link options appropriately when the option is enabled. --- clang/cmake/caches/Fuchsia-stage2.cmake | 2 ++ libc/cmake/modules/CheckCompilerFeatures.cmake | 3 +++ libc/include/CMakeLists.txt | 3 +++ libc/lib/CMakeLists.txt | 5 ++++- libcxx/CMakeLists.txt | 1 + libcxx/include/CMakeLists.txt | 3 +++ libcxx/src/CMakeLists.txt | 10 ++++++++++ 7 files changed, 26 insertions(+), 1 deletion(-) diff --git a/clang/cmake/caches/Fuchsia-stage2.cmake b/clang/cmake/caches/Fuchsia-stage2.cmake index b4561e6c87ba5..dc9b596b4ba8f 100644 --- a/clang/cmake/caches/Fuchsia-stage2.cmake +++ b/clang/cmake/caches/Fuchsia-stage2.cmake @@ -338,6 +338,7 @@ foreach(target armv6m-unknown-eabi;armv7m-unknown-eabi;armv8m.main-unknown-eabi) set(RUNTIMES_${target}_LIBCXX_CXX_ABI none CACHE STRING "") set(RUNTIMES_${target}_LIBCXX_ENABLE_SHARED OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_USE_LLVM_LIBC ON CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_FILESYSTEM OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_RANDOM_DEVICE OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_LOCALIZATION OFF CACHE BOOL "") @@ -388,6 +389,7 @@ foreach(target riscv32-unknown-elf) set(RUNTIMES_${target}_LIBCXX_CXX_ABI none CACHE STRING "") set(RUNTIMES_${target}_LIBCXX_ENABLE_SHARED OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_STATIC ON CACHE BOOL "") + set(RUNTIMES_${target}_LIBCXX_USE_LLVM_LIBC ON CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_FILESYSTEM OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_RANDOM_DEVICE OFF CACHE BOOL "") set(RUNTIMES_${target}_LIBCXX_ENABLE_LOCALIZATION OFF CACHE BOOL "") diff --git a/libc/cmake/modules/CheckCompilerFeatures.cmake b/libc/cmake/modules/CheckCompilerFeatures.cmake index a6d793d495c45..d64d9de97af3c 100644 --- a/libc/cmake/modules/CheckCompilerFeatures.cmake +++ b/libc/cmake/modules/CheckCompilerFeatures.cmake @@ -102,3 +102,6 @@ check_cxx_compiler_flag("-nostdlib++" LIBC_CC_SUPPORTS_NOSTDLIBPP) # clang-3.0+ check_cxx_compiler_flag("-nostdlibinc" LIBC_CC_SUPPORTS_NOSTDLIBINC) + +# clang-3.0+ +check_cxx_compiler_flag("-nolibc" LIBC_CC_SUPPORTS_NOLIBC) diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index 2cf7206f3a625..d521e205df8c3 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -664,6 +664,9 @@ get_all_install_header_targets(all_install_header_targets ${TARGET_PUBLIC_HEADER add_library(libc-headers INTERFACE) add_dependencies(libc-headers ${all_install_header_targets}) target_include_directories(libc-headers SYSTEM INTERFACE ${LIBC_INCLUDE_DIR}) +if(LIBC_CC_SUPPORTS_NOSTDLIBINC) + target_compile_options(libc-headers INTERFACE "-nostdlibinc") +endif() foreach(target IN LISTS all_install_header_targets) get_target_property(header_file ${target} HEADER_FILE_PATH) diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt index 37acf3950b460..7e18f35e7d60e 100644 --- a/libc/lib/CMakeLists.txt +++ b/libc/lib/CMakeLists.txt @@ -30,7 +30,10 @@ foreach(archive IN ZIP_LISTS ARCHIVE_OUTPUT_NAME ${archive_0} ) if(LLVM_LIBC_FULL_BUILD) - target_link_libraries(${archive_1} PUBLIC libc-headers) + target_link_libraries(${archive_1} INTERFACE libc-headers) + if(LIBC_CC_SUPPORTS_NOLIBC) + target_link_options(${archive_1} INTERFACE "-nolibc") + endif() if(TARGET libc-startup) add_dependencies(${archive_1} libc-startup) endif() diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index 190a97db9462f..5a568e95b239e 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -293,6 +293,7 @@ option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON) option(LIBCXX_ENABLE_MONOTONIC_CLOCK "Build libc++ with support for a monotonic clock. This option may only be set to OFF when LIBCXX_ENABLE_THREADS=OFF." ON) +option(LIBCXX_USE_LLVM_LIBC "Build libc++ against LLVM libc." OFF) option(LIBCXX_HAS_MUSL_LIBC "Build libc++ with support for the Musl C library" OFF) option(LIBCXX_HAS_PTHREAD_API "Ignore auto-detection and force use of pthread API" OFF) option(LIBCXX_HAS_WIN32_THREAD_API "Ignore auto-detection and force use of win32 thread API" OFF) diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index cd64fe91449c2..31a819932d521 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -1043,6 +1043,9 @@ add_custom_target(generate-cxx-headers ALL DEPENDS ${_all_includes}) add_library(cxx-headers INTERFACE) target_link_libraries(cxx-headers INTERFACE libcxx-abi-headers) +if (LIBCXX_USE_LLVM_LIBC) + target_link_libraries(cxx-headers INTERFACE libc-headers) +endif() add_dependencies(cxx-headers generate-cxx-headers) # It's important that the arch directory be included first so that its header files # which interpose on the default include dir be included instead of the default ones. diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt index 0ae58a10c879c..536a5a16ad7e1 100644 --- a/libcxx/src/CMakeLists.txt +++ b/libcxx/src/CMakeLists.txt @@ -229,6 +229,11 @@ if (LIBCXX_ENABLE_SHARED) target_link_libraries(cxx_shared PUBLIC libcxx-abi-shared) endif() + # Link against LLVM libc. + if (LIBCXX_USE_LLVM_LIBC) + target_link_libraries(cxx_shared PUBLIC libc libm) + endif() + # Maybe re-export symbols from libc++abi # In particular, we don't re-export the symbols if libc++abi is merged statically # into libc++ because in that case there's no dylib to re-export from. @@ -324,6 +329,11 @@ if (LIBCXX_ENABLE_STATIC) if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY) target_link_libraries(cxx_static PRIVATE libcxx-abi-static-objects) endif() + + # Link against LLVM libc. + if (LIBCXX_USE_LLVM_LIBC) + target_link_libraries(cxx_static PUBLIC libc libm) + endif() endif() # Add a meta-target for both libraries. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits