1set(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}" PARENT_SCOPE) 2 3# Get sources 4set(LIBCXX_SOURCES 5 algorithm.cpp 6 any.cpp 7 assert.cpp 8 atomic.cpp 9 barrier.cpp 10 bind.cpp 11 charconv.cpp 12 chrono.cpp 13 condition_variable.cpp 14 condition_variable_destructor.cpp 15 exception.cpp 16 functional.cpp 17 future.cpp 18 hash.cpp 19 include/apple_availability.h 20 include/atomic_support.h 21 include/config_elast.h 22 include/refstring.h 23 include/ryu/common.h 24 include/ryu/d2fixed.h 25 include/ryu/d2fixed_full_table.h 26 include/ryu/d2s.h 27 include/ryu/d2s_full_table.h 28 include/ryu/d2s_intrinsics.h 29 include/ryu/digit_table.h 30 include/ryu/f2s.h 31 include/ryu/ryu.h 32 include/to_chars_floating_point.h 33 legacy_pointer_safety.cpp 34 memory.cpp 35 mutex.cpp 36 mutex_destructor.cpp 37 new.cpp 38 optional.cpp 39 random_shuffle.cpp 40 ryu/d2fixed.cpp 41 ryu/d2s.cpp 42 ryu/f2s.cpp 43 shared_mutex.cpp 44 stdexcept.cpp 45 string.cpp 46 support/runtime/exception_fallback.ipp 47 support/runtime/exception_glibcxx.ipp 48 support/runtime/exception_libcxxabi.ipp 49 support/runtime/exception_libcxxrt.ipp 50 support/runtime/exception_msvc.ipp 51 support/runtime/exception_pointer_cxxabi.ipp 52 support/runtime/exception_pointer_glibcxx.ipp 53 support/runtime/exception_pointer_msvc.ipp 54 support/runtime/exception_pointer_unimplemented.ipp 55 support/runtime/new_handler_fallback.ipp 56 support/runtime/stdexcept_default.ipp 57 support/runtime/stdexcept_vcruntime.ipp 58 system_error.cpp 59 thread.cpp 60 typeinfo.cpp 61 utility.cpp 62 valarray.cpp 63 variant.cpp 64 vector.cpp 65 ) 66 67if (LIBCXX_ENABLE_DEBUG_MODE OR LIBCXX_ENABLE_BACKWARDS_COMPATIBILITY_DEBUG_MODE_SYMBOLS) 68 list(APPEND LIBCXX_SOURCES 69 debug.cpp 70 legacy_debug_handler.cpp 71 ) 72endif() 73 74if (LIBCXX_ENABLE_RANDOM_DEVICE) 75 list(APPEND LIBCXX_SOURCES 76 random.cpp 77 ) 78endif() 79 80if (LIBCXX_ENABLE_LOCALIZATION) 81 list(APPEND LIBCXX_SOURCES 82 include/sso_allocator.h 83 ios.cpp 84 ios.instantiations.cpp 85 iostream.cpp 86 locale.cpp 87 regex.cpp 88 strstream.cpp 89 ) 90endif() 91 92if(WIN32) 93 list(APPEND LIBCXX_SOURCES 94 support/win32/locale_win32.cpp 95 support/win32/support.cpp 96 ) 97 98 if (NOT LIBCXX_HAS_PTHREAD_API) 99 list(APPEND LIBCXX_SOURCES 100 support/win32/thread_win32.cpp 101 ) 102 endif() 103elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") 104 list(APPEND LIBCXX_SOURCES 105 support/solaris/mbsnrtowcs.inc 106 support/solaris/wcsnrtombs.inc 107 support/solaris/xlocale.cpp 108 ) 109elseif(ZOS) 110 list(APPEND LIBCXX_SOURCES 111 support/ibm/mbsnrtowcs.cpp 112 support/ibm/wcsnrtombs.cpp 113 support/ibm/xlocale_zos.cpp 114 ) 115endif() 116 117if (LIBCXX_ENABLE_FILESYSTEM) 118 list(APPEND LIBCXX_SOURCES 119 filesystem/filesystem_common.h 120 filesystem/operations.cpp 121 filesystem/directory_iterator.cpp 122 filesystem/posix_compat.h 123 ) 124 # Filesystem uses __int128_t, which requires a definition of __muloi4 when 125 # compiled with UBSAN. This definition is not provided by libgcc_s, but is 126 # provided by compiler-rt. So we need to disable it to avoid having multiple 127 # definitions. See filesystem/int128_builtins.cpp. 128 if (NOT LIBCXX_USE_COMPILER_RT) 129 list(APPEND LIBCXX_SOURCES 130 filesystem/int128_builtins.cpp 131 ) 132 endif() 133endif() 134 135# Add all the headers to the project for IDEs. 136if (LIBCXX_CONFIGURE_IDE) 137 file(GLOB_RECURSE LIBCXX_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/*) 138 if(WIN32) 139 file( GLOB LIBCXX_WIN32_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/../include/__support/win32/*.h) 140 list(APPEND LIBCXX_HEADERS ${LIBCXX_WIN32_HEADERS}) 141 endif() 142 # Force them all into the headers dir on MSVC, otherwise they end up at 143 # project scope because they don't have extensions. 144 if (MSVC_IDE) 145 source_group("Header Files" FILES ${LIBCXX_HEADERS}) 146 endif() 147endif() 148 149if(NOT LIBCXX_INSTALL_LIBRARY) 150 set(exclude_from_all EXCLUDE_FROM_ALL) 151endif() 152 153if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY) 154 find_compiler_rt_library(profile LIBCXX_COVERAGE_LIBRARY) 155endif() 156add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}") 157 158if (APPLE AND LLVM_USE_SANITIZER) 159 if (("${LLVM_USE_SANITIZER}" STREQUAL "Address") OR 160 ("${LLVM_USE_SANITIZER}" STREQUAL "Address;Undefined") OR 161 ("${LLVM_USE_SANITIZER}" STREQUAL "Undefined;Address")) 162 set(LIBFILE "libclang_rt.asan_osx_dynamic.dylib") 163 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Undefined") 164 set(LIBFILE "libclang_rt.ubsan_osx_dynamic.dylib") 165 elseif("${LLVM_USE_SANITIZER}" STREQUAL "Thread") 166 set(LIBFILE "libclang_rt.tsan_osx_dynamic.dylib") 167 else() 168 message(WARNING "LLVM_USE_SANITIZER=${LLVM_USE_SANITIZER} is not supported on OS X") 169 endif() 170 if (LIBFILE) 171 find_compiler_rt_library(builtins LIBCXX_BUILTINS_LIBRARY) 172 get_filename_component(LIBDIR "${LIBCXX_BUILTINS_LIBRARY}" DIRECTORY) 173 if (NOT IS_DIRECTORY "${LIBDIR}") 174 message(FATAL_ERROR "Cannot find compiler-rt directory on OS X required for LLVM_USE_SANITIZER") 175 endif() 176 set(LIBCXX_SANITIZER_LIBRARY "${LIBDIR}/${LIBFILE}") 177 set(LIBCXX_SANITIZER_LIBRARY "${LIBCXX_SANITIZER_LIBRARY}" PARENT_SCOPE) 178 message(STATUS "Manually linking compiler-rt library: ${LIBCXX_SANITIZER_LIBRARY}") 179 add_library_flags("${LIBCXX_SANITIZER_LIBRARY}") 180 add_link_flags("-Wl,-rpath,${LIBDIR}") 181 endif() 182endif() 183 184if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS AND NOT TARGET pstl::ParallelSTL) 185 message(FATAL_ERROR "Could not find ParallelSTL") 186endif() 187 188function(cxx_set_common_defines name) 189 if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS) 190 target_link_libraries(${name} PUBLIC pstl::ParallelSTL) 191 endif() 192endfunction() 193 194split_list(LIBCXX_COMPILE_FLAGS) 195split_list(LIBCXX_LINK_FLAGS) 196 197# Build the shared library. 198if (LIBCXX_ENABLE_SHARED) 199 add_library(cxx_shared SHARED ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) 200 target_include_directories(cxx_shared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) 201 target_link_libraries(cxx_shared PUBLIC cxx-headers 202 PRIVATE ${LIBCXX_LIBRARIES}) 203 set_target_properties(cxx_shared 204 PROPERTIES 205 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 206 LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 207 OUTPUT_NAME "c++" 208 VERSION "${LIBCXX_LIBRARY_VERSION}" 209 SOVERSION "${LIBCXX_ABI_VERSION}" 210 DEFINE_SYMBOL "" 211 ) 212 cxx_add_common_build_flags(cxx_shared) 213 cxx_set_common_defines(cxx_shared) 214 215 # Link against LLVM libunwind 216 # Note that we do need to link against libunwind directly to ensure that the correct 217 # dependencies are recorded when creating a linker script. 218 # TODO: Look into modifying the linker script creation to recursively consider interface libraries 219 if (LIBCXXABI_USE_LLVM_UNWINDER) 220 if (LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_SHARED_LIBRARY) 221 # libunwind is already included in libc++abi 222 elseif (TARGET unwind_shared OR HAVE_LIBUNWIND) 223 target_link_libraries(cxx_shared PUBLIC unwind_shared) 224 else() 225 target_link_libraries(cxx_shared PUBLIC unwind) 226 endif() 227 endif() 228 229 # Link against libc++abi 230 if (LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) 231 target_link_libraries(cxx_shared PRIVATE libcxx-abi-shared-objects) 232 else() 233 target_link_libraries(cxx_shared PUBLIC libcxx-abi-shared) 234 endif() 235 236 # Maybe re-export symbols from libc++abi 237 # In particular, we don't re-export the symbols if libc++abi is merged statically 238 # into libc++ because in that case there's no dylib to re-export from. 239 if (APPLE AND LIBCXX_CXX_ABI STREQUAL "libcxxabi" 240 AND NOT DEFINED LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS 241 AND NOT LIBCXX_STATICALLY_LINK_ABI_IN_SHARED_LIBRARY) 242 set(LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS ON) 243 endif() 244 245 if (LIBCXX_OSX_REEXPORT_LIBCXXABI_SYMBOLS) 246 target_link_libraries(cxx_shared PRIVATE 247 "-Wl,-unexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/libc++unexp.exp" 248 "-Wl,-reexported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/libc++abi.exp" 249 "-Wl,-force_symbols_not_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/notweak.exp" 250 "-Wl,-force_symbols_weak_list,${CMAKE_CURRENT_SOURCE_DIR}/../lib/weak.exp") 251 252 target_link_libraries(cxx_shared PRIVATE $<TARGET_NAME_IF_EXISTS:cxxabi-reexports>) 253 endif() 254 255 # Generate a linker script in place of a libc++.so symlink. 256 if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT) 257 include(DefineLinkerScript) 258 define_linker_script(cxx_shared) 259 endif() 260 261 list(APPEND LIBCXX_BUILD_TARGETS "cxx_shared") 262 if(WIN32 AND NOT MINGW AND NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Windows") 263 # Since we most likely do not have a mt.exe replacement, disable the 264 # manifest bundling. This allows a normal cmake invocation to pass which 265 # will attempt to use the manifest tool to generate the bundled manifest 266 set_target_properties(cxx_shared PROPERTIES 267 APPEND_STRING PROPERTY LINK_FLAGS " /MANIFEST:NO") 268 endif() 269endif() 270 271set(CMAKE_STATIC_LIBRARY_PREFIX "lib") 272 273# Build the static library. 274if (LIBCXX_ENABLE_STATIC) 275 add_library(cxx_static STATIC ${exclude_from_all} ${LIBCXX_SOURCES} ${LIBCXX_HEADERS}) 276 target_include_directories(cxx_static PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) 277 target_link_libraries(cxx_static PUBLIC cxx-headers 278 PRIVATE ${LIBCXX_LIBRARIES} 279 PRIVATE libcxx-abi-static) 280 set_target_properties(cxx_static 281 PROPERTIES 282 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 283 LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 284 OUTPUT_NAME "c++" 285 ) 286 cxx_add_common_build_flags(cxx_static) 287 cxx_set_common_defines(cxx_static) 288 289 if (LIBCXX_HERMETIC_STATIC_LIBRARY) 290 # If the hermetic library doesn't define the operator new/delete functions 291 # then its code shouldn't declare them with hidden visibility. They might 292 # actually be provided by a shared library at link time. 293 if (LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS) 294 append_flags_if_supported(CXX_STATIC_LIBRARY_FLAGS -fvisibility-global-new-delete-hidden) 295 endif() 296 target_compile_options(cxx_static PRIVATE ${CXX_STATIC_LIBRARY_FLAGS}) 297 # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in __config_site 298 # too. Define it in the same way here, to avoid redefinition conflicts. 299 target_compile_definitions(cxx_static PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) 300 endif() 301 302 list(APPEND LIBCXX_BUILD_TARGETS "cxx_static") 303 # Attempt to merge the libc++.a archive and the ABI library archive into one. 304 if (LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY) 305 target_link_libraries(cxx_static PRIVATE libcxx-abi-static-objects) 306 endif() 307endif() 308 309# Add a meta-target for both libraries. 310add_custom_target(cxx DEPENDS ${LIBCXX_BUILD_TARGETS}) 311 312set(LIBCXX_EXPERIMENTAL_SOURCES 313 experimental/memory_resource.cpp 314 format.cpp 315 ) 316 317add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES}) 318target_link_libraries(cxx_experimental PUBLIC cxx-headers) 319if (LIBCXX_ENABLE_SHARED) 320 target_link_libraries(cxx_experimental PRIVATE cxx_shared) 321else() 322 target_link_libraries(cxx_experimental PRIVATE cxx_static) 323endif() 324 325if (LIBCXX_HERMETIC_STATIC_LIBRARY) 326 # _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS can be defined in __config_site 327 # too. Define it in the same way here, to avoid redefinition conflicts. 328 target_compile_definitions(cxx_experimental PRIVATE _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS=) 329endif() 330 331set_target_properties(cxx_experimental 332 PROPERTIES 333 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 334 OUTPUT_NAME "c++experimental" 335) 336cxx_add_common_build_flags(cxx_experimental) 337target_compile_options(cxx_experimental PUBLIC -D_LIBCPP_ENABLE_EXPERIMENTAL) 338 339 340if (LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY) 341 set(LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES 342 "${CMAKE_CURRENT_SOURCE_DIR}/../test/support/external_threads.cpp") 343 344 if (LIBCXX_ENABLE_SHARED) 345 add_library(cxx_external_threads SHARED ${LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES}) 346 else() 347 add_library(cxx_external_threads STATIC ${LIBCXX_EXTERNAL_THREADING_SUPPORT_SOURCES}) 348 endif() 349 350 set_target_properties(cxx_external_threads 351 PROPERTIES 352 LINK_FLAGS "${LIBCXX_LINK_FLAGS}" 353 COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}" 354 OUTPUT_NAME "c++external_threads" 355 ) 356 357 target_link_libraries(cxx_external_threads PRIVATE cxx-headers) 358endif() 359 360if (LIBCXX_INSTALL_SHARED_LIBRARY) 361 install(TARGETS cxx_shared 362 ARCHIVE DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 363 LIBRARY DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 364 RUNTIME DESTINATION ${LIBCXX_INSTALL_RUNTIME_DIR} COMPONENT cxx) 365endif() 366 367if (LIBCXX_INSTALL_STATIC_LIBRARY) 368 install(TARGETS cxx_static 369 ARCHIVE DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 370 LIBRARY DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 371 RUNTIME DESTINATION ${LIBCXX_INSTALL_RUNTIME_DIR} COMPONENT cxx) 372endif() 373 374if (LIBCXX_INSTALL_LIBRARY) 375 install(TARGETS cxx_experimental 376 LIBRARY DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 377 ARCHIVE DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} COMPONENT cxx 378 RUNTIME DESTINATION ${LIBCXX_INSTALL_RUNTIME_DIR} COMPONENT cxx) 379endif() 380 381# NOTE: This install command must go after the cxx install command otherwise 382# it will not be executed after the library symlinks are installed. 383if (LIBCXX_ENABLE_SHARED AND LIBCXX_ENABLE_ABI_LINKER_SCRIPT) 384 install(FILES "$<TARGET_LINKER_FILE:cxx_shared>" 385 DESTINATION ${LIBCXX_INSTALL_LIBRARY_DIR} 386 COMPONENT libcxx) 387endif() 388 389if (NOT CMAKE_CONFIGURATION_TYPES) 390 if(LIBCXX_INSTALL_LIBRARY) 391 set(lib_install_target "cxx;cxx_experimental") 392 endif() 393 if(LIBCXX_INSTALL_HEADERS) 394 set(header_install_target install-cxx-headers) 395 endif() 396 if (LIBCXX_ENABLE_PARALLEL_ALGORITHMS) 397 set(pstl_install_target install-pstl) 398 endif() 399 add_custom_target(install-cxx 400 DEPENDS ${lib_install_target} 401 cxx_experimental 402 ${header_install_target} 403 ${pstl_install_target} 404 COMMAND "${CMAKE_COMMAND}" 405 -DCMAKE_INSTALL_COMPONENT=cxx 406 -P "${LIBCXX_BINARY_DIR}/cmake_install.cmake") 407 add_custom_target(install-cxx-stripped 408 DEPENDS ${lib_install_target} 409 cxx_experimental 410 ${header_install_target} 411 ${pstl_install_target} 412 COMMAND "${CMAKE_COMMAND}" 413 -DCMAKE_INSTALL_COMPONENT=cxx 414 -DCMAKE_INSTALL_DO_STRIP=1 415 -P "${LIBCXX_BINARY_DIR}/cmake_install.cmake") 416endif() 417