mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00

Using file(COPY FILE...) has several downsides. Since the file command is only executed at configuration time, any changes to headers made after the initial CMake execution are ignored. This can lead to subtle errors since the just built Clang will be using stale libc++ headers. Furthermore, since the headers are copied prior to executing the build system, this may hide missing dependencies on libc++ from other LLVM components. This changes replaces the use of file(COPY FILE...) command with a custom command and target which addresses all aforementioned issues and matches the implementation already used by other LLVM components that also install headers like Clang builtin headers. Differential Revision: https://reviews.llvm.org/D44773 llvm-svn: 334468
269 lines
5.8 KiB
CMake
269 lines
5.8 KiB
CMake
set(files
|
|
__bit_reference
|
|
__bsd_locale_defaults.h
|
|
__bsd_locale_fallbacks.h
|
|
__debug
|
|
__functional_03
|
|
__functional_base
|
|
__functional_base_03
|
|
__hash_table
|
|
__libcpp_version
|
|
__locale
|
|
__mutex_base
|
|
__nullptr
|
|
__split_buffer
|
|
__sso_allocator
|
|
__std_stream
|
|
__string
|
|
__threading_support
|
|
__tree
|
|
__tuple
|
|
__undef_macros
|
|
algorithm
|
|
any
|
|
array
|
|
atomic
|
|
bitset
|
|
cassert
|
|
ccomplex
|
|
cctype
|
|
cerrno
|
|
cfenv
|
|
cfloat
|
|
chrono
|
|
cinttypes
|
|
ciso646
|
|
climits
|
|
clocale
|
|
cmath
|
|
codecvt
|
|
compare
|
|
complex
|
|
complex.h
|
|
condition_variable
|
|
csetjmp
|
|
csignal
|
|
cstdarg
|
|
cstdbool
|
|
cstddef
|
|
cstdint
|
|
cstdio
|
|
cstdlib
|
|
cstring
|
|
ctgmath
|
|
ctime
|
|
ctype.h
|
|
cwchar
|
|
cwctype
|
|
deque
|
|
errno.h
|
|
exception
|
|
experimental/__config
|
|
experimental/__memory
|
|
experimental/algorithm
|
|
experimental/any
|
|
experimental/chrono
|
|
experimental/coroutine
|
|
experimental/deque
|
|
experimental/dynarray
|
|
experimental/filesystem
|
|
experimental/forward_list
|
|
experimental/functional
|
|
experimental/iterator
|
|
experimental/list
|
|
experimental/map
|
|
experimental/memory_resource
|
|
experimental/numeric
|
|
experimental/optional
|
|
experimental/propagate_const
|
|
experimental/ratio
|
|
experimental/regex
|
|
experimental/set
|
|
experimental/simd
|
|
experimental/string
|
|
experimental/string_view
|
|
experimental/system_error
|
|
experimental/tuple
|
|
experimental/type_traits
|
|
experimental/unordered_map
|
|
experimental/unordered_set
|
|
experimental/utility
|
|
experimental/vector
|
|
ext/__hash
|
|
ext/hash_map
|
|
ext/hash_set
|
|
float.h
|
|
forward_list
|
|
fstream
|
|
functional
|
|
future
|
|
initializer_list
|
|
inttypes.h
|
|
iomanip
|
|
ios
|
|
iosfwd
|
|
iostream
|
|
istream
|
|
iterator
|
|
limits
|
|
limits.h
|
|
list
|
|
locale
|
|
locale.h
|
|
map
|
|
math.h
|
|
memory
|
|
module.modulemap
|
|
mutex
|
|
new
|
|
numeric
|
|
optional
|
|
ostream
|
|
queue
|
|
random
|
|
ratio
|
|
regex
|
|
scoped_allocator
|
|
set
|
|
setjmp.h
|
|
shared_mutex
|
|
sstream
|
|
stack
|
|
stdbool.h
|
|
stddef.h
|
|
stdexcept
|
|
stdint.h
|
|
stdio.h
|
|
stdlib.h
|
|
streambuf
|
|
string
|
|
string.h
|
|
string_view
|
|
strstream
|
|
system_error
|
|
tgmath.h
|
|
thread
|
|
tuple
|
|
type_traits
|
|
typeindex
|
|
typeinfo
|
|
unordered_map
|
|
unordered_set
|
|
utility
|
|
valarray
|
|
variant
|
|
vector
|
|
version
|
|
wchar.h
|
|
wctype.h
|
|
)
|
|
|
|
if(LIBCXX_INSTALL_SUPPORT_HEADERS)
|
|
set(files
|
|
${files}
|
|
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
|
|
support/xlocale/xlocale.h
|
|
)
|
|
endif()
|
|
|
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
|
# 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 ${PYTHON_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)
|
|
set(generated_config_deps cxx-generated-config)
|
|
else()
|
|
set(files
|
|
${files}
|
|
__config
|
|
)
|
|
endif()
|
|
|
|
if(NOT LIBCXX_USING_INSTALLED_LLVM AND LLVM_BINARY_DIR)
|
|
set(output_dir ${LLVM_BINARY_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()
|
|
|
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
|
# 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} ${generated_config_deps}
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
|
|
COMMENT "Copying CXX __config")
|
|
list(APPEND out_files ${dst})
|
|
endif()
|
|
|
|
add_custom_target(cxx-headers ALL DEPENDS ${out_files} ${LIBCXX_CXX_ABI_LIBRARY_HEADERS})
|
|
else()
|
|
add_custom_target(cxx-headers)
|
|
endif()
|
|
set_target_properties(cxx-headers PROPERTIES FOLDER "Misc")
|
|
|
|
if (LIBCXX_INSTALL_HEADERS)
|
|
foreach(file ${files})
|
|
get_filename_component(dir ${file} DIRECTORY)
|
|
install(FILES ${file}
|
|
DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1/${dir}
|
|
COMPONENT cxx-headers
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
|
)
|
|
endforeach()
|
|
|
|
if (LIBCXX_NEEDS_SITE_CONFIG)
|
|
# Install the generated header as __config.
|
|
install(FILES ${LIBCXX_BINARY_DIR}/__generated_config
|
|
DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1
|
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
|
|
RENAME __config
|
|
COMPONENT cxx-headers)
|
|
endif()
|
|
|
|
if (NOT CMAKE_CONFIGURATION_TYPES)
|
|
add_custom_target(install-cxx-headers
|
|
DEPENDS cxx-headers ${generated_config_deps}
|
|
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)
|
|
|
|
add_custom_target(install-libcxx-headers DEPENDS install-cxx-headers)
|
|
add_custom_target(install-libcxx-headers-stripped DEPENDS install-cxx-headers-stripped)
|
|
endif()
|
|
endif()
|