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