• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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