xref: /openbsd-src/gnu/llvm/libcxxabi/src/CMakeLists.txt (revision 8f1d572453a8bab44a2fe956e25efc4124e87e82)
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