mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-22 16:37:40 +08:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@357811 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -51,26 +51,6 @@ if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY)
|
|||||||
endif()
|
endif()
|
||||||
add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
|
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 (APPLE AND LLVM_USE_SANITIZER)
|
||||||
if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR
|
if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR
|
||||||
("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR
|
("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR
|
||||||
@@ -142,25 +122,6 @@ if (LIBCXX_TARGETING_MSVC)
|
|||||||
add_library_flags(iso_stdio_wide_specifiers)
|
add_library_flags(iso_stdio_wide_specifiers)
|
||||||
endif()
|
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)
|
function(cxx_set_common_defines name)
|
||||||
if(LIBCXX_CXX_ABI_HEADER_TARGET)
|
if(LIBCXX_CXX_ABI_HEADER_TARGET)
|
||||||
add_dependencies(${name} ${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)
|
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")
|
list(APPEND LIBCXX_BUILD_TARGETS "cxx_shared")
|
||||||
if (LIBCXX_INSTALL_SHARED_LIBRARY)
|
if (LIBCXX_INSTALL_SHARED_LIBRARY)
|
||||||
list(APPEND LIBCXX_INSTALL_TARGETS "cxx_shared")
|
list(APPEND LIBCXX_INSTALL_TARGETS "cxx_shared")
|
||||||
@@ -314,35 +339,6 @@ if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY)
|
|||||||
)
|
)
|
||||||
endif()
|
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_LIBRARY)
|
||||||
if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
|
if (LIBCXX_INSTALL_EXPERIMENTAL_LIBRARY)
|
||||||
set(experimental_lib cxx_experimental)
|
set(experimental_lib cxx_experimental)
|
||||||
|
Reference in New Issue
Block a user