Index: libcxx/cmake/Modules/HandleLibCXXABI.cmake =================================================================== --- libcxx/cmake/Modules/HandleLibCXXABI.cmake +++ libcxx/cmake/Modules/HandleLibCXXABI.cmake @@ -47,12 +47,22 @@ set(found TRUE) get_filename_component(dstdir ${fpath} PATH) get_filename_component(ifile ${fpath} NAME) - file(COPY "${incpath}/${fpath}" - DESTINATION "${LIBCXX_BINARY_INCLUDE_DIR}/${dstdir}" - ) - file(COPY "${incpath}/${fpath}" - DESTINATION "${CMAKE_BINARY_DIR}/include/c++/v1/${dstdir}" - ) + + set(src ${incpath}/${fpath}) + set(dst ${LIBCXX_BINARY_INCLUDE_DIR}/${dstdir}/${fpath}) + add_custom_command(OUTPUT ${dst} + DEPENDS ${src} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} + COMMENT "Copying C++ ABI header ${fpath}...") + list(APPEND abilib_headers "${dst}") + + set(dst "${CMAKE_BINARY_DIR}/include/c++/v1/${dstdir}/${fpath}") + add_custom_command(OUTPUT ${dst} + DEPENDS ${src} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} + COMMENT "Copying C++ ABI header ${fpath}...") + list(APPEND abilib_headers "${dst}") + if (LIBCXX_INSTALL_HEADERS) install(FILES "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}" DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1/${dstdir} @@ -60,7 +70,6 @@ PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) endif() - list(APPEND abilib_headers "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}") endif() endforeach() if (NOT found) Index: libcxx/include/CMakeLists.txt =================================================================== --- libcxx/include/CMakeLists.txt +++ libcxx/include/CMakeLists.txt @@ -1,5 +1,187 @@ -if (NOT LIBCXX_INSTALL_SUPPORT_HEADERS) - set(LIBCXX_SUPPORT_HEADER_PATTERN PATTERN "support" EXCLUDE) +set(files + cfenv + array + sstream + csetjmp + cwchar + algorithm + string_view + cstdint + utility + __split_buffer + ext/hash_map + ext/hash_set + ext/__hash + functional + initializer_list + ciso646 + cstdio + cstdarg + math.h + string + type_traits + __functional_base_03 + iostream + unordered_map + queue + variant + cstring + ratio + cinttypes + system_error + __tree + stdio.h + __locale + __tuple + wchar.h + __functional_03 + __bsd_locale_defaults.h + condition_variable + stdlib.h + cassert + limits + limits.h + module.modulemap + list + cfloat + vector + chrono + __bit_reference + new + typeinfo + any + cerrno + thread + cmath + cctype + memory + scoped_allocator + ios + map + valarray + cstdbool + ccomplex + __hash_table + csignal + clocale + forward_list + __mutex_base + climits + future + tuple + __threading_support + __bsd_locale_fallbacks.h + strstream + locale.h + set + ctime + stdexcept + streambuf + string.h + optional + float.h + wctype.h + complex.h + setjmp.h + __nullptr + inttypes.h + iterator + codecvt + stack + stdint.h + ctype.h + random + cstdlib + istream + numeric + regex + __string + errno.h + cstddef + __functional_base + cwctype + __undef_macros + fstream + tgmath.h + deque + unordered_set + complex + typeindex + mutex + stddef.h + iomanip + iosfwd + ostream + __std_stream + __debug + locale + ctgmath + bitset + __libcpp_version + stdbool.h + __sso_allocator + shared_mutex + atomic + exception + ) + +if(LIBCXX_INSTALL_SUPPORT_HEADERS) + set(files + ${files} + support/solaris/wchar.h + support/solaris/floatingpoint.h + support/solaris/xlocale.h + support/fuchsia/xlocale.h + support/xlocale/__posix_l_fallback.h + support/xlocale/__strtonum_fallback.h + support/xlocale/__nop_locale_mgmt.h + support/xlocale/xlocale.h + support/ibm/locale_mgmt_aix.h + support/ibm/limits.h + support/ibm/support.h + support/ibm/xlocale.h + support/android/locale_bionic.h + support/musl/xlocale.h + support/win32/locale_win32.h + support/win32/limits_msvc_win32.h + support/newlib/xlocale.h + ) +endif() + +if(LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) + set(files + ${files} + experimental/__config + experimental/dynarray + experimental/algorithm + experimental/string_view + experimental/utility + experimental/functional + experimental/string + experimental/type_traits + experimental/propagate_const + experimental/unordered_map + experimental/ratio + experimental/system_error + experimental/filesystem + experimental/__memory + experimental/list + experimental/vector + experimental/chrono + experimental/any + experimental/memory_resource + experimental/map + experimental/forward_list + experimental/tuple + experimental/set + experimental/coroutine + experimental/optional + experimental/iterator + experimental/numeric + experimental/regex + experimental/deque + experimental/unordered_set + ) endif() if (LIBCXX_NEEDS_SITE_CONFIG) @@ -17,39 +199,48 @@ add_custom_target(generate_config_header ALL DEPENDS ${LIBCXX_BINARY_DIR}/__generated_config) set(generated_config_deps generate_config_header) +else() + set(files + ${files} + __config + ) endif() -set(LIBCXX_HEADER_PATTERN - PATTERN "*" - PATTERN "CMakeLists.txt" EXCLUDE - PATTERN ".svn" EXCLUDE - PATTERN "__config_site.in" EXCLUDE - ${LIBCXX_SUPPORT_HEADER_PATTERN} - ) - if(NOT LIBCXX_USING_INSTALLED_LLVM AND LLVM_BINARY_DIR) - file(COPY . - DESTINATION "${LLVM_BINARY_DIR}/include/c++/v1" - FILES_MATCHING - ${LIBCXX_HEADER_PATTERN} - ) + 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 libc++'s ${f}...") + list(APPEND out_files ${dst}) + endforeach() if (LIBCXX_NEEDS_SITE_CONFIG) # Copy the generated header as __config into build directory. - add_custom_command( - TARGET generate_config_header POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy - ${LIBCXX_BINARY_DIR}/__generated_config - ${LLVM_BINARY_DIR}/include/c++/v1/__config) + 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 libc++'s __config") + list(APPEND out_files ${dst}) endif() + + add_custom_target(cxx-headers ALL DEPENDS ${out_files} ${abilib_headers}) +else() + add_custom_target(cxx-headers) endif() +set_target_properties(cxx-headers PROPERTIES FOLDER "Misc") if (LIBCXX_INSTALL_HEADERS) - install(DIRECTORY . + install(FILES ${files} DESTINATION ${LIBCXX_INSTALL_PREFIX}include/c++/v1 COMPONENT cxx-headers - FILES_MATCHING - ${LIBCXX_HEADER_PATTERN} PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) @@ -63,8 +254,6 @@ endif() if (NOT CMAKE_CONFIGURATION_TYPES) - # this target is just needed as a placeholder for the distribution target - add_custom_target(cxx-headers) add_custom_target(install-cxx-headers DEPENDS cxx-headers ${generated_config_deps} COMMAND "${CMAKE_COMMAND}" @@ -73,7 +262,6 @@ # Stripping is a no-op for headers add_custom_target(install-cxx-headers-stripped DEPENDS install-cxx-headers) - add_custom_target(libcxx-headers) add_custom_target(install-libcxx-headers DEPENDS install-cxx-headers) add_custom_target(install-libcxx-headers-stripped DEPENDS install-cxx-headers-stripped) endif() Index: libcxx/lib/CMakeLists.txt =================================================================== --- libcxx/lib/CMakeLists.txt +++ libcxx/lib/CMakeLists.txt @@ -283,7 +283,8 @@ endif() # Add a meta-target for both libraries. -add_custom_target(cxx DEPENDS ${LIBCXX_TARGETS} ${generated_config_deps}) +add_custom_target(cxx DEPENDS ${LIBCXX_TARGETS}) +add_dependencies(cxx cxx-headers) if (LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY) file(GLOB LIBCXX_EXPERIMENTAL_SOURCES ../src/experimental/*.cpp)