phosek created this revision. phosek added reviewers: EricWF, beanz. Herald added subscribers: cfe-commits, christof, fedor.sergeev, mgorny, srhines.
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. Repository: rCXX libc++ https://reviews.llvm.org/D44773 Files: libcxx/cmake/Modules/HandleLibCXXABI.cmake libcxx/include/CMakeLists.txt libcxx/lib/CMakeLists.txt
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) 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,17 +254,14 @@ 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}" -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(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/cmake/Modules/HandleLibCXXABI.cmake =================================================================== --- libcxx/cmake/Modules/HandleLibCXXABI.cmake +++ libcxx/cmake/Modules/HandleLibCXXABI.cmake @@ -47,20 +47,29 @@ 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} COMPONENT cxx-headers PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) endif() - list(APPEND abilib_headers "${LIBCXX_BINARY_INCLUDE_DIR}/${fpath}") endif() endforeach() if (NOT found)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits