1# Get sources 2set(LIBCXXABI_SOURCES 3 # C++ABI files 4 cxa_aux_runtime.cpp 5 cxa_default_handlers.cpp 6 cxa_demangle.cpp 7 cxa_exception_storage.cpp 8 cxa_guard.cpp 9 cxa_handlers.cpp 10 cxa_vector.cpp 11 cxa_virtual.cpp 12 # C++ STL files 13 stdlib_exception.cpp 14 stdlib_stdexcept.cpp 15 stdlib_typeinfo.cpp 16 # Internal files 17 abort_message.cpp 18 fallback_malloc.cpp 19 private_typeinfo.cpp 20) 21 22if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 23 list(APPEND LIBCXXABI_SOURCES 24 stdlib_new_delete.cpp 25 ) 26endif() 27 28if (LIBCXXABI_ENABLE_EXCEPTIONS) 29 list(APPEND LIBCXXABI_SOURCES 30 cxa_exception.cpp 31 cxa_personality.cpp 32 ) 33else() 34 list(APPEND LIBCXXABI_SOURCES 35 cxa_noexception.cpp 36 ) 37endif() 38 39if (LIBCXXABI_ENABLE_THREADS AND (UNIX OR FUCHSIA) AND NOT (APPLE OR CYGWIN) 40 AND NOT (${CMAKE_SYSTEM_NAME} MATCHES "AIX")) 41 list(APPEND LIBCXXABI_SOURCES 42 cxa_thread_atexit.cpp 43 ) 44endif() 45 46set(LIBCXXABI_HEADERS 47 ../include/cxxabi.h 48) 49 50# Add all the headers to the project for IDEs. 51if (MSVC_IDE OR XCODE) 52 # Force them all into the headers dir on MSVC, otherwise they end up at 53 # project scope because they don't have extensions. 54 if (MSVC_IDE) 55 source_group("Header Files" FILES ${LIBCXXABI_HEADERS}) 56 endif() 57endif() 58 59# Some files depend on libc++ internals. 60include_directories("${LIBCXXABI_LIBCXX_PATH}/src") 61 62if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL) 63 add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL) 64endif() 65 66if (LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST) 67 add_definitions(-D_LIBCXXABI_FORGIVING_DYNAMIC_CAST) 68endif() 69 70if (APPLE) 71 add_library_flags_if(LIBCXXABI_HAS_SYSTEM_LIB System) 72else() 73 if (LIBCXXABI_ENABLE_THREADS) 74 add_library_flags_if(LIBCXXABI_HAS_PTHREAD_LIB pthread) 75 endif() 76 77 add_library_flags_if(LIBCXXABI_HAS_C_LIB c) 78endif() 79 80if (NOT LIBCXXABI_USE_COMPILER_RT) 81 add_library_flags_if(LIBCXXABI_HAS_GCC_LIB gcc) 82endif() 83if (NOT LIBCXXABI_USE_LLVM_UNWINDER) 84 add_library_flags_if(LIBCXXABI_HAS_GCC_S_LIB gcc_s) 85endif() 86 87if (MINGW) 88 # MINGW_LIBRARIES is defined in config-ix.cmake 89 list(APPEND LIBCXXABI_LIBRARIES ${MINGW_LIBRARIES}) 90endif() 91if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21) 92 list(APPEND LIBCXXABI_LIBRARIES android_support) 93endif() 94 95# Setup flags. 96if (CXX_SUPPORTS_NOSTDLIBXX_FLAG) 97 add_link_flags_if_supported(-nostdlib++) 98else() 99 add_link_flags_if_supported(-nodefaultlibs) 100endif() 101 102if (CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG AND LIBCXXABI_USE_LLVM_UNWINDER) 103 # If we're linking directly against the libunwind that we're building 104 # in the same invocation, don't try to link in the toolchain's 105 # default libunwind (which may be missing still). 106 add_link_flags_if_supported(--unwindlib=none) 107endif() 108 109if ( APPLE ) 110 if (LLVM_USE_SANITIZER) 111 if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR 112 ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR 113 ("${LLVM_USE_SANITIZER}" STREQUAL "Undefined;Address")) 114 set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib") 115 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined") 116 set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib") 117 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Thread") 118 set(LIBFILE "libclang_rt.tsan_osx_dynamic.dylib") 119 else() 120 message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X") 121 endif() 122 if (LIBFILE) 123 find_compiler_rt_library(builtins LIBCXXABI_BUILTINS_LIBRARY) 124 get_filename_component(LIBDIR "${LIBCXXABI_BUILTINS_LIBRARY}" DIRECTORY) 125 if (NOT IS_DIRECTORY "${LIBDIR}") 126 message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER") 127 endif() 128 set(LIBCXXABI_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") 129 set(LIBCXXABI_SANITIZER_LIBRARY "${LIBCXXABI_SANITIZER_LIBRARY}" PARENT_SCOPE) 130 message(STATUS "Manually linking compiler-rt library: ${LIBCXXABI_SANITIZER_LIBRARY}") 131 add_library_flags("${LIBCXXABI_SANITIZER_LIBRARY}") 132 add_link_flags("-Wl,-rpath,${LIBDIR}") 133 endif() 134 endif() 135 136 # Make sure we link in CrashReporterClient if we find it -- it's used by 137 # abort() on Apple platforms when building the system dylib. 138 find_library(CrashReporterClient NAMES libCrashReporterClient.a 139 PATHS "${CMAKE_OSX_SYSROOT}/usr/local/lib") 140 if (CrashReporterClient) 141 message(STATUS "Linking with CrashReporterClient at ${CrashReporterClient}") 142 add_library_flags("${CrashReporterClient}") 143 else() 144 message(STATUS "Could not find CrashReporterClient, not linking against it") 145 endif() 146endif() 147 148split_list(LIBCXXABI_COMPILE_FLAGS) 149split_list(LIBCXXABI_LINK_FLAGS) 150 151# FIXME: libc++abi.so will not link when modules are enabled because it depends 152# on symbols defined in libc++.so which has not yet been built. 153if (LLVM_ENABLE_MODULES) 154 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") 155endif() 156 157if (NOT TARGET pstl::ParallelSTL) 158 message(STATUS "Could not find ParallelSTL, libc++abi will not attempt to use it but the build may fail if the libc++ in use needs it to be available.") 159endif() 160 161# Build the shared library. 162add_library(cxxabi_shared_objects OBJECT EXCLUDE_FROM_ALL ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) 163if (LIBCXXABI_USE_LLVM_UNWINDER) 164 if (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY) 165 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared_objects) # propagate usage requirements 166 target_sources(cxxabi_shared_objects PUBLIC $<TARGET_OBJECTS:unwind_shared_objects>) 167 else() 168 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared) 169 endif() 170endif() 171target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers ${LIBCXXABI_BUILTINS_LIBRARY} ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 172target_link_libraries(cxxabi_shared_objects PUBLIC cxxabi-headers) 173set_target_properties(cxxabi_shared_objects 174 PROPERTIES 175 CXX_EXTENSIONS OFF 176 CXX_STANDARD 20 177 CXX_STANDARD_REQUIRED OFF 178 COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}" 179 DEFINE_SYMBOL "" 180) 181if (CMAKE_POSITION_INDEPENDENT_CODE OR NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE) 182 set_target_properties(cxxabi_shared_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) # must set manually because it's an object library 183endif() 184 185if (LIBCXXABI_ENABLE_SHARED) 186 add_library(cxxabi_shared SHARED) 187 set_target_properties(cxxabi_shared 188 PROPERTIES 189 LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" 190 OUTPUT_NAME "${LIBCXXABI_SHARED_OUTPUT_NAME}" 191 SOVERSION "1" 192 VERSION "${LIBCXXABI_LIBRARY_VERSION}" 193 ) 194 195 if (ZOS) 196 add_custom_command(TARGET cxxabi_shared POST_BUILD 197 COMMAND 198 ${LIBCXXABI_LIBCXX_PATH}/utils/zos_rename_dll_side_deck.sh 199 $<TARGET_LINKER_FILE_NAME:cxxabi_shared> $<TARGET_FILE_NAME:cxxabi_shared> "${LIBCXXABI_DLL_NAME}" 200 COMMENT "Rename dll name inside the side deck file" 201 WORKING_DIRECTORY $<TARGET_FILE_DIR:cxxabi_shared> 202 ) 203 endif () 204 205 target_link_libraries(cxxabi_shared 206 PUBLIC cxxabi_shared_objects 207 PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 208 if (TARGET pstl::ParallelSTL) 209 target_link_libraries(cxxabi_shared PUBLIC pstl::ParallelSTL) 210 endif() 211 212 list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared") 213 if (LIBCXXABI_INSTALL_SHARED_LIBRARY) 214 list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_shared") 215 endif() 216 217 add_library(cxxabi-reexports INTERFACE) 218 219 # -exported_symbols_list is only available on Apple platforms 220 if (APPLE) 221 function(export_symbols file) 222 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}") 223 endfunction() 224 function(reexport_symbols file) 225 export_symbols("${file}") 226 target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}") 227 endfunction() 228 229 export_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp") 230 231 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 232 reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/new-delete.exp") 233 endif() 234 235 if (LIBCXXABI_ENABLE_EXCEPTIONS) 236 reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/exceptions.exp") 237 238 if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") 239 reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-sjlj.exp") 240 else() 241 reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-v0.exp") 242 endif() 243 endif() 244 endif() 245endif() 246 247# Build the static library. 248add_library(cxxabi_static_objects OBJECT EXCLUDE_FROM_ALL ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) 249if (LIBCXXABI_USE_LLVM_UNWINDER AND LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY) 250 target_link_libraries(cxxabi_static_objects PUBLIC unwind_static_objects) # propagate usage requirements 251 target_sources(cxxabi_static_objects PUBLIC $<TARGET_OBJECTS:unwind_static_objects>) 252endif() 253target_link_libraries(cxxabi_static_objects PRIVATE cxx-headers ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 254target_link_libraries(cxxabi_static_objects PUBLIC cxxabi-headers) 255set_target_properties(cxxabi_static_objects 256 PROPERTIES 257 CXX_EXTENSIONS OFF 258 CXX_STANDARD 20 259 CXX_STANDARD_REQUIRED OFF 260 COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}" 261) 262 263if(LIBCXXABI_HERMETIC_STATIC_LIBRARY) 264 target_add_compile_flags_if_supported(cxxabi_static_objects PRIVATE -fvisibility=hidden) 265 # If the hermetic library doesn't define the operator new/delete functions 266 # then its code shouldn't declare them with hidden visibility. They might 267 # actually be provided by a shared library at link time. 268 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 269 target_add_compile_flags_if_supported(cxxabi_static_objects PRIVATE -fvisibility-global-new-delete-hidden) 270 endif() 271 # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in libcxx's 272 # __config_site too. Define it in the same way here, to avoid redefinition 273 # conflicts. 274 target_compile_definitions(cxxabi_static_objects 275 PRIVATE 276 _LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS 277 _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) 278endif() 279 280if (LIBCXXABI_ENABLE_STATIC) 281 add_library(cxxabi_static STATIC) 282 if (LIBCXXABI_USE_LLVM_UNWINDER AND NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY) 283 target_link_libraries(cxxabi_static PUBLIC unwind_static) 284 endif() 285 set_target_properties(cxxabi_static 286 PROPERTIES 287 LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}" 288 OUTPUT_NAME "${LIBCXXABI_STATIC_OUTPUT_NAME}" 289 ) 290 target_link_libraries(cxxabi_static 291 PUBLIC cxxabi_static_objects 292 PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 293 if (TARGET pstl::ParallelSTL) 294 target_link_libraries(cxxabi_static PUBLIC pstl::ParallelSTL) 295 endif() 296 297 list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_static") 298 if (LIBCXXABI_INSTALL_STATIC_LIBRARY) 299 list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static") 300 endif() 301endif() 302 303# Add a meta-target for both libraries. 304add_custom_target(cxxabi DEPENDS ${LIBCXXABI_BUILD_TARGETS}) 305 306if (LIBCXXABI_INSTALL_LIBRARY) 307 install(TARGETS ${LIBCXXABI_INSTALL_TARGETS} 308 LIBRARY DESTINATION ${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi 309 ARCHIVE DESTINATION ${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi 310 RUNTIME DESTINATION ${LIBCXXABI_INSTALL_RUNTIME_DIR} COMPONENT cxxabi 311 ) 312endif() 313 314if (NOT CMAKE_CONFIGURATION_TYPES AND LIBCXXABI_INSTALL_LIBRARY) 315 add_custom_target(install-cxxabi 316 DEPENDS cxxabi install-cxxabi-headers 317 COMMAND "${CMAKE_COMMAND}" 318 -DCMAKE_INSTALL_COMPONENT=cxxabi 319 -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake") 320 add_custom_target(install-cxxabi-stripped 321 DEPENDS cxxabi 322 COMMAND "${CMAKE_COMMAND}" 323 -DCMAKE_INSTALL_COMPONENT=cxxabi 324 -DCMAKE_INSTALL_DO_STRIP=1 325 -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake") 326endif() 327