[libunwind] Bump to CXX_STANDARD 17 (#75986)
[llvm-project.git] / libunwind / src / CMakeLists.txt
blob9c6f5d908b0945485b1f426801a8af232ac851a6
1 # Get sources
3 set(LIBUNWIND_CXX_SOURCES
4     libunwind.cpp
5     Unwind-EHABI.cpp
6     Unwind-seh.cpp
7     )
9 if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
10   list(APPEND LIBUNWIND_CXX_SOURCES
11     Unwind_AIXExtras.cpp
12     )
13 endif()
15 set(LIBUNWIND_C_SOURCES
16     UnwindLevel1.c
17     UnwindLevel1-gcc-ext.c
18     Unwind-sjlj.c
19     Unwind-wasm.c
20     )
21 set_source_files_properties(${LIBUNWIND_C_SOURCES}
22                             PROPERTIES
23                               COMPILE_FLAGS "-std=c99")
25 set(LIBUNWIND_ASM_SOURCES
26     UnwindRegistersRestore.S
27     UnwindRegistersSave.S
28     )
30 set(LIBUNWIND_HEADERS
31     AddressSpace.hpp
32     assembly.h
33     CompactUnwinder.hpp
34     cet_unwind.h
35     config.h
36     dwarf2.h
37     DwarfInstructions.hpp
38     DwarfParser.hpp
39     EHHeaderParser.hpp
40     FrameHeaderCache.hpp
41     libunwind_ext.h
42     Registers.hpp
43     RWMutex.hpp
44     Unwind-EHABI.h
45     UnwindCursor.hpp
46     ../include/libunwind.h
47     ../include/unwind.h
48     ../include/unwind_itanium.h
49     ../include/unwind_arm_ehabi.h
50     )
51 if(APPLE)
52   list(APPEND LIBUNWIND_HEADERS
53     ../include/mach-o/compact_unwind_encoding.h
54     )
55 endif()
57 if (MSVC_IDE)
58   # Force them all into the headers dir on MSVC, otherwise they end up at
59   # project scope because they don't have extensions.
60   source_group("Header Files" FILES ${LIBUNWIND_HEADERS})
61 endif()
63 set(LIBUNWIND_SOURCES
64     ${LIBUNWIND_CXX_SOURCES}
65     ${LIBUNWIND_C_SOURCES}
66     ${LIBUNWIND_ASM_SOURCES})
68 # Generate library list.
69 if (CXX_SUPPORTS_NOSTDLIBXX_FLAG)
70   add_link_flags_if_supported(-nostdlib++)
71 else()
72   if (LIBUNWIND_USE_COMPILER_RT)
73     add_library_flags("${LIBUNWIND_BUILTINS_LIBRARY}")
74   else()
75     add_library_flags_if(LIBUNWIND_HAS_GCC_S_LIB gcc_s)
76     add_library_flags_if(LIBUNWIND_HAS_GCC_LIB gcc)
77   endif()
78   add_library_flags_if(LIBUNWIND_HAS_C_LIB c)
79 endif()
81 if (NOT APPLE)
82   add_library_flags_if(LIBUNWIND_HAS_DL_LIB dl)
83 endif()
85 if (LIBUNWIND_ENABLE_THREADS AND NOT APPLE)
86     add_library_flags_if(LIBUNWIND_HAS_PTHREAD_LIB pthread)
87 endif()
89 if (LIBUNWIND_ENABLE_THREADS)
90   add_compile_flags_if(LIBUNWIND_WEAK_PTHREAD_LIB -DLIBUNWIND_USE_WEAK_PTHREAD=1)
91 endif()
93 # Setup flags.
94 add_link_flags_if(CXX_SUPPORTS_UNWINDLIB_EQ_NONE_FLAG --unwindlib=none)
96 # MINGW_LIBRARIES is defined in config-ix.cmake
97 add_library_flags_if(MINGW "${MINGW_LIBRARIES}")
99 if (LIBUNWIND_ENABLE_SHARED AND
100     NOT (CXX_SUPPORTS_FNO_EXCEPTIONS_FLAG AND
101          CXX_SUPPORTS_FUNWIND_TABLES_FLAG))
102   message(FATAL_ERROR
103           "Compiler doesn't support generation of unwind tables if exception "
104           "support is disabled.  Building libunwind DSO with runtime dependency "
105           "on C++ ABI library is not supported.")
106 endif()
108 if (APPLE)
109   add_compile_flags("-U__STRICT_ANSI__")
110   add_link_flags("-compatibility_version 1" "-install_name /usr/lib/libunwind.1.dylib")
112   if (CMAKE_OSX_DEPLOYMENT_TARGET STREQUAL "10.6")
113     add_link_flags("-current_version ${LIBUNWIND_VERSION}" "/usr/lib/libSystem.B.dylib")
114   endif ()
115 endif ()
117 if (HAIKU)
118   add_library_flags_if(LIBUNWIND_HAS_ROOT_LIB root)
120   add_library_flags_if(LIBUNWIND_HAS_BSD_LIB bsd)
121   add_compile_flags_if(LIBUNWIND_HAS_BSD_LIB -D_LIBUNWIND_USE_HAIKU_BSD_LIB=1)
123   add_compile_flags("-D_DEFAULT_SOURCE")
124   add_compile_flags("-DPT_GNU_EH_FRAME=PT_EH_FRAME")
125 endif ()
127 string(REPLACE ";" " " LIBUNWIND_COMPILE_FLAGS "${LIBUNWIND_COMPILE_FLAGS}")
128 string(REPLACE ";" " " LIBUNWIND_CXX_FLAGS "${LIBUNWIND_CXX_FLAGS}")
129 string(REPLACE ";" " " LIBUNWIND_C_FLAGS "${LIBUNWIND_C_FLAGS}")
130 string(REPLACE ";" " " LIBUNWIND_LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}")
132 set_property(SOURCE ${LIBUNWIND_CXX_SOURCES}
133              APPEND_STRING PROPERTY COMPILE_FLAGS " ${LIBUNWIND_CXX_FLAGS}")
134 set_property(SOURCE ${LIBUNWIND_C_SOURCES}
135              APPEND_STRING PROPERTY COMPILE_FLAGS " ${LIBUNWIND_C_FLAGS}")
137 # NOTE: avoid implicit dependencies on C++ runtimes.  libunwind uses C++ for
138 # ease, but does not rely on C++ at runtime.
139 set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
141 include(WarningFlags)
143 # Build the shared library.
144 add_library(unwind_shared_objects OBJECT EXCLUDE_FROM_ALL ${LIBUNWIND_SOURCES} ${LIBUNWIND_HEADERS})
145 cxx_add_warning_flags(unwind_shared_objects ${LIBUNWIND_ENABLE_WERROR} ${LIBUNWIND_ENABLE_PEDANTIC})
146 if(CMAKE_C_COMPILER_ID STREQUAL MSVC)
147   target_compile_options(unwind_shared_objects PRIVATE /GR-)
148 else()
149   target_compile_options(unwind_shared_objects PRIVATE -fno-rtti)
150 endif()
151 target_link_libraries(unwind_shared_objects PRIVATE unwind-headers ${LIBUNWIND_LIBRARIES})
152 target_compile_options(unwind_shared_objects PUBLIC "${LIBUNWIND_ADDITIONAL_COMPILE_FLAGS}")
153 target_link_libraries(unwind_shared_objects PUBLIC "${LIBUNWIND_ADDITIONAL_LIBRARIES}")
154 set_target_properties(unwind_shared_objects
155   PROPERTIES
156     CXX_EXTENSIONS OFF
157     CXX_STANDARD 17
158     CXX_STANDARD_REQUIRED ON
159     COMPILE_FLAGS "${LIBUNWIND_COMPILE_FLAGS}"
161 if (CMAKE_POSITION_INDEPENDENT_CODE OR NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
162   set_target_properties(unwind_shared_objects PROPERTIES POSITION_INDEPENDENT_CODE ON) # must set manually because it's an object library
163 endif()
165 if (LIBUNWIND_ENABLE_SHARED)
166   add_library(unwind_shared SHARED)
167   target_link_libraries(unwind_shared PUBLIC unwind_shared_objects)
168   set_target_properties(unwind_shared
169     PROPERTIES
170       LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}"
171       LINKER_LANGUAGE C
172       OUTPUT_NAME "${LIBUNWIND_SHARED_OUTPUT_NAME}"
173       VERSION "1.0"
174       SOVERSION "1"
175   )
177   list(APPEND LIBUNWIND_BUILD_TARGETS "unwind_shared")
178   if (LIBUNWIND_INSTALL_SHARED_LIBRARY)
179     list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_shared")
180   endif()
181 endif()
183 # Build the static library.
184 add_library(unwind_static_objects OBJECT EXCLUDE_FROM_ALL ${LIBUNWIND_SOURCES} ${LIBUNWIND_HEADERS})
185 cxx_add_warning_flags(unwind_static_objects ${LIBUNWIND_ENABLE_WERROR} ${LIBUNWIND_ENABLE_PEDANTIC})
186 if(CMAKE_C_COMPILER_ID STREQUAL MSVC)
187   target_compile_options(unwind_static_objects PRIVATE /GR-)
188 else()
189   target_compile_options(unwind_static_objects PRIVATE -fno-rtti)
190 endif()
191 target_link_libraries(unwind_static_objects PRIVATE unwind-headers ${LIBUNWIND_LIBRARIES})
192 target_compile_options(unwind_static_objects PUBLIC "${LIBUNWIND_ADDITIONAL_COMPILE_FLAGS}")
193 target_link_libraries(unwind_static_objects PUBLIC "${LIBUNWIND_ADDITIONAL_LIBRARIES}")
194 set_target_properties(unwind_static_objects
195   PROPERTIES
196     CXX_EXTENSIONS OFF
197     CXX_STANDARD 17
198     CXX_STANDARD_REQUIRED ON
199     COMPILE_FLAGS "${LIBUNWIND_COMPILE_FLAGS}"
202 if(LIBUNWIND_HIDE_SYMBOLS)
203   target_add_compile_flags_if_supported(unwind_static_objects PRIVATE -fvisibility=hidden)
204   target_add_compile_flags_if_supported(unwind_static_objects PRIVATE -fvisibility-global-new-delete-hidden)
205   target_compile_definitions(unwind_static_objects PRIVATE _LIBUNWIND_HIDE_SYMBOLS)
206 endif()
208 if (LIBUNWIND_ENABLE_STATIC)
209   add_library(unwind_static STATIC)
210   target_link_libraries(unwind_static PUBLIC unwind_static_objects)
211   set_target_properties(unwind_static
212     PROPERTIES
213       LINK_FLAGS "${LIBUNWIND_LINK_FLAGS}"
214       LINKER_LANGUAGE C
215       OUTPUT_NAME "${LIBUNWIND_STATIC_OUTPUT_NAME}"
216   )
218   list(APPEND LIBUNWIND_BUILD_TARGETS "unwind_static")
219   if (LIBUNWIND_INSTALL_STATIC_LIBRARY)
220     list(APPEND LIBUNWIND_INSTALL_TARGETS "unwind_static")
221   endif()
222 endif()
224 # Add a meta-target for both libraries.
225 add_custom_target(unwind DEPENDS ${LIBUNWIND_BUILD_TARGETS})
227 if (LIBUNWIND_INSTALL_LIBRARY)
228   install(TARGETS ${LIBUNWIND_INSTALL_TARGETS}
229     LIBRARY DESTINATION ${LIBUNWIND_INSTALL_LIBRARY_DIR} COMPONENT unwind
230     ARCHIVE DESTINATION ${LIBUNWIND_INSTALL_LIBRARY_DIR} COMPONENT unwind
231     RUNTIME DESTINATION ${LIBUNWIND_INSTALL_RUNTIME_DIR} COMPONENT unwind)
232 endif()
234 if (NOT CMAKE_CONFIGURATION_TYPES AND LIBUNWIND_INSTALL_LIBRARY)
235   add_custom_target(install-unwind
236     DEPENDS unwind
237     COMMAND "${CMAKE_COMMAND}"
238             -DCMAKE_INSTALL_COMPONENT=unwind
239             -P "${LIBUNWIND_BINARY_DIR}/cmake_install.cmake")
240   add_custom_target(install-unwind-stripped
241     DEPENDS unwind
242     COMMAND "${CMAKE_COMMAND}"
243             -DCMAKE_INSTALL_COMPONENT=unwind
244             -DCMAKE_INSTALL_DO_STRIP=1
245             -P "${LIBUNWIND_BINARY_DIR}/cmake_install.cmake")
246   if(LIBUNWIND_INSTALL_HEADERS)
247     add_dependencies(install-unwind install-unwind-headers)
248     add_dependencies(install-unwind-stripped install-unwind-headers-stripped)
249   endif()
250 endif()