[Cmake-commits] CMake branch, master, updated. v3.15.3-988-gbbf48c4

Kitware Robot kwrobot at kitware.com
Tue Sep 10 10:58:27 EDT 2019


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  bbf48c494ad28d1c8ac5aa6e4cecb35c2cbf1b84 (commit)
       via  ff5028c5318c5d404390d8114d9453fc81fa9a33 (commit)
      from  05d5c66ff853f88e6dbe43bbddd18dd8babaa427 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=bbf48c494ad28d1c8ac5aa6e4cecb35c2cbf1b84
commit bbf48c494ad28d1c8ac5aa6e4cecb35c2cbf1b84
Merge: 05d5c66 ff5028c
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Tue Sep 10 14:54:39 2019 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Tue Sep 10 10:54:55 2019 -0400

    Merge topic 'windows-auto-export-incremental-build'
    
    ff5028c531 Windows: Prevent auto exports to be regenerated on every build
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !3750


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ff5028c5318c5d404390d8114d9453fc81fa9a33
commit ff5028c5318c5d404390d8114d9453fc81fa9a33
Author:     Daniel Eiband <daniel.eiband at brainlab.com>
AuthorDate: Wed Aug 28 13:57:52 2019 +0200
Commit:     Daniel Eiband <daniel.eiband at brainlab.com>
CommitDate: Mon Sep 9 15:43:15 2019 +0200

    Windows: Prevent auto exports to be regenerated on every build
    
    Check modified time stamps of input files against an existing exports file
    before generating the auto exports.
    
    Fixes: #19650

diff --git a/Help/release/dev/windows-auto-export-incremental-build.rst b/Help/release/dev/windows-auto-export-incremental-build.rst
new file mode 100644
index 0000000..3126329
--- /dev/null
+++ b/Help/release/dev/windows-auto-export-incremental-build.rst
@@ -0,0 +1,6 @@
+windows-auto-export-incremental-build
+-------------------------------------
+
+* On Windows, existing auto generated exports are now only updated if the
+  modified time stamp of the exports is not newer than any modified time stamp
+  of the input files.
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index a79a2ff..e6dd99a 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -562,19 +562,36 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
                      "objlistfile [-nm=nm-path]\n";
         return 1;
       }
-      FILE* fout = cmsys::SystemTools::Fopen(args[2].c_str(), "w+");
-      if (!fout) {
-        std::cerr << "could not open output .def file: " << args[2].c_str()
-                  << "\n";
-        return 1;
-      }
       cmsys::ifstream fin(args[3].c_str(), std::ios::in | std::ios::binary);
       if (!fin) {
         std::cerr << "could not open object list file: " << args[3].c_str()
                   << "\n";
         return 1;
       }
-      std::string file;
+      std::vector<std::string> files;
+      {
+        std::string file;
+        cmFileTime outTime;
+        bool outValid = outTime.Load(args[2]);
+        while (cmSystemTools::GetLineFromStream(fin, file)) {
+          files.push_back(file);
+          if (outValid) {
+            cmFileTime inTime;
+            outValid = inTime.Load(file) && inTime.Older(outTime);
+          }
+        }
+        if (outValid) {
+          // The def file already exists and all input files are older than the
+          // existing def file.
+          return 0;
+        }
+      }
+      FILE* fout = cmsys::SystemTools::Fopen(args[2].c_str(), "w+");
+      if (!fout) {
+        std::cerr << "could not open output .def file: " << args[2].c_str()
+                  << "\n";
+        return 1;
+      }
       bindexplib deffile;
       if (args.size() >= 5) {
         auto a = args[4];
@@ -585,7 +602,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args)
           std::cerr << "unknown argument: " << a << "\n";
         }
       }
-      while (cmSystemTools::GetLineFromStream(fin, file)) {
+      for (auto const& file : files) {
         std::string const& ext = cmSystemTools::GetFilenameLastExtension(file);
         if (cmSystemTools::LowerCase(ext) == ".def") {
           if (!deffile.AddDefinitionFile(file.c_str())) {
diff --git a/Tests/RunCMake/AutoExportDll/RunCMakeTest.cmake b/Tests/RunCMake/AutoExportDll/RunCMakeTest.cmake
index 27a609d..6c9be4b 100644
--- a/Tests/RunCMake/AutoExportDll/RunCMakeTest.cmake
+++ b/Tests/RunCMake/AutoExportDll/RunCMakeTest.cmake
@@ -7,9 +7,13 @@ file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
 run_cmake(AutoExport)
 unset(RunCMake_TEST_OPTIONS)
 # don't run this test on Watcom or Borland make as it is not supported
-if("${RunCMake_GENERATOR}" MATCHES "Watcom WMake|Borland Makefiles")
+if(RunCMake_GENERATOR MATCHES "Watcom WMake|Borland Makefiles")
   return()
 endif()
+if(RunCMake_GENERATOR MATCHES "Ninja|Visual Studio" AND
+   CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+  set(EXPORTS TRUE)
+endif()
 # we build debug so the say.exe will be found in Debug/say.exe for
 # Visual Studio generators
 if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
@@ -18,9 +22,36 @@ endif()
 # build AutoExport
 run_cmake_command(AutoExportBuild ${CMAKE_COMMAND} --build
   ${RunCMake_TEST_BINARY_DIR} --config Debug --clean-first)
+# save the current timestamp of exports.def
+if(EXPORTS)
+  set(EXPORTS_DEF "${RunCMake_TEST_BINARY_DIR}/say.dir/${INTDIR}exports.def")
+  if(NOT EXISTS "${EXPORTS_DEF}")
+    set(EXPORTS_DEF
+      "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/say.dir/${INTDIR}exports.def")
+  endif()
+  file(TIMESTAMP "${EXPORTS_DEF}" timestamp)
+  if(NOT timestamp)
+    message(SEND_ERROR "Could not get timestamp for \"${EXPORTS_DEF}\"")
+  endif()
+endif()
 # run the executable that uses symbols from the dll
 if(WIN32)
   set(EXE_EXT ".exe")
 endif()
 run_cmake_command(AutoExportRun
-  ${RunCMake_BINARY_DIR}/AutoExport-build/bin/${INTDIR}say${EXE_EXT})
+  ${RunCMake_TEST_BINARY_DIR}/bin/${INTDIR}say${EXE_EXT})
+# build AutoExport again without modification
+run_cmake_command(AutoExportBuildAgain ${CMAKE_COMMAND} --build
+  ${RunCMake_TEST_BINARY_DIR} --config Debug)
+# compare timestamps of exports.def to make sure it has not been updated
+if(EXPORTS)
+  file(TIMESTAMP "${EXPORTS_DEF}" timestamp_after)
+  if(NOT timestamp_after)
+    message(SEND_ERROR "Could not get timestamp for \"${EXPORTS_DEF}\"")
+  endif()
+  if (timestamp_after STREQUAL timestamp)
+    message(STATUS "AutoExportTimeStamp - PASSED")
+  else()
+    message(SEND_ERROR "\"${EXPORTS_DEF}\" has been updated.")
+  endif()
+endif()
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 8fd5234..c663484 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -543,7 +543,7 @@ set(cpack_tests
 add_RunCMake_test_group(CPack "${cpack_tests}")
 # add a test to make sure symbols are exported from a shared library
 # for MSVC compilers CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS property is used
-add_RunCMake_test(AutoExportDll)
+add_RunCMake_test(AutoExportDll -DCMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID})
 
 add_RunCMake_test(AndroidMK)
 

-----------------------------------------------------------------------

Summary of changes:
 .../dev/windows-auto-export-incremental-build.rst  |  6 ++++
 Source/cmcmd.cxx                                   | 33 +++++++++++++++-----
 Tests/RunCMake/AutoExportDll/RunCMakeTest.cmake    | 35 ++++++++++++++++++++--
 Tests/RunCMake/CMakeLists.txt                      |  2 +-
 4 files changed, 65 insertions(+), 11 deletions(-)
 create mode 100644 Help/release/dev/windows-auto-export-incremental-build.rst


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list