]> granicus.if.org Git - llvm/commitdiff
[cmake] Add custom command to touch archives on Darwin so ninja won't rebuild them.
authorDon Hinton <hintonda@gmail.com>
Tue, 21 May 2019 17:56:45 +0000 (17:56 +0000)
committerDon Hinton <hintonda@gmail.com>
Tue, 21 May 2019 17:56:45 +0000 (17:56 +0000)
Summary:
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 the archive after it's
been built so that ninja won't rebuild it unnecessarily the next time
it's run.

Reviewed By: beanz

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D62172

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361280 91177308-0d34-0410-b5e6-96231b3b80d8

cmake/config-ix.cmake
cmake/modules/AddLLVM.cmake

index 66c7382fafcaecd23ce0e57e47ffce405b92464b..7b61f9de13088f8c626152950c906932dd41ff71 100644 (file)
@@ -554,6 +554,22 @@ find_program(GOLD_EXECUTABLE NAMES ${LLVM_DEFAULT_TARGET_TRIPLE}-ld.gold ld.gold
 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 3f84802c67f05c6a262c9c33b701b5e7fbdf788f..4151275473bb7baeb819be115ee81bd596fedc10 100644 (file)
@@ -596,6 +596,18 @@ function(llvm_add_library name)
     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)