From 6e68a79110cbcac6211d5157079c961e889ef3fd Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Fri, 5 Apr 2019 20:29:54 +0000 Subject: [PATCH] [libc++] Localize CMake code only related to the shared library Summary: There's a lot of CMake logic that's only relevant to the shared library, yet it was using a code path and setting variables that impact both the shared and the static libraries. This patch moves this logic so that it clearly only impacts the shared library. Reviewers: phosek, smeenai, EricWF Subscribers: mgorny, christof, jkorous, dexonsmith, libcxx-commits Tags: #libc Differential Revision: https://reviews.llvm.org/D60276 llvm-svn: 357811 --- libcxx/lib/CMakeLists.txt | 132 ++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 68 deletions(-) diff --git a/libcxx/lib/CMakeLists.txt b/libcxx/lib/CMakeLists.txt index d7791c2..c9d33e6 100644 --- a/libcxx/lib/CMakeLists.txt +++ b/libcxx/lib/CMakeLists.txt @@ -51,26 +51,6 @@ if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY) endif() add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}") -if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR - LIBCXX_CXX_ABI_LIBNAME STREQUAL "default") - AND NOT DEFINED LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) - set(LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS ON) -endif() - -if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) - if (APPLE) - add_library_flags("-Wl,-force_load" "${LIBCXX_CXX_STATIC_ABI_LIBRARY}") - else() - add_library_flags("-Wl,--whole-archive" "-Wl,-Bstatic") - add_library_flags("${LIBCXX_CXX_STATIC_ABI_LIBRARY}") - add_library_flags("-Wl,-Bdynamic" "-Wl,--no-whole-archive") - endif() -elseif (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) - add_library_flags("${LIBCXX_CXX_SHARED_ABI_LIBRARY}") -else () - add_interface_library("${LIBCXX_CXX_SHARED_ABI_LIBRARY}") -endif() - if (APPLE AND LLVM_USE_SANITIZER) if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR @@ -142,25 +122,6 @@ if (LIBCXX_TARGETING_MSVC) add_library_flags(iso_stdio_wide_specifiers) endif() -if (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) - if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") - set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.v${LIBCXX_LIBCPPABI_VERSION}.exp") - else() - set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++abi.v${LIBCXX_LIBCPPABI_VERSION}.exp") - endif() - add_link_flags( - "-compatibility_version 1" - "-install_name /usr/lib/libc++.1.dylib" - "-Wl,-unexported_symbols_list,\"${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp\"" - "-Wl,-reexported_symbols_list,\"${RE_EXPORT_LIST}\"" - "-Wl,-force_symbols_not_weak_list,\"${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp\"" - "-Wl,-force_symbols_weak_list,\"${CMAKE_CURRENT_SOURCE_DIR}/weak.exp\"") - - if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) - add_link_flags("-Wl,-reexported_symbols_list,\"${CMAKE_CURRENT_SOURCE_DIR}/libc++abi-new-delete.exp\"") - endif() -endif() - function(cxx_set_common_defines name) if(LIBCXX_CXX_ABI_HEADER_TARGET) add_dependencies(${name} ${LIBCXX_CXX_ABI_HEADER_TARGET}) @@ -210,6 +171,70 @@ if (LIBCXX_ENABLE_SHARED) ) cxx_set_common_defines(cxx_shared) + # Link against libc++abi + if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) + if (APPLE) + target_link_libraries(cxx_shared PRIVATE "-Wl,-force_load" "$") + else() + target_link_libraries(cxx_shared PRIVATE "-Wl,--whole-archive,-Bstatic" "$" "-Wl,-Bdynamic,--no-whole-archive") + endif() + else() + target_link_libraries(cxx_shared PRIVATE "${LIBCXX_CXX_SHARED_ABI_LIBRARY}") + list(APPEND LIBCXX_INTERFACE_LIBRARIES "${LIBCXX_CXX_STATIC_ABI_LIBRARY}") + endif() + + # Maybe re-export symbols from libc++abi + if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR + LIBCXX_CXX_ABI_LIBNAME STREQUAL "default") + AND NOT DEFINED LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) + set(LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS ON) + endif() + + if (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) + if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") + set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++sjlj-abi.v${LIBCXX_LIBCPPABI_VERSION}.exp") + else() + set(RE_EXPORT_LIST "${CMAKE_CURRENT_SOURCE_DIR}/libc++abi.v${LIBCXX_LIBCPPABI_VERSION}.exp") + endif() + target_link_libraries(cxx_shared PRIVATE + "-compatibility_version 1" + "-install_name /usr/lib/libc++.1.dylib" + "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++unexp.exp" + "-Wl,-reexported_symbols_list,${RE_EXPORT_LIST}" + "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/notweak.exp" + "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/weak.exp") + + if (NOT LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) + target_link_libraries(cxx_shared PRIVATE "-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/libc++abi-new-delete.exp") + endif() + endif() + + # Generate a linker script in place of a libc++.so symlink. Rerun this command + # after cxx builds. + if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) + # 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}) + # FIXME: Handle cxxabi_static and unwind_static. + if (TARGET ${lib} OR + (${lib} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI) OR + (${lib} MATCHES "unwind(_static|_shared)?" AND HAVE_LIBUNWIND)) + list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "$") + else() + list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "${lib}") + endif() + endforeach() + add_custom_command(TARGET cxx_shared POST_BUILD + COMMAND + ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script.py + ARGS + "$" + ${LIBCXX_INTERFACE_LIBRARY_NAMES} + WORKING_DIRECTORY ${LIBCXX_BUILD_DIR} + ) + endif() + list(APPEND LIBCXX_BUILD_TARGETS "cxx_shared") if (LIBCXX_INSTALL_SHARED_LIBRARY) list(APPEND LIBCXX_INSTALL_TARGETS "cxx_shared") @@ -314,35 +339,6 @@ if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) ) endif() -# Generate a linker script inplace of a libc++.so symlink. Rerun this command -# after cxx builds. -if (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) - # 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}) - # FIXME: Handle cxxabi_static and unwind_static. - if (TARGET ${lib} OR - (${lib} MATCHES "cxxabi(_static|_shared)?" AND HAVE_LIBCXXABI) OR - (${lib} MATCHES "unwind(_static|_shared)?" AND HAVE_LIBUNWIND)) - list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "$") - else() - list(APPEND LIBCXX_INTERFACE_LIBRARY_NAMES "${lib}") - endif() - endforeach() - #split_list(LIBCXX_INTERFACE_LIBRARY_NAMES) - # Generate a linker script inplace of a libc++.so symlink. Rerun this command - # after cxx builds. - add_custom_command(TARGET cxx_shared POST_BUILD - COMMAND - ${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/gen_link_script.py - ARGS - "$" - ${LIBCXX_INTERFACE_LIBRARY_NAMES} - WORKING_DIRECTORY ${LIBCXX_BUILD_DIR} - ) -endif() - if (LIBCXX_INSTALL_LIBRARY) if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY) set(experimental_lib cxx_experimental) -- 2.7.4