mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 02:56:06 +00:00

Currently, vendor-specific availability markup is enabled by default. This means that even when building against trunk libc++, the headers will by default prevent you from using some features that were not released in the dylib on your target platform. This is a source of frustration since people building libc++ from sources are usually not trying to use some vendor's released dylib. For that reason, I've been thinking for a long time that availability annotations should be off by default, which is the primary change that this commit enables. In addition, it reworks the implementation to make it easier for new vendors to add availability annotations for their platform, and it refreshes the documentation to reflect the current state of the codebase. Finally, a CMake configuration option is added to control whether availability annotations should be turned on for the flavor of libc++ being created. The intent is for vendors like Apple to turn it on, and for the upstream libc++ to leave it off (the default). Differential Revision: https://reviews.llvm.org/D90843
270 lines
6.1 KiB
CMake
270 lines
6.1 KiB
CMake
set(files
|
|
__availability
|
|
__bit_reference
|
|
__bsd_locale_defaults.h
|
|
__bsd_locale_fallbacks.h
|
|
__debug
|
|
__errc
|
|
__functional_03
|
|
__functional_base
|
|
__functional_base_03
|
|
__hash_table
|
|
__libcpp_version
|
|
__locale
|
|
__mutex_base
|
|
__node_handle
|
|
__nullptr
|
|
__split_buffer
|
|
__sso_allocator
|
|
__std_stream
|
|
__string
|
|
__threading_support
|
|
__tree
|
|
__tuple
|
|
__undef_macros
|
|
algorithm
|
|
any
|
|
array
|
|
atomic
|
|
barrier
|
|
bit
|
|
bitset
|
|
cassert
|
|
ccomplex
|
|
cctype
|
|
cerrno
|
|
cfenv
|
|
cfloat
|
|
charconv
|
|
chrono
|
|
cinttypes
|
|
ciso646
|
|
climits
|
|
clocale
|
|
cmath
|
|
codecvt
|
|
compare
|
|
complex
|
|
complex.h
|
|
concepts
|
|
condition_variable
|
|
csetjmp
|
|
csignal
|
|
cstdarg
|
|
cstdbool
|
|
cstddef
|
|
cstdint
|
|
cstdio
|
|
cstdlib
|
|
cstring
|
|
ctgmath
|
|
ctime
|
|
ctype.h
|
|
cwchar
|
|
cwctype
|
|
deque
|
|
errno.h
|
|
exception
|
|
execution
|
|
experimental/__config
|
|
experimental/__memory
|
|
experimental/algorithm
|
|
experimental/coroutine
|
|
experimental/deque
|
|
experimental/filesystem
|
|
experimental/forward_list
|
|
experimental/functional
|
|
experimental/iterator
|
|
experimental/list
|
|
experimental/map
|
|
experimental/memory_resource
|
|
experimental/propagate_const
|
|
experimental/regex
|
|
experimental/set
|
|
experimental/simd
|
|
experimental/string
|
|
experimental/type_traits
|
|
experimental/unordered_map
|
|
experimental/unordered_set
|
|
experimental/utility
|
|
experimental/vector
|
|
ext/__hash
|
|
ext/hash_map
|
|
ext/hash_set
|
|
fenv.h
|
|
filesystem
|
|
float.h
|
|
forward_list
|
|
fstream
|
|
functional
|
|
future
|
|
initializer_list
|
|
inttypes.h
|
|
iomanip
|
|
ios
|
|
iosfwd
|
|
iostream
|
|
istream
|
|
iterator
|
|
latch
|
|
limits
|
|
limits.h
|
|
list
|
|
locale
|
|
locale.h
|
|
map
|
|
math.h
|
|
memory
|
|
module.modulemap
|
|
mutex
|
|
new
|
|
numbers
|
|
numeric
|
|
optional
|
|
ostream
|
|
queue
|
|
random
|
|
ratio
|
|
regex
|
|
scoped_allocator
|
|
semaphore
|
|
set
|
|
setjmp.h
|
|
shared_mutex
|
|
span
|
|
sstream
|
|
stack
|
|
stdbool.h
|
|
stddef.h
|
|
stdexcept
|
|
stdint.h
|
|
stdio.h
|
|
stdlib.h
|
|
streambuf
|
|
string
|
|
string.h
|
|
string_view
|
|
strstream
|
|
support/android/locale_bionic.h
|
|
support/fuchsia/xlocale.h
|
|
support/ibm/limits.h
|
|
support/ibm/locale_mgmt_aix.h
|
|
support/ibm/support.h
|
|
support/ibm/xlocale.h
|
|
support/musl/xlocale.h
|
|
support/newlib/xlocale.h
|
|
support/solaris/floatingpoint.h
|
|
support/solaris/wchar.h
|
|
support/solaris/xlocale.h
|
|
support/win32/limits_msvc_win32.h
|
|
support/win32/locale_win32.h
|
|
support/xlocale/__nop_locale_mgmt.h
|
|
support/xlocale/__posix_l_fallback.h
|
|
support/xlocale/__strtonum_fallback.h
|
|
system_error
|
|
tgmath.h
|
|
thread
|
|
tuple
|
|
type_traits
|
|
typeindex
|
|
typeinfo
|
|
unordered_map
|
|
unordered_set
|
|
utility
|
|
valarray
|
|
variant
|
|
vector
|
|
version
|
|
wchar.h
|
|
wctype.h
|
|
)
|
|
|
|
configure_file("__config_site.in"
|
|
"${LIBCXX_BINARY_DIR}/__config_site"
|
|
@ONLY)
|
|
|
|
# Generate a custom __config header. The new header is created
|
|
# by prepending __config_site to the current __config header.
|
|
add_custom_command(OUTPUT ${LIBCXX_BINARY_DIR}/__generated_config
|
|
COMMAND ${Python3_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/cat_files.py
|
|
${LIBCXX_BINARY_DIR}/__config_site
|
|
${LIBCXX_SOURCE_DIR}/include/__config
|
|
-o ${LIBCXX_BINARY_DIR}/__generated_config
|
|
DEPENDS ${LIBCXX_SOURCE_DIR}/include/__config
|
|
${LIBCXX_BINARY_DIR}/__config_site
|
|
)
|
|
# Add a target that executes the generation commands.
|
|
add_custom_target(cxx-generated-config ALL
|
|
DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config)
|
|
|
|
if(LIBCXX_HEADER_DIR)
|
|
set(output_dir ${LIBCXX_HEADER_DIR}/include/c++/v1)
|
|
|
|
set(out_files)
|
|
foreach(f ${files})
|
|
set(src ${CMAKE_CURRENT_SOURCE_DIR}/${f})
|
|
set(dst ${output_dir}/${f})
|
|
add_custom_command(OUTPUT ${dst}
|
|
DEPENDS ${src}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
|
COMMENT "Copying CXX header ${f}")
|
|
list(APPEND out_files ${dst})
|
|
endforeach()
|
|
|
|
# Copy the generated header as __config into build directory.
|
|
set(src ${LIBCXX_BINARY_DIR}/__generated_config)
|
|
set(dst ${output_dir}/__config)
|
|
add_custom_command(OUTPUT ${dst}
|
|
DEPENDS ${src} cxx-generated-config
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
|
COMMENT "Copying CXX __config")
|
|
list(APPEND out_files ${dst})
|
|
add_custom_target(generate-cxx-headers ALL DEPENDS ${out_files})
|
|
|
|
add_library(cxx-headers INTERFACE)
|
|
add_dependencies(cxx-headers generate-cxx-headers ${LIBCXX_CXX_ABI_HEADER_TARGET})
|
|
# TODO: Use target_include_directories once we figure out why that breaks the runtimes build
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
|
target_compile_options(cxx-headers INTERFACE /I "${output_dir}")
|
|
else()
|
|
target_compile_options(cxx-headers INTERFACE -I "${output_dir}")
|
|
endif()
|
|
|
|
# Make sure the generated __config_site header is included when we build the library.
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC")
|
|
target_compile_options(cxx-headers INTERFACE /FI "${LIBCXX_BINARY_DIR}/__config_site")
|
|
else()
|
|
target_compile_options(cxx-headers INTERFACE -include "${LIBCXX_BINARY_DIR}/__config_site")
|
|
endif()
|
|
else()
|
|
add_library(cxx-headers INTERFACE)
|
|
endif()
|
|
|
|
if (LIBCXX_INSTALL_HEADERS)
|
|
foreach(file ${files})
|
|
get_filename_component(dir ${file} DIRECTORY)
|
|
install(FILES ${file}
|
|
DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1/${dir}
|
|
COMPONENT cxx-headers
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
|
)
|
|
endforeach()
|
|
|
|
# Install the generated header as __config.
|
|
install(FILES ${LIBCXX_BINARY_DIR}/__generated_config
|
|
DESTINATION ${LIBCXX_INSTALL_HEADER_PREFIX}include/c++/v1
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
|
RENAME __config
|
|
COMPONENT cxx-headers)
|
|
|
|
if (NOT CMAKE_CONFIGURATION_TYPES)
|
|
add_custom_target(install-cxx-headers
|
|
DEPENDS cxx-headers cxx-generated-config
|
|
COMMAND "${CMAKE_COMMAND}"
|
|
-DCMAKE_INSTALL_COMPONENT=cxx-headers
|
|
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
|
# Stripping is a no-op for headers
|
|
add_custom_target(install-cxx-headers-stripped DEPENDS install-cxx-headers)
|
|
endif()
|
|
endif()
|