1 # Get sources 2 set(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_unexpected.cpp 11 cxa_vector.cpp 12 cxa_virtual.cpp 13 # C++ STL files 14 stdlib_exception.cpp 15 stdlib_stdexcept.cpp 16 stdlib_typeinfo.cpp 17 # Internal files 18 abort_message.cpp 19 fallback_malloc.cpp 20 private_typeinfo.cpp 21 ) 22 23 if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS) 24 list(APPEND LIBCXXABI_SOURCES stdlib_new_delete.cpp) 25 endif() 26 27 if (LIBCXXABI_ENABLE_EXCEPTIONS) 28 list(APPEND LIBCXXABI_SOURCES cxa_exception.cpp) 29 list(APPEND LIBCXXABI_SOURCES cxa_personality.cpp) 30 else() 31 list(APPEND LIBCXXABI_SOURCES cxa_noexception.cpp) 32 endif() 33 34 if (LIBCXXABI_ENABLE_THREADS AND UNIX AND NOT (APPLE OR CYGWIN)) 35 list(APPEND LIBCXXABI_SOURCES cxa_thread_atexit.cpp) 36 endif() 37 38 set(LIBCXXABI_HEADERS ../include/cxxabi.h) 39 40 # Add all the headers to the project for IDEs. 41 if (MSVC_IDE OR XCODE) 42 # Force them all into the headers dir on MSVC, otherwise they end up at 43 # project scope because they don't have extensions. 44 if (MSVC_IDE) 45 source_group("Header Files" FILES ${LIBCXXABI_HEADERS}) 46 endif() 47 endif() 48 49 include_directories("${LIBCXXABI_LIBCXX_INCLUDES}") 50 51 if (LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL) 52 add_definitions(-DHAVE___CXA_THREAD_ATEXIT_IMPL) 53 endif() 54 55 if (LIBCXXABI_ENABLE_THREADS) 56 add_library_flags_if(LIBCXXABI_HAS_PTHREAD_LIB pthread) 57 endif() 58 59 add_library_flags_if(LIBCXXABI_HAS_C_LIB c) 60 if (LIBCXXABI_USE_LLVM_UNWINDER) 61 # Prefer using the in-tree version of libunwind, either shared or static. If 62 # none are found fall back to using -lunwind. 63 # FIXME: Is it correct to prefer the static version of libunwind? 64 if (NOT LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_shared OR HAVE_LIBUNWIND)) 65 list(APPEND LIBCXXABI_LIBRARIES unwind_shared) 66 elseif (LIBCXXABI_ENABLE_STATIC_UNWINDER AND (TARGET unwind_static OR HAVE_LIBUNWIND)) 67 list(APPEND LIBCXXABI_LIBRARIES unwind_static) 68 else() 69 list(APPEND LIBCXXABI_LIBRARIES unwind) 70 endif() 71 else() 72 add_library_flags_if(LIBCXXABI_HAS_GCC_S_LIB gcc_s) 73 endif() 74 if (MINGW) 75 # MINGW_LIBRARIES is defined in config-ix.cmake 76 list(APPEND LIBCXXABI_LIBRARIES ${MINGW_LIBRARIES}) 77 endif() 78 79 # Setup flags. 80 add_link_flags_if_supported(-nodefaultlibs) 81 82 set(LIBCXXABI_SHARED_LINK_FLAGS) 83 84 if ( APPLE ) 85 if ( CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6" ) 86 list(APPEND LIBCXXABI_COMPILE_FLAGS "-U__STRICT_ANSI__") 87 list(APPEND LIBCXXABI_SHARED_LINK_FLAGS 88 "-compatibility_version 1" 89 "-current_version 1" 90 "-install_name /usr/lib/libc++abi.1.dylib") 91 list(APPEND LIBCXXABI_LINK_FLAGS 92 "/usr/lib/libSystem.B.dylib") 93 else() 94 list(APPEND LIBCXXABI_SHARED_LINK_FLAGS 95 "-compatibility_version 1" 96 "-install_name /usr/lib/libc++abi.1.dylib") 97 endif() 98 endif() 99 100 split_list(LIBCXXABI_COMPILE_FLAGS) 101 split_list(LIBCXXABI_LINK_FLAGS) 102 split_list(LIBCXXABI_SHARED_LINK_FLAGS) 103 104 # FIXME: libc++abi.so will not link when modules are enabled because it depends 105 # on symbols defined in libc++.so which has not yet been built. 106 if (LLVM_ENABLE_MODULES) 107 string(REPLACE "-Wl,-z,defs" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") 108 endif() 109 110 # Add a object library that contains the compiled source files. 111 add_library(cxxabi_objects OBJECT ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS}) 112 set_target_properties(cxxabi_objects 113 PROPERTIES 114 CXX_EXTENSIONS 115 OFF 116 CXX_STANDARD 117 11 118 CXX_STANDARD_REQUIRED 119 ON 120 COMPILE_FLAGS 121 "${LIBCXXABI_COMPILE_FLAGS}" 122 POSITION_INDEPENDENT_CODE 123 ON) 124 125 set(LIBCXXABI_TARGETS) 126 127 # Build the shared library. 128 if (LIBCXXABI_ENABLE_SHARED) 129 add_library(cxxabi_shared SHARED $<TARGET_OBJECTS:cxxabi_objects>) 130 target_link_libraries(cxxabi_shared ${LIBCXXABI_LIBRARIES}) 131 set_target_properties(cxxabi_shared 132 PROPERTIES 133 CXX_EXTENSIONS 134 OFF 135 CXX_STANDARD 136 11 137 CXX_STANDARD_REQUIRED 138 ON 139 LINK_FLAGS 140 "${LIBCXXABI_LINK_FLAGS} ${LIBCXXABI_SHARED_LINK_FLAGS}" 141 OUTPUT_NAME 142 "c++abi" 143 POSITION_INDEPENDENT_CODE 144 ON 145 SOVERSION 146 "1" 147 VERSION 148 "1.0") 149 list(APPEND LIBCXXABI_TARGETS "cxxabi_shared") 150 endif() 151 152 # Build the static library. 153 if (LIBCXXABI_ENABLE_STATIC) 154 add_library(cxxabi_static STATIC $<TARGET_OBJECTS:cxxabi_objects>) 155 target_link_libraries(cxxabi_static ${LIBCXXABI_LIBRARIES}) 156 set_target_properties(cxxabi_static 157 PROPERTIES 158 CXX_EXTENSIONS 159 OFF 160 CXX_STANDARD 161 11 162 CXX_STANDARD_REQUIRED 163 ON 164 LINK_FLAGS 165 "${LIBCXXABI_LINK_FLAGS}" 166 OUTPUT_NAME 167 "c++abi" 168 POSITION_INDEPENDENT_CODE 169 ON) 170 list(APPEND LIBCXXABI_TARGETS "cxxabi_static") 171 endif() 172 173 # Add a meta-target for both libraries. 174 add_custom_target(cxxabi DEPENDS ${LIBCXXABI_TARGETS}) 175 176 install(TARGETS ${LIBCXXABI_TARGETS} 177 LIBRARY DESTINATION ${LIBCXXABI_INSTALL_PREFIX}lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi 178 ARCHIVE DESTINATION ${LIBCXXABI_INSTALL_PREFIX}lib${LIBCXXABI_LIBDIR_SUFFIX} COMPONENT cxxabi 179 ) 180 181 if (NOT CMAKE_CONFIGURATION_TYPES) 182 add_custom_target(install-cxxabi 183 DEPENDS cxxabi 184 COMMAND "${CMAKE_COMMAND}" 185 -DCMAKE_INSTALL_COMPONENT=cxxabi 186 -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake") 187 188 # TODO: This is a legacy target name and should be removed at some point. 189 add_custom_target(install-libcxxabi DEPENDS install-cxxabi) 190 endif() 191