Index: llvm/trunk/cmake/config-ix.cmake =================================================================== --- llvm/trunk/cmake/config-ix.cmake +++ llvm/trunk/cmake/config-ix.cmake @@ -554,6 +554,22 @@ set(LLVM_BINUTILS_INCDIR "" CACHE PATH "PATH to binutils/include containing plugin-api.h for gold plugin.") +if(CMAKE_GENERATOR STREQUAL "Ninja") + include(CMakeNInjaFindMake) + if(CMAKE_MAKE_PROGRAM) + execute_process(COMMAND ${CMAKE_MAKE_PROGRAM} --version + OUTPUT_VARIABLE NINJA_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(NINJA_VERSION ${NINJA_VERSION} CACHE STRING "Ninja version number" FORCE) + endif() +endif() + +if(CMAKE_GENERATOR STREQUAL "Ninja" AND + NINJA_VERSION VERSION_GREATER_EQUAL "1.9.0" AND + CMAKE_HOST_APPLE AND CMAKE_HOST_SYSTEM_VERSION VERSION_GREATER "15.6.0") + set(LLVM_TOUCH_STATIC_LIBRARIES ON) +endif() + if(CMAKE_HOST_APPLE AND APPLE) if(NOT CMAKE_XCRUN) find_program(CMAKE_XCRUN NAMES xcrun) Index: llvm/trunk/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/trunk/cmake/modules/AddLLVM.cmake +++ llvm/trunk/cmake/modules/AddLLVM.cmake @@ -596,6 +596,18 @@ llvm_externalize_debuginfo(${name}) llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS}) endif() + # clang and newer versions of ninja use high-resolutions timestamps, + # but older versions of libtool on Darwin don't, so the archive will + # often get an older timestamp than the last object that was added + # or updated. To fix this, we add a custom command to touch archive + # after it's been built so that ninja won't rebuild it unnecessarily + # the next time it's run. + if(ARG_STATIC AND LLVM_TOUCH_STATIC_LIBRARIES) + add_custom_command(TARGET ${name} + POST_BUILD + COMMAND touch ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + endif() endfunction() function(add_llvm_install_targets target)