• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
157include(WarningFlags)
158
159# Build the shared library.
160add_library(cxxabi_shared_objects OBJECT EXCLUDE_FROM_ALL ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
161cxx_add_warning_flags(cxxabi_shared_objects ${LIBCXXABI_ENABLE_WERROR} ${LIBCXXABI_ENABLE_PEDANTIC})
162if (LIBCXXABI_USE_LLVM_UNWINDER)
163  if (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY)
164    target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared_objects) # propagate usage requirements
165    target_sources(cxxabi_shared_objects PUBLIC $<TARGET_OBJECTS:unwind_shared_objects>)
166  else()
167    target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared)
168  endif()
169endif()
170target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers ${LIBCXXABI_BUILTINS_LIBRARY} ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES})
171target_link_libraries(cxxabi_shared_objects PUBLIC cxxabi-headers)
172set_target_properties(cxxabi_shared_objects
173  PROPERTIES
174    CXX_EXTENSIONS OFF
175    CXX_STANDARD 20
176    CXX_STANDARD_REQUIRED OFF
177    COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}"
178    DEFINE_SYMBOL ""
179)
180if (CMAKE_POSITION_INDEPENDENT_CODE OR NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
181  set_target_properties(cxxabi_shared_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) # must set manually because it's an object library
182endif()
183
184if (LIBCXXABI_ENABLE_SHARED)
185  add_library(cxxabi_shared SHARED)
186  set_target_properties(cxxabi_shared
187    PROPERTIES
188      LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}"
189      OUTPUT_NAME "${LIBCXXABI_SHARED_OUTPUT_NAME}"
190      SOVERSION "1"
191      VERSION "${LIBCXXABI_LIBRARY_VERSION}"
192  )
193
194  if (ZOS)
195    add_custom_command(TARGET cxxabi_shared POST_BUILD
196      COMMAND
197        ${LIBCXXABI_LIBCXX_PATH}/utils/zos_rename_dll_side_deck.sh
198        $<TARGET_LINKER_FILE_NAME:cxxabi_shared> $<TARGET_FILE_NAME:cxxabi_shared> "${LIBCXXABI_DLL_NAME}"
199      COMMENT "Rename dll name inside the side deck file"
200      WORKING_DIRECTORY $<TARGET_FILE_DIR:cxxabi_shared>
201    )
202  endif ()
203
204  target_link_libraries(cxxabi_shared
205    PUBLIC cxxabi_shared_objects
206    PRIVATE ${LIBCXXABI_SHARED_LIBRARIES} ${LIBCXXABI_LIBRARIES})
207
208  list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared")
209  if (LIBCXXABI_INSTALL_SHARED_LIBRARY)
210    list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_shared")
211  endif()
212
213  add_library(cxxabi-reexports INTERFACE)
214
215  # -exported_symbols_list is only available on Apple platforms
216  if (APPLE)
217    function(export_symbols file)
218      target_link_libraries(cxxabi_shared PRIVATE "-Wl,-exported_symbols_list,${file}")
219    endfunction()
220    function(reexport_symbols file)
221      export_symbols("${file}")
222      target_link_libraries(cxxabi-reexports INTERFACE "-Wl,-reexported_symbols_list,${file}")
223    endfunction()
224
225    export_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/itanium-base.exp")
226
227    if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
228      reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/new-delete.exp")
229    endif()
230
231    if (LIBCXXABI_ENABLE_EXCEPTIONS)
232      reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/exceptions.exp")
233
234      if ("${CMAKE_OSX_ARCHITECTURES}" MATCHES "^(armv6|armv7|armv7s)$")
235        reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-sjlj.exp")
236      else()
237        reexport_symbols("${CMAKE_CURRENT_SOURCE_DIR}/../lib/personality-v0.exp")
238      endif()
239    endif()
240  endif()
241endif()
242
243# Build the static library.
244add_library(cxxabi_static_objects OBJECT EXCLUDE_FROM_ALL ${LIBCXXABI_SOURCES} ${LIBCXXABI_HEADERS})
245cxx_add_warning_flags(cxxabi_static_objects ${LIBCXXABI_ENABLE_WERROR} ${LIBCXXABI_ENABLE_PEDANTIC})
246if (LIBCXXABI_USE_LLVM_UNWINDER AND LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY)
247  target_link_libraries(cxxabi_static_objects PUBLIC unwind_static_objects) # propagate usage requirements
248  target_sources(cxxabi_static_objects PUBLIC $<TARGET_OBJECTS:unwind_static_objects>)
249endif()
250target_link_libraries(cxxabi_static_objects PRIVATE cxx-headers ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES})
251target_link_libraries(cxxabi_static_objects PUBLIC cxxabi-headers)
252set_target_properties(cxxabi_static_objects
253  PROPERTIES
254    CXX_EXTENSIONS OFF
255    CXX_STANDARD 20
256    CXX_STANDARD_REQUIRED OFF
257    COMPILE_FLAGS "${LIBCXXABI_COMPILE_FLAGS}"
258)
259
260if(LIBCXXABI_HERMETIC_STATIC_LIBRARY)
261  target_add_compile_flags_if_supported(cxxabi_static_objects PRIVATE -fvisibility=hidden)
262  # If the hermetic library doesn't define the operator new/delete functions
263  # then its code shouldn't declare them with hidden visibility.  They might
264  # actually be provided by a shared library at link time.
265  if (LIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS)
266    target_add_compile_flags_if_supported(cxxabi_static_objects PRIVATE -fvisibility-global-new-delete-hidden)
267  endif()
268  # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in libcxx's
269  # __config_site too. Define it in the same way here, to avoid redefinition
270  # conflicts.
271  target_compile_definitions(cxxabi_static_objects
272    PRIVATE
273      _LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS
274      _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=)
275endif()
276
277if (LIBCXXABI_ENABLE_STATIC)
278  add_library(cxxabi_static STATIC)
279  if (LIBCXXABI_USE_LLVM_UNWINDER AND NOT LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY)
280    target_link_libraries(cxxabi_static PUBLIC unwind_static)
281  endif()
282  set_target_properties(cxxabi_static
283    PROPERTIES
284      LINK_FLAGS "${LIBCXXABI_LINK_FLAGS}"
285      OUTPUT_NAME "${LIBCXXABI_STATIC_OUTPUT_NAME}"
286    )
287  target_link_libraries(cxxabi_static
288    PUBLIC cxxabi_static_objects
289    PRIVATE ${LIBCXXABI_STATIC_LIBRARIES} ${LIBCXXABI_LIBRARIES})
290
291  list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_static")
292  if (LIBCXXABI_INSTALL_STATIC_LIBRARY)
293    list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static")
294  endif()
295endif()
296
297# Add a meta-target for both libraries.
298add_custom_target(cxxabi DEPENDS ${LIBCXXABI_BUILD_TARGETS})
299
300if (LIBCXXABI_INSTALL_LIBRARY)
301  install(TARGETS ${LIBCXXABI_INSTALL_TARGETS}
302    LIBRARY DESTINATION ${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi
303    ARCHIVE DESTINATION ${LIBCXXABI_INSTALL_LIBRARY_DIR} COMPONENT cxxabi
304    RUNTIME DESTINATION ${LIBCXXABI_INSTALL_RUNTIME_DIR} COMPONENT cxxabi
305    )
306endif()
307
308if (NOT CMAKE_CONFIGURATION_TYPES AND LIBCXXABI_INSTALL_LIBRARY)
309  add_custom_target(install-cxxabi
310    DEPENDS cxxabi install-cxxabi-headers
311    COMMAND "${CMAKE_COMMAND}"
312            -DCMAKE_INSTALL_COMPONENT=cxxabi
313            -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake")
314  add_custom_target(install-cxxabi-stripped
315    DEPENDS cxxabi
316    COMMAND "${CMAKE_COMMAND}"
317            -DCMAKE_INSTALL_COMPONENT=cxxabi
318            -DCMAKE_INSTALL_DO_STRIP=1
319            -P "${LIBCXXABI_BINARY_DIR}/cmake_install.cmake")
320endif()
321