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 stdlib_new_delete.cpp) 24endif() 25 26if (LIBCXXABI_ENABLE_EXCEPTIONS) 27 list(APPEND LIBCXXABI_SOURCES 28 cxa_exception.cpp 29 cxa_personality.cpp 30 ) 31else() 32 list(APPEND LIBCXXABI_SOURCES 33 cxa_noexception.cpp 34 ) 35endif() 36 37if (LIBCXXABI_ENABLE_THREADS AND (UNIX OR FUCHSIA) AND NOT (APPLE OR CYGWIN)) 38 list(APPEND LIBCXXABI_SOURCES 39 cxa_thread_atexit.cpp 40 ) 41endif() 42 43set(LIBCXXABI_HEADERS 44 ../include/cxxabi.h 45) 46 47# Add all the headers to the project for IDEs. 48if (MSVC_IDE OR XCODE) 49 # Force them all into the headers dir on MSVC, otherwise they end up at 50 # project scope because they don't have extensions. 51 if (MSVC_IDE) 52 source_group("Header Files" FILES ${LIBCXXABI_HEADERS}) 53 endif() 54endif() 55 56include_directories("${LIBCXXABI_LIBCXX_INCLUDES}") 57 58if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL) 59 add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL) 60endif() 61 62if (LIBCXXABI_ENABLE_FORGIVING_DYNAMIC_CAST) 63 add_definitions(-D_LIBCXXABI_FORGIVING_DYNAMIC_CAST) 64endif() 65 66if (APPLE) 67 add_library_flags_if(LIBCXXABI_HAS_SYSTEM_LIB System) 68else() 69 if (LIBCXXABI_ENABLE_THREADS) 70 add_library_flags_if(LIBCXXABI_HAS_PTHREAD_LIB pthread) 71 endif() 72 73 add_library_flags_if(LIBCXXABI_HAS_C_LIB c) 74endif() 75 76if (LIBCXXABI_USE_LLVM_UNWINDER) 77 # Prefer using the in-tree version of libunwind, either shared or static. If 78 # none are found fall back to using -lunwind. 79 # FIXME: Is it correct to prefer the static version of libunwind? 80 if (NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) 81 list(APPEND LIBCXXABI_SHARED_LIBRARIES unwind_shared) 82 elseif (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY AND (TARGET unwind_static OR HAVE_LIBUNWIND)) 83 list(APPEND LIBCXXABI_SHARED_LIBRARIES unwind_static) 84 else() 85 list(APPEND LIBCXXABI_SHARED_LIBRARIES unwind) 86 endif() 87 if (NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) 88 list(APPEND LIBCXXABI_STATIC_LIBRARIES unwind_shared) 89 elseif (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY AND (TARGET unwind_static OR HAVE_LIBUNWIND)) 90 # We handle this by directly merging libunwind objects into libc++abi. 91 else() 92 list(APPEND LIBCXXABI_STATIC_LIBRARIES unwind) 93 endif() 94else() 95 add_library_flags_if(LIBCXXABI_HAS_GCC_S_LIB gcc_s) 96endif() 97if (MINGW) 98 # MINGW_LIBRARIES is defined in config-ix.cmake 99 list(APPEND LIBCXXABI_LIBRARIES ${MINGW_LIBRARIES}) 100endif() 101if (ANDROID AND ANDROID_PLATFORM_LEVEL LESS 21) 102 list(APPEND LIBCXXABI_LIBRARIES android_support) 103endif() 104 105if (NOT LIBCXXABI_USE_COMPILER_RT) 106 add_library_flags_if(LIBCXXABI_HAS_GCC_LIB gcc) 107endif () 108 109# Setup flags. 110add_link_flags_if_supported(-nodefaultlibs) 111 112if ( APPLE ) 113 if (LLVM_USE_SANITIZER) 114 if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR 115 ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR 116 ("${LLVM_USE_SANITIZER}" STREQUAL "Undefined;Address")) 117 set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib") 118 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined") 119 set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib") 120 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Thread") 121 set(LIBFILE "libclang_rt.tsan_osx_dynamic.dylib") 122 else() 123 message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X") 124 endif() 125 if (LIBFILE) 126 find_compiler_rt_dir(LIBDIR) 127 if (NOT IS_DIRECTORY "${LIBDIR}") 128 message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER") 129 endif() 130 set(LIBCXXABI_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") 131 set(LIBCXXABI_SANITIZER_LIBRARY "${LIBCXXABI_SANITIZER_LIBRARY}" PARENT_SCOPE) 132 message(STATUS "Manually linking compiler-rt library: ${LIBCXXABI_SANITIZER_LIBRARY}") 133 add_library_flags("${LIBCXXABI_SANITIZER_LIBRARY}") 134 add_link_flags("-Wl,-rpath,${LIBDIR}") 135 endif() 136 endif() 137 138 # Make sure we link in CrashReporterClient if we find it -- it's used by 139 # abort() on Apple platforms when building the system dylib. 140 find_library(CrashReporterClient NAMES libCrashReporterClient.a 141 PATHS "${CMAKE_OSX_SYSROOT}/usr/local/lib") 142 if (CrashReporterClient) 143 message(STATUS "Linking with CrashReporterClient at ${CrashReporterClient}") 144 add_library_flags("${CrashReporterClient}") 145 else() 146 message(STATUS "Could not find CrashReporterClient, not linking against it") 147 endif() 148endif() 149 150split_list(LIBCXXABI_COMPILE_FLAGS) 151split_list(LIBCXXABI_LINK_FLAGS) 152 153# FIXME: libc++abi.so will not link when modules are enabled because it depends 154# on symbols defined in libc++.so which has not yet been built. 155if (LLVM_ENABLE_MODULES) 156 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") 157endif() 158 159if (NOT TARGET pstl::ParallelSTL) 160 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.") 161endif() 162 163# Build the shared library. 164if (LIBCXXABI_ENABLE_SHARED) 165 add_library(cxxabi_shared SHARED ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) 166 if(COMMAND llvm_setup_rpath) 167 llvm_setup_rpath(cxxabi_shared) 168 endif() 169 target_link_libraries(cxxabi_shared PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 170 if (TARGET pstl::ParallelSTL) 171 target_link_libraries(cxxabi_shared PUBLIC pstl::ParallelSTL) 172 endif() 173 set_target_properties(cxxabi_shared 174 PROPERTIES 175 CXX_EXTENSIONS 176 OFF 177 CXX_STANDARD 178 11 179 CXX_STANDARD_REQUIRED 180 ON 181 COMPILE_FLAGS 182 "${LIBCXXABI_COMPILE_FLAGS}" 183 LINK_FLAGS 184 "${LIBCXXABI_LINK_FLAGS}" 185 OUTPUT_NAME 186 "c++abi" 187 SOVERSION 188 "1" 189 VERSION 190 "${LIBCXXABI_LIBRARY_VERSION}" 191 DEFINE_SYMBOL 192 "") 193 194 if(LIBCXXABI_ENABLE_PIC) 195 set_target_properties(cxxabi_shared PROPERTIES POSITION_INDEPENDENT_CODE ON) 196 endif() 197 198 list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared") 199 if (LIBCXXABI_INSTALL_SHARED_LIBRARY) 200 list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_shared") 201 endif() 202 203 # -exported_symbols_list is only available on Apple platforms 204 if (APPLE) 205 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp") 206 207 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 208 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/new-delete.exp") 209 endif() 210 211 if (LIBCXXABI_ENABLE_EXCEPTIONS) 212 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/exceptions.exp") 213 214 if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$") 215 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-sjlj.exp") 216 else() 217 target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-v0.exp") 218 endif() 219 endif() 220 endif() 221endif() 222 223# Build the static library. 224if (LIBCXXABI_ENABLE_STATIC) 225 add_library(cxxabi_static STATIC ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) 226 target_link_libraries(cxxabi_static PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES}) 227 if (TARGET pstl::ParallelSTL) 228 target_link_libraries(cxxabi_static PUBLIC pstl::ParallelSTL) 229 endif() 230 set_target_properties(cxxabi_static 231 PROPERTIES 232 CXX_EXTENSIONS 233 OFF 234 CXX_STANDARD 235 11 236 CXX_STANDARD_REQUIRED 237 ON 238 COMPILE_FLAGS 239 "${LIBCXXABI_COMPILE_FLAGS}" 240 LINK_FLAGS 241 "${LIBCXXABI_LINK_FLAGS}" 242 OUTPUT_NAME 243 "c++abi") 244 245 if(LIBCXXABI_ENABLE_PIC) 246 set_target_properties(cxxabi_static PROPERTIES POSITION_INDEPENDENT_CODE ON) 247 endif() 248 249 if(LIBCXXABI_HERMETIC_STATIC_LIBRARY) 250 append_flags_if_supported(CXXABI_STATIC_LIBRARY_FLAGS -fvisibility=hidden) 251 # If the hermetic library doesn't define the operator new/delete functions 252 # then its code shouldn't declare them with hidden visibility. They might 253 # actually be provided by a shared library at link time. 254 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 255 append_flags_if_supported(CXXABI_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden) 256 endif() 257 target_compile_options(cxxabi_static PRIVATE ${CXXABI_STATIC_LIBRARY_FLAGS}) 258 target_compile_definitions(cxxabi_static 259 PRIVATE 260 _LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS 261 _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) 262 endif() 263 264 list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_static") 265 if (LIBCXXABI_INSTALL_STATIC_LIBRARY) 266 list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static") 267 endif() 268 269 if (APPLE) 270 set(MERGE_ARCHIVES_LIBTOOL "--use-libtool" "--libtool" "${CMAKE_LIBTOOL}") 271 endif() 272 273 # Merge the libc++abi.a and libunwind.a into one. 274 if(LIBCXXABI_USE_LLVM_UNWINDER AND LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY) 275 add_custom_command(TARGET cxxabi_static POST_BUILD 276 COMMAND ${PYTHON_EXECUTABLE} ${LIBCXXABI_LIBCXX_PATH}/utils/merge_archives.py 277 ARGS 278 -o "$<TARGET_LINKER_FILE:cxxabi_static>" 279 --ar "${CMAKE_AR}" 280 ${MERGE_ARCHIVES_LIBTOOL} 281 "$<TARGET_LINKER_FILE:cxxabi_static>" 282 "$<TARGET_LINKER_FILE:unwind_static>" 283 WORKING_DIRECTORY ${LIBCXXABI_BUILD_DIR} 284 ) 285 endif() 286endif() 287 288# Add a meta-target for both libraries. 289add_custom_target(cxxabi DEPENDS ${LIBCXXABI_BUILD_TARGETS}) 290 291if (LIBCXXABI_INSTALL_LIBRARY) 292 install(TARGETS ${LIBCXXABI_INSTALL_TARGETS} 293 LIBRARY DESTINATION ${LIBCXXABI_INSTALL_PREFIX}${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi 294 ARCHIVE DESTINATION ${LIBCXXABI_INSTALL_PREFIX}${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi 295 ) 296endif() 297 298if (NOT CMAKE_CONFIGURATION_TYPES AND LIBCXXABI_INSTALL_LIBRARY) 299 add_custom_target(install-cxxabi 300 DEPENDS cxxabi 301 COMMAND "${CMAKE_COMMAND}" 302 -DCMAKE_INSTALL_COMPONENT=cxxabi 303 -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake") 304 add_custom_target(install-cxxabi-stripped 305 DEPENDS cxxabi 306 COMMAND "${CMAKE_COMMAND}" 307 -DCMAKE_INSTALL_COMPONENT=cxxabi 308 -DCMAKE_INSTALL_DO_STRIP=1 309 -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake") 310endif() 311