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