[flang] Fix length handling in character kind implicit conversion (#74586)
[llvm-project.git] / libcxx / src / CMakeLists.txt
blobbe0113e6b0a585f31428a8f0755758c634ad0714
1 set(LIBCXX_LIB_CMAKEFILES_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}"  PARENT_SCOPE)
3 # Get sources
4 set(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   )
65 if (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     )
77 endif()
79 if (LIBCXX_ENABLE_RANDOM_DEVICE)
80   list(APPEND LIBCXX_SOURCES
81     random.cpp
82     )
83 endif()
85 if (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     )
95 endif()
97 if(WIN32)
98   list(APPEND LIBCXX_SOURCES
99     support/win32/locale_win32.cpp
100     support/win32/support.cpp
101     )
103   if (NOT LIBCXX_HAS_PTHREAD_API)
104     list(APPEND LIBCXX_SOURCES
105       support/win32/thread_win32.cpp
106       )
107   endif()
108 elseif(ZOS)
109   list(APPEND LIBCXX_SOURCES
110     support/ibm/mbsnrtowcs.cpp
111     support/ibm/wcsnrtombs.cpp
112     support/ibm/xlocale_zos.cpp
113     )
114 endif()
116 if (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()
134 endif()
136 if (LIBCXX_ENABLE_NEW_DELETE_DEFINITIONS)
137   list(APPEND LIBCXX_SOURCES
138     new.cpp
139     )
140 endif()
142 # Add all the headers to the project for IDEs.
143 if (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()
154 endif()
156 if(NOT LIBCXX_INSTALL_LIBRARY)
157   set(exclude_from_all EXCLUDE_FROM_ALL)
158 endif()
160 if (LIBCXX_GENERATE_COVERAGE AND NOT LIBCXX_COVERAGE_LIBRARY)
161   find_compiler_rt_library(profile LIBCXX_COVERAGE_LIBRARY)
162 endif()
163 add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
165 if (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()
189 endif()
191 split_list(LIBCXX_COMPILE_FLAGS)
192 split_list(LIBCXX_LINK_FLAGS)
194 # Build the shared library.
195 if (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)
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()
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()
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()
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")
244     target_link_libraries(cxx_shared PRIVATE $<TARGET_NAME_IF_EXISTS:cxxabi-reexports>)
245   endif()
247   # Generate a linker script in place of a libc++.so symlink.
248   if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
249     set(link_libraries)
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}>")
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()
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()
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()
283 endif()
285 set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
287 # Build the static library.
288 if (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)
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()
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()
320 endif()
322 # Add a meta-target for both libraries.
323 add_custom_target(cxx DEPENDS ${LIBCXX_BUILD_TARGETS})
325 set(LIBCXX_EXPERIMENTAL_SOURCES
326   experimental/keep.cpp
327   )
329 if (LIBCXX_PSTL_CPU_BACKEND STREQUAL "libdispatch")
330   list(APPEND LIBCXX_EXPERIMENTAL_SOURCES
331     pstl/libdispatch.cpp
332     )
333 endif()
335 if (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     )
340 endif()
342 add_library(cxx_experimental STATIC ${LIBCXX_EXPERIMENTAL_SOURCES})
343 target_link_libraries(cxx_experimental PUBLIC cxx-headers)
344 if (LIBCXX_ENABLE_SHARED)
345   target_link_libraries(cxx_experimental PRIVATE cxx_shared)
346 else()
347   target_link_libraries(cxx_experimental PRIVATE cxx_static)
348 endif()
350 if (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=)
354 endif()
356 set_target_properties(cxx_experimental
357   PROPERTIES
358     COMPILE_FLAGS "${LIBCXX_COMPILE_FLAGS}"
359     OUTPUT_NAME   "c++experimental"
361 cxx_add_common_build_flags(cxx_experimental)
362 target_compile_options(cxx_experimental PUBLIC -D_LIBCPP_ENABLE_EXPERIMENTAL)
364 if (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)
369 endif()
371 if (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)
376 endif()
378 if (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)
383 endif()
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.
387 if (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)
391 endif()
393 if (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")
415 endif()