diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -445,13 +445,10 @@ # LIBCXX_CXX_FLAGS: General flags for both the compiler and linker. # LIBCXX_COMPILE_FLAGS: Compile only flags. # LIBCXX_LINK_FLAGS: Linker only flags. -# LIBCXX_LIBRARIES: libraries libc++ is linked to. -# LIBCXX_INTERFACE_LIBRARIES: Libraries that must be linked when using libc++ -# These libraries are exposed in the linker script. +# LIBCXX_LIBRARIES: Libraries libc++ is linked to. set(LIBCXX_COMPILE_FLAGS "") set(LIBCXX_LINK_FLAGS "") set(LIBCXX_LIBRARIES "") -set(LIBCXX_INTERFACE_LIBRARIES "") # Include macros for adding and removing libc++ flags. include(HandleLibcxxFlags) diff --git a/libcxx/cmake/Modules/HandleLibcxxFlags.cmake b/libcxx/cmake/Modules/HandleLibcxxFlags.cmake --- a/libcxx/cmake/Modules/HandleLibcxxFlags.cmake +++ b/libcxx/cmake/Modules/HandleLibcxxFlags.cmake @@ -216,14 +216,6 @@ endif() endmacro() -# Add a list of libraries or link flags to 'LIBCXX_LIBRARIES'. -macro(add_interface_library) - foreach(lib ${ARGN}) - list(APPEND LIBCXX_LIBRARIES ${lib}) - list(APPEND LIBCXX_INTERFACE_LIBRARIES ${lib}) - endforeach() -endmacro() - # Turn a comma separated CMake list into a space separated string. macro(split_list listname) string(REPLACE ";" " " ${listname} "${${listname}}") diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt --- a/libcxx/lib/CMakeLists.txt +++ b/libcxx/lib/CMakeLists.txt @@ -45,13 +45,13 @@ endif() if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) - add_library_flags("-Wl,--whole-archive" "-Wl,-Bstatic") - add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}") - add_library_flags("-Wl,-Bdynamic" "-Wl,--no-whole-archive") + list(APPEND LIBCXX_SHARED_LIBRARIES "-Wl,--whole-archive" "-Wl,-Bstatic") + list(APPEND LIBCXX_SHARED_LIBRARIES "${LIBCXX_CXX_ABI_LIBRARY}") + list(APPEND LIBCXX_SHARED_LIBRARIES "-Wl,-Bdynamic" "-Wl,--no-whole-archive") elseif (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) - add_library_flags("${LIBCXX_CXX_ABI_LIBRARY}") + list(APPEND LIBCXX_SHARED_LIBRARIES "${LIBCXX_CXX_ABI_LIBRARY}") else () - add_interface_library("${LIBCXX_CXX_ABI_LIBRARY}") + list(APPEND LIBCXX_SHARED_LIBRARIES "${LIBCXX_CXX_ABI_LIBRARY}") endif() if (APPLE AND LLVM_USE_SANITIZER) @@ -74,7 +74,7 @@ set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE) message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}") - add_library_flags("${LIBCXX_SANITIZER_LIBRARY}") + list(APPEND LIBCXX_SHARED_LIBRARIES "${LIBCXX_SANITIZER_LIBRARY}") add_link_flags("-Wl,-rpath,${LIBDIR}") endif() endif() @@ -95,12 +95,19 @@ # Add the unwinder library. if (LIBCXXABI_USE_LLVM_UNWINDER) - if (NOT LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) - add_interface_library(unwind_shared) - elseif (LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) - add_interface_library(unwind_static) + if (NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) + list(APPEND LIBCXX_SHARED_LIBRARIES unwind_shared) + elseif (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY AND (TARGET unwind_static OR HAVE_LIBUNWIND)) + # libunwind is already included in libc++abi else() - add_interface_library(unwind) + list(APPEND LIBCXX_SHARED_LIBRARIES unwind) + endif() + if (NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) + list(APPEND LIBCXX_STATIC_LIBRARIES unwind_shared) + elseif (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY AND (TARGET unwind_static OR HAVE_LIBUNWIND)) + # libunwind is already included in libc++abi + else() + list(APPEND LIBCXXABI_STATIC_LIBRARIES unwind) endif() endif() @@ -120,13 +127,13 @@ add_compile_flags(/Zl) add_link_flags(/nodefaultlib) - add_library_flags(ucrt${LIB_SUFFIX}) # Universal C runtime - add_library_flags(vcruntime${LIB_SUFFIX}) # C++ runtime - add_library_flags(msvcrt${LIB_SUFFIX}) # C runtime startup files - add_library_flags(msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals. + list(APPEND LIBCXX_SHARED_LIBRARIES ucrt${LIB_SUFFIX}) # Universal C runtime + list(APPEND LIBCXX_SHARED_LIBRARIES vcruntime${LIB_SUFFIX}) # C++ runtime + list(APPEND LIBCXX_SHARED_LIBRARIES msvcrt${LIB_SUFFIX}) # C runtime startup files + list(APPEND LIBCXX_SHARED_LIBRARIES msvcprt${LIB_SUFFIX}) # C++ standard library. Required for exception_ptr internals. # Required for standards-complaint wide character formatting functions # (e.g. `printfw`/`scanfw`) - add_library_flags(iso_stdio_wide_specifiers) + list(APPEND LIBCXX_SHARED_LIBRARIES iso_stdio_wide_specifiers) endif() if (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) @@ -241,7 +248,7 @@ if(COMMAND llvm_setup_rpath) llvm_setup_rpath(cxx_shared) endif() - target_link_libraries(cxx_shared PRIVATE ${LIBCXX_LIBRARIES}) + target_link_libraries(cxx_shared PRIVATE ${LIBCXX_LIBRARIES} ${LIBCXX_SHARED_LIBRARIES}) set_target_properties(cxx_shared PROPERTIES LINK_FLAGS "${LIBCXX_LINK_FLAGS}" @@ -265,7 +272,7 @@ # Build the static library. if (LIBCXX_ENABLE_STATIC) add_library(cxx_static STATIC ${cxx_static_sources}) - target_link_libraries(cxx_static PRIVATE ${LIBCXX_LIBRARIES}) + target_link_libraries(cxx_static PRIVATE ${LIBCXX_LIBRARIES} ${LIBCXX_STATIC_LIBRARIES}) set(CMAKE_STATIC_LIBRARY_PREFIX "lib") set_target_properties(cxx_static PROPERTIES @@ -383,7 +390,7 @@ # Get the name of the ABI library and handle the case where CXXABI_LIBNAME # is a target name and not a library. Ex cxxabi_shared. set(LIBCXX_INTERFACE_LIBRARY_NAMES) - foreach(lib ${LIBCXX_INTERFACE_LIBRARIES}) + foreach(lib IN LISTS LIBCXX_SHARED_LIBRARIES) # FIXME: Handle cxxabi_static and unwind_static. if (TARGET ${lib} OR (${lib} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI) OR