forked from OSchip/llvm-project
[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
This commit is contained in:
parent
5c6fc36de8
commit
6e68a79110
|
@ -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" "$<TARGET_LINKER_FILE:${LIBCXX_CXX_STATIC_ABI_LIBRARY}>")
|
||||
else()
|
||||
target_link_libraries(cxx_shared PRIVATE "-Wl,--whole-archive,-Bstatic" "$<TARGET_LINKER_FILE:${LIBCXX_CXX_STATIC_ABI_LIBRARY}>" "-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 "$<TARGET_PROPERTY:${lib},OUTPUT_NAME>")
|
||||
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
|
||||
"$<TARGET_LINKER_FILE:cxx_shared>"
|
||||
${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 "$<TARGET_PROPERTY:${lib},OUTPUT_NAME>")
|
||||
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
|
||||
"$<TARGET_LINKER_FILE:cxx_shared>"
|
||||
${LIBCXX_INTERFACE_LIBRARY_NAMES}
|
||||
WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
|
||||
)
|
||||
endif()
|
||||
|
||||
if (LIBCXX_INSTALL_LIBRARY)
|
||||
if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
|
||||
set(experimental_lib cxx_experimental)
|
||||
|
|
Loading…
Reference in New Issue