[Cmake-commits] CMake branch, master, updated. v3.8.0-878-gaaeb01e

Kitware Robot kwrobot at kitware.com
Mon Apr 24 09:35:05 EDT 2017


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  aaeb01ef9bfa600e072be79792be53186c395a8c (commit)
       via  1e31359565ddfb3d2f5ec13d5aa48467c4ec5a77 (commit)
       via  305e628284fc647087cc8b1e1d7074f826358de6 (commit)
       via  fa338c97d7e1cd320f79a6eed3b7913fd88ee890 (commit)
       via  d286d24af3eeb0e8726bb175cde342f496d40a3f (commit)
       via  1b4d2c741ac2006ba2ff17758c82254f6cac01f2 (commit)
       via  cda401fec495c0d086af3c6bb2b169bd95842ec0 (commit)
       via  1a2ede17643e7696aaad0dc2d6027f2049d4e06e (commit)
       via  d96e5d9a19d613de108ab399663f76a8dd964172 (commit)
       via  664591ce59792f6508d6376aca916ab0f02d213f (commit)
       via  adf60b28384025d5b83c2df5a66f2190753e2695 (commit)
       via  01c5bb9551ff0322f2cb4d5439a2ab9a94c87815 (commit)
       via  7f947b602f00ea94161c98b2887479e445d9bc92 (commit)
       via  e9827eba686c431e393cea6dcd71fe25f1eda98f (commit)
       via  b57b7d8e55f5380a70c98dd5feeb01c40325f403 (commit)
       via  73020305afea789519b42ae59a5940e1dbc26e1a (commit)
       via  b432e933cb0b2b162149b7e3aeb6a37b00e78d5f (commit)
       via  012972a926713cdf235c1c24d7b9059c3179855f (commit)
       via  b26577c92ae59fa23be49bcaa3404efe36646e1a (commit)
      from  8b0016ab658e2b96211c33055b8cf38b6d4a6d94 (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=aaeb01ef9bfa600e072be79792be53186c395a8c
commit aaeb01ef9bfa600e072be79792be53186c395a8c
Merge: 1e31359 cda401f
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Apr 24 13:33:59 2017 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Apr 24 09:34:03 2017 -0400

    Merge topic 'fix-test-all-find-modules'
    
    cda401fe Tests: Simplify CMakeOnly.AllFindModules policy settings
    1a2ede17 Tests: Fix FindModulesExecuteAll when KDE4 is installed
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !736


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1e31359565ddfb3d2f5ec13d5aa48467c4ec5a77
commit 1e31359565ddfb3d2f5ec13d5aa48467c4ec5a77
Merge: 305e628 d286d24
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Apr 24 13:33:27 2017 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Apr 24 09:33:31 2017 -0400

    Merge topic 'source_group-TREE-alt-root'
    
    d286d24a Merge branch 'backport-source_group-TREE-alt-root' into source_group-TREE-alt-root
    1b4d2c74 source_group: Fix TREE with root that is not current source dir
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !731


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=305e628284fc647087cc8b1e1d7074f826358de6
commit 305e628284fc647087cc8b1e1d7074f826358de6
Merge: fa338c9 d96e5d9
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Apr 24 13:31:44 2017 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Apr 24 09:31:49 2017 -0400

    Merge topic 'loosen-object-deps'
    
    d96e5d9a Tests: use BYPRODUCTS in the CustomCommandWorkingDirectory test
    664591ce RunCMake.Ninja: add a test for assumed sources
    adf60b28 ninja: break unnecessary target dependencies
    01c5bb95 RunCMake.Ninja: support passing arguments when running ninja
    7f947b60 ninja: remove duplicate order-only dependencies
    e9827eba ninja: describe the intermediate order depends target better
    b57b7d8e Ninja: Order Fortran dyndep file generation explicitly
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !430


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fa338c97d7e1cd320f79a6eed3b7913fd88ee890
commit fa338c97d7e1cd320f79a6eed3b7913fd88ee890
Merge: 8b0016a 7302030
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon Apr 24 13:27:43 2017 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon Apr 24 09:27:48 2017 -0400

    Merge topic 'clang-tidy'
    
    73020305 clang-tidy: avoid copy
    b432e933 clang-tidy: use .empty() to check emptyness
    012972a9 clang-tidy: remove reduntant .data() calls
    b26577c9 clang-tidy: remove else after break and continue
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !734


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d286d24af3eeb0e8726bb175cde342f496d40a3f
commit d286d24af3eeb0e8726bb175cde342f496d40a3f
Merge: 294cf94 1b4d2c7
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Apr 21 15:36:17 2017 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Apr 21 15:36:17 2017 -0400

    Merge branch 'backport-source_group-TREE-alt-root' into source_group-TREE-alt-root

diff --cc Source/cmSourceGroupCommand.cxx
index 631f2a6,23048bf..f54d777
--- a/Source/cmSourceGroupCommand.cxx
+++ b/Source/cmSourceGroupCommand.cxx
@@@ -2,9 -2,10 +2,11 @@@
     file Copyright.txt or https://cmake.org/licensing for details.  */
  #include "cmSourceGroupCommand.h"
  
+ #include <algorithm>
+ #include <iterator>
  #include <set>
  #include <sstream>
 +#include <stddef.h>
  
  #include "cmMakefile.h"
  #include "cmSourceGroup.h"

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1b4d2c741ac2006ba2ff17758c82254f6cac01f2
commit 1b4d2c741ac2006ba2ff17758c82254f6cac01f2
Author:     Mateusz Janek <stryku2393 at gmail.com>
AuthorDate: Thu Apr 20 21:45:28 2017 +0200
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Apr 21 15:31:02 2017 -0400

    source_group: Fix TREE with root that is not current source dir
    
    Also raise an error if files are given that are not below the root.
    
    Fixes: #16807

diff --git a/Source/cmSourceGroupCommand.cxx b/Source/cmSourceGroupCommand.cxx
index 5555199..23048bf 100644
--- a/Source/cmSourceGroupCommand.cxx
+++ b/Source/cmSourceGroupCommand.cxx
@@ -2,6 +2,9 @@
    file Copyright.txt or https://cmake.org/licensing for details.  */
 #include "cmSourceGroupCommand.h"
 
+#include <algorithm>
+#include <iterator>
+#include <set>
 #include <sstream>
 
 #include "cmMakefile.h"
@@ -34,21 +37,31 @@ std::string getFullFilePath(const std::string& currentPath,
 }
 
 std::set<std::string> getSourceGroupFilesPaths(
-  const std::string& currentPath, const std::string& root,
-  const std::vector<std::string>& files)
+  const std::string& root, const std::vector<std::string>& files)
 {
   std::set<std::string> ret;
   const std::string::size_type rootLength = root.length();
 
   for (size_t i = 0; i < files.size(); ++i) {
-    const std::string fullPath = getFullFilePath(currentPath, files[i]);
-
-    ret.insert(fullPath.substr(rootLength + 1)); // +1 to also omnit last '/'
+    ret.insert(files[i].substr(rootLength + 1)); // +1 to also omnit last '/'
   }
 
   return ret;
 }
 
+bool rootIsPrefix(const std::string& root,
+                  const std::vector<std::string>& files, std::string& error)
+{
+  for (size_t i = 0; i < files.size(); ++i) {
+    if (!cmSystemTools::StringStartsWith(files[i], root.c_str())) {
+      error = "ROOT: " + root + " is not a prefix of file: " + files[i];
+      return false;
+    }
+  }
+
+  return true;
+}
+
 cmSourceGroup* addSourceGroup(const std::vector<std::string>& tokenizedPath,
                               cmMakefile& makefile)
 {
@@ -66,7 +79,22 @@ cmSourceGroup* addSourceGroup(const std::vector<std::string>& tokenizedPath,
   return sg;
 }
 
-bool addFilesToItsSourceGroups(const std::set<std::string>& sgFilesPaths,
+std::string prepareFilePathForTree(const std::string& path)
+{
+  return cmSystemTools::CollapseFullPath(path);
+}
+
+std::vector<std::string> prepareFilesPathsForTree(
+  std::vector<std::string>::const_iterator begin,
+  std::vector<std::string>::const_iterator end)
+{
+  std::vector<std::string> prepared(std::distance(begin, end));
+  std::transform(begin, end, prepared.begin(), prepareFilePathForTree);
+  return prepared;
+}
+
+bool addFilesToItsSourceGroups(const std::string& root,
+                               const std::set<std::string>& sgFilesPaths,
                                const std::string& prefix, cmMakefile& makefile,
                                std::string& errorMsg)
 {
@@ -91,8 +119,7 @@ bool addFilesToItsSourceGroups(const std::set<std::string>& sgFilesPaths,
         errorMsg = "Could not create source group for file: " + *it;
         return false;
       }
-      const std::string fullPath =
-        getFullFilePath(makefile.GetCurrentSourceDirectory(), *it);
+      const std::string fullPath = getFullFilePath(root, *it);
       sg->AddGroupFile(fullPath);
     }
   }
@@ -231,17 +258,18 @@ bool cmSourceGroupCommand::processTree(const std::vector<std::string>& args,
     filesBegin = FilesWithPrefixKeywordIndex + 1;
   }
 
-  const std::vector<std::string> filesVector(args.begin() + filesBegin,
-                                             args.end());
+  const std::vector<std::string> filesVector =
+    prepareFilesPathsForTree(args.begin() + filesBegin, args.end());
 
-  std::set<std::string> sourceGroupPaths = getSourceGroupFilesPaths(
-    this->Makefile->GetCurrentSourceDirectory(), root, filesVector);
+  if (!rootIsPrefix(root, filesVector, errorMsg)) {
+    return false;
+  }
 
-  addFilesToItsSourceGroups(sourceGroupPaths, prefix, *(this->Makefile),
-                            errorMsg);
+  std::set<std::string> sourceGroupPaths =
+    getSourceGroupFilesPaths(root, filesVector);
 
-  if (!errorMsg.empty()) {
-    this->SetError(errorMsg);
+  if (!addFilesToItsSourceGroups(root, sourceGroupPaths, prefix,
+                                 *(this->Makefile), errorMsg)) {
     return false;
   }
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cda401fec495c0d086af3c6bb2b169bd95842ec0
commit cda401fec495c0d086af3c6bb2b169bd95842ec0
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Apr 21 09:25:04 2017 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Apr 21 10:11:49 2017 -0400

    Tests: Simplify CMakeOnly.AllFindModules policy settings

diff --git a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
index 8f842d6..e6c5270 100644
--- a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
+++ b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt
@@ -1,10 +1,6 @@
-cmake_minimum_required (VERSION 2.8)
+cmake_minimum_required(VERSION 2.8.4) # new enough for CMP0017
 project(AllFindModules)
 
-if (POLICY CMP0017)
-  cmake_policy(SET CMP0017 NEW)
-endif ()
-
 # Avoid ctest truncation of output
 message(STATUS "CTEST_FULL_OUTPUT")
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=1a2ede17643e7696aaad0dc2d6027f2049d4e06e
commit 1a2ede17643e7696aaad0dc2d6027f2049d4e06e
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Fri Apr 21 09:23:11 2017 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri Apr 21 10:11:10 2017 -0400

    Tests: Fix FindModulesExecuteAll when KDE4 is installed
    
    Set `CMP0017` to `NEW` so that when FindKDE4 sets `CMAKE_MODULE_PATH` it
    does not break internal dependencies of other find modules.
    
    Fixes: #16823

diff --git a/Tests/FindModulesExecuteAll/CMakeLists.txt b/Tests/FindModulesExecuteAll/CMakeLists.txt
index 21b9d38..4893bb3 100644
--- a/Tests/FindModulesExecuteAll/CMakeLists.txt
+++ b/Tests/FindModulesExecuteAll/CMakeLists.txt
@@ -6,8 +6,8 @@
 #
 # I guess more things could be added, like checking whether variables are
 # defined after running the modules (e.g. FOO_FOUND etc.).
+cmake_minimum_required(VERSION 2.8.4) # new enough for CMP0017
 project(FindModulesExecuteAll)
-cmake_minimum_required(VERSION 2.7)
 
 file(GLOB all_modules "${CMAKE_CURRENT_SOURCE_DIR}/../../Modules/Find*cmake")
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d96e5d9a19d613de108ab399663f76a8dd964172
commit d96e5d9a19d613de108ab399663f76a8dd964172
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Tue Apr 18 15:12:32 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:40 2017 -0400

    Tests: use BYPRODUCTS in the CustomCommandWorkingDirectory test
    
    This was inadvertently testing the assumed sources behavior in Ninja (no
    other test seems to exercise it). There is now a test explicitly testing
    it in `RunCMake.Ninja`, so fix this test to work properly regardless of
    the assumed sources behavior.

diff --git a/Help/release/dev/ninja-loosen-object-deps.rst b/Help/release/dev/ninja-loosen-object-deps.rst
new file mode 100644
index 0000000..c47fb93
--- /dev/null
+++ b/Help/release/dev/ninja-loosen-object-deps.rst
@@ -0,0 +1,8 @@
+ninja-loosen-object-deps
+------------------------
+
+* The :generator:`Ninja` generator has loosened dependencies on object
+  compilation to depend on the custom targets and commands of dependent
+  libraries instead of the libraries themselves. This helps projects with deep
+  dependency graphs to be blocked only on their link steps at the deeper
+  levels rather than also blocking object compilation on dependent link steps.
diff --git a/Tests/CustomCommandWorkingDirectory/CMakeLists.txt b/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
index f917cd7..4975feb 100644
--- a/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
+++ b/Tests/CustomCommandWorkingDirectory/CMakeLists.txt
@@ -19,6 +19,7 @@ add_executable(working "${TestWorkingDir_BINARY_DIR}/working.c"
 add_custom_target(
   Custom ALL
   COMMAND "${CMAKE_COMMAND}" -E copy_if_different ./customTarget.c "${TestWorkingDir_BINARY_DIR}/customTarget.c"
+  BYPRODUCTS "${TestWorkingDir_BINARY_DIR}/customTarget.c"
   WORKING_DIRECTORY  "${TestWorkingDir_SOURCE_DIR}"
 )
 
@@ -36,6 +37,7 @@ add_executable(working2 working2.c ${TestWorkingDir_BINARY_DIR}/customTarget2.c)
 add_custom_target(
   Custom2 ALL
   COMMAND "${CMAKE_COMMAND}" -E copy_if_different ${TestWorkingDir_SOURCE_DIR}/customTarget.c ../customTarget2.c
+  BYPRODUCTS "${TestWorkingDir_BINARY_DIR}/customTarget2.c"
   WORKING_DIRECTORY work/ # Relative to build tree, trailing slash
 )
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=664591ce59792f6508d6376aca916ab0f02d213f
commit 664591ce59792f6508d6376aca916ab0f02d213f
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Tue Apr 18 15:05:35 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:40 2017 -0400

    RunCMake.Ninja: add a test for assumed sources
    
    This is a dark corner of the Ninja generator. It should be fixed in the
    future, but add a test which shows its behaviors.

diff --git a/Tests/RunCMake/Ninja/AssumedSources.cmake b/Tests/RunCMake/Ninja/AssumedSources.cmake
new file mode 100644
index 0000000..5fb0219
--- /dev/null
+++ b/Tests/RunCMake/Ninja/AssumedSources.cmake
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.8)
+project(AssumedSources)
+
+set_source_files_properties(
+  "${CMAKE_CURRENT_BINARY_DIR}/target.c"
+  "${CMAKE_CURRENT_BINARY_DIR}/target-no-depends.c"
+  PROPERTIES GENERATED 1)
+
+add_executable(working
+  "${CMAKE_CURRENT_BINARY_DIR}/target.c"
+  "${CMAKE_CURRENT_BINARY_DIR}/target-no-depends.c")
+
+add_custom_target(
+  gen-target.c ALL
+  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/dep.c" "${CMAKE_CURRENT_BINARY_DIR}/target.c")
+add_custom_target(
+  gen-target-no-depends.c ALL
+  COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/dep.c" "${CMAKE_CURRENT_BINARY_DIR}/target-no-depends.c")
+
+add_dependencies(working gen-target.c)
diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
index fb7798d..8c3bc20 100644
--- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
@@ -112,6 +112,22 @@ function (run_LooseObjectDepends)
 endfunction ()
 run_LooseObjectDepends()
 
+function (run_AssumedSources)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AssumedSources-build)
+  run_cmake(AssumedSources)
+  run_ninja("${RunCMake_TEST_BINARY_DIR}" "target.c")
+  if (NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/target.c")
+    message(FATAL_ERROR
+      "Dependencies for an assumed source did not hook up properly for 'target.c'.")
+  endif ()
+  run_ninja("${RunCMake_TEST_BINARY_DIR}" "target-no-depends.c")
+  if (EXISTS "${RunCMake_TEST_BINARY_DIR}/target-no-depends.c")
+    message(FATAL_ERROR
+      "Dependencies for an assumed source were magically hooked up for 'target-no-depends.c'.")
+  endif ()
+endfunction ()
+run_AssumedSources()
+
 function(sleep delay)
   execute_process(
     COMMAND ${CMAKE_COMMAND} -E sleep ${delay}

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=adf60b28384025d5b83c2df5a66f2190753e2695
commit adf60b28384025d5b83c2df5a66f2190753e2695
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Mon Apr 17 16:24:44 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:40 2017 -0400

    ninja: break unnecessary target dependencies
    
    Previously, given two libraries, X and Y where X depends on Y, all
    object compilations of X would require the Y library to have been linked
    before being compiled. This is not necessary and can instead be loosened
    such that object compilations of X only depend on the order-only
    dependencies of Y to be completed. This is to ensure that generated
    sources, headers, custom commands, etc. are completed before X starts to
    compile its objects.
    
    This should help build performance in projects with many libraries which
    cause a deep library dependency chain. Previously, a library at the
    bottom would not start compilation until after all other libraries
    completed, but now only its link step needs to wait and its compilation
    jobs can be run in parallel with other tasks.
    
    Fixes: #15555

diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index e61cbd9..1a77d7c 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -966,8 +966,14 @@ void cmGlobalNinjaGenerator::WriteAssumedSourceDependencies()
   }
 }
 
+std::string OrderDependsTargetForTarget(cmGeneratorTarget const* target)
+{
+  return "cmake_object_order_depends_target_" + target->GetName();
+}
+
 void cmGlobalNinjaGenerator::AppendTargetOutputs(
-  cmGeneratorTarget const* target, cmNinjaDeps& outputs)
+  cmGeneratorTarget const* target, cmNinjaDeps& outputs,
+  cmNinjaTargetDepends depends)
 {
   std::string configName =
     target->Target->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE");
@@ -979,15 +985,27 @@ void cmGlobalNinjaGenerator::AppendTargetOutputs(
   bool realname = target->IsFrameworkOnApple();
 
   switch (target->GetType()) {
-    case cmStateEnums::EXECUTABLE:
     case cmStateEnums::SHARED_LIBRARY:
     case cmStateEnums::STATIC_LIBRARY:
     case cmStateEnums::MODULE_LIBRARY: {
+      if (depends == DependOnTargetOrdering) {
+        outputs.push_back(OrderDependsTargetForTarget(target));
+        break;
+      }
+    }
+    // FALLTHROUGH
+    case cmStateEnums::EXECUTABLE: {
       outputs.push_back(this->ConvertToNinjaPath(target->GetFullPath(
         configName, cmStateEnums::RuntimeBinaryArtifact, realname)));
       break;
     }
-    case cmStateEnums::OBJECT_LIBRARY:
+    case cmStateEnums::OBJECT_LIBRARY: {
+      if (depends == DependOnTargetOrdering) {
+        outputs.push_back(OrderDependsTargetForTarget(target));
+        break;
+      }
+    }
+    // FALLTHROUGH
     case cmStateEnums::GLOBAL_TARGET:
     case cmStateEnums::UTILITY: {
       std::string path =
@@ -1003,7 +1021,8 @@ void cmGlobalNinjaGenerator::AppendTargetOutputs(
 }
 
 void cmGlobalNinjaGenerator::AppendTargetDepends(
-  cmGeneratorTarget const* target, cmNinjaDeps& outputs)
+  cmGeneratorTarget const* target, cmNinjaDeps& outputs,
+  cmNinjaTargetDepends depends)
 {
   if (target->GetType() == cmStateEnums::GLOBAL_TARGET) {
     // These depend only on other CMake-provided targets, e.g. "all".
@@ -1023,7 +1042,7 @@ void cmGlobalNinjaGenerator::AppendTargetDepends(
       if ((*i)->GetType() == cmStateEnums::INTERFACE_LIBRARY) {
         continue;
       }
-      this->AppendTargetOutputs(*i, outs);
+      this->AppendTargetOutputs(*i, outs, depends);
     }
     std::sort(outs.begin(), outs.end());
     outputs.insert(outputs.end(), outs.begin(), outs.end());
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index e06afb0..b1d6155 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -316,10 +316,12 @@ public:
     ASD.insert(deps.begin(), deps.end());
   }
 
-  void AppendTargetOutputs(cmGeneratorTarget const* target,
-                           cmNinjaDeps& outputs);
-  void AppendTargetDepends(cmGeneratorTarget const* target,
-                           cmNinjaDeps& outputs);
+  void AppendTargetOutputs(
+    cmGeneratorTarget const* target, cmNinjaDeps& outputs,
+    cmNinjaTargetDepends depends = DependOnTargetArtifact);
+  void AppendTargetDepends(
+    cmGeneratorTarget const* target, cmNinjaDeps& outputs,
+    cmNinjaTargetDepends depends = DependOnTargetArtifact);
   void AppendTargetDependsClosure(cmGeneratorTarget const* target,
                                   cmNinjaDeps& outputs);
   void AddDependencyToAll(cmGeneratorTarget* target);
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index c2d9d57..9d88e35 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -278,9 +278,11 @@ void cmLocalNinjaGenerator::AppendTargetOutputs(cmGeneratorTarget* target,
 }
 
 void cmLocalNinjaGenerator::AppendTargetDepends(cmGeneratorTarget* target,
-                                                cmNinjaDeps& outputs)
+                                                cmNinjaDeps& outputs,
+                                                cmNinjaTargetDepends depends)
 {
-  this->GetGlobalNinjaGenerator()->AppendTargetDepends(target, outputs);
+  this->GetGlobalNinjaGenerator()->AppendTargetDepends(target, outputs,
+                                                       depends);
 }
 
 void cmLocalNinjaGenerator::AppendCustomCommandDeps(
diff --git a/Source/cmLocalNinjaGenerator.h b/Source/cmLocalNinjaGenerator.h
index fda4578..a45e018 100644
--- a/Source/cmLocalNinjaGenerator.h
+++ b/Source/cmLocalNinjaGenerator.h
@@ -63,7 +63,9 @@ public:
   std::string BuildCommandLine(const std::vector<std::string>& cmdLines);
 
   void AppendTargetOutputs(cmGeneratorTarget* target, cmNinjaDeps& outputs);
-  void AppendTargetDepends(cmGeneratorTarget* target, cmNinjaDeps& outputs);
+  void AppendTargetDepends(
+    cmGeneratorTarget* target, cmNinjaDeps& outputs,
+    cmNinjaTargetDepends depends = DependOnTargetArtifact);
 
   void AddCustomCommandTarget(cmCustomCommand const* cc,
                               cmGeneratorTarget* target);
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index daad3fc..2c14a3e 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -715,8 +715,8 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
   }
 
   cmNinjaDeps orderOnlyDeps;
-  this->GetLocalGenerator()->AppendTargetDepends(this->GeneratorTarget,
-                                                 orderOnlyDeps);
+  this->GetLocalGenerator()->AppendTargetDepends(
+    this->GeneratorTarget, orderOnlyDeps, DependOnTargetOrdering);
 
   // Add order-only dependencies on other files associated with the target.
   orderOnlyDeps.insert(orderOnlyDeps.end(), this->ExtraFiles.begin(),
@@ -741,7 +741,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
   orderOnlyDeps.erase(std::unique(orderOnlyDeps.begin(), orderOnlyDeps.end()),
                       orderOnlyDeps.end());
 
-  if (!orderOnlyDeps.empty()) {
+  {
     cmNinjaDeps orderOnlyTarget;
     orderOnlyTarget.push_back(this->OrderDependsTargetForTarget());
     this->GetGlobalGenerator()->WritePhonyBuild(
@@ -754,7 +754,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
   for (std::vector<cmSourceFile const*>::const_iterator si =
          objectSources.begin();
        si != objectSources.end(); ++si) {
-    this->WriteObjectBuildStatement(*si, !orderOnlyDeps.empty());
+    this->WriteObjectBuildStatement(*si);
   }
 
   if (!this->DDIFiles.empty()) {
@@ -779,8 +779,8 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
     // our dependencies produces them.  Fixing this will require
     // refactoring the Ninja generator to generate targets in
     // dependency order so that we can collect the needed information.
-    this->GetLocalGenerator()->AppendTargetDepends(this->GeneratorTarget,
-                                                   ddOrderOnlyDeps);
+    this->GetLocalGenerator()->AppendTargetDepends(
+      this->GeneratorTarget, ddOrderOnlyDeps, DependOnTargetArtifact);
 
     this->GetGlobalGenerator()->WriteBuild(
       this->GetBuildFileStream(), ddComment, ddRule, ddOutputs, ddImplicitOuts,
@@ -791,7 +791,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
 }
 
 void cmNinjaTargetGenerator::WriteObjectBuildStatement(
-  cmSourceFile const* source, bool writeOrderDependsTargetForTarget)
+  cmSourceFile const* source)
 {
   std::string const language = source->GetLanguage();
   std::string const sourceFileName =
@@ -842,9 +842,7 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
   }
 
   cmNinjaDeps orderOnlyDeps;
-  if (writeOrderDependsTargetForTarget) {
-    orderOnlyDeps.push_back(this->OrderDependsTargetForTarget());
-  }
+  orderOnlyDeps.push_back(this->OrderDependsTargetForTarget());
 
   // If the source file is GENERATED and does not have a custom command
   // (either attached to this source file or another one), assume that one of
diff --git a/Source/cmNinjaTargetGenerator.h b/Source/cmNinjaTargetGenerator.h
index 9ce8651..5eb7a9a 100644
--- a/Source/cmNinjaTargetGenerator.h
+++ b/Source/cmNinjaTargetGenerator.h
@@ -119,8 +119,7 @@ protected:
   void WriteLanguageRules(const std::string& language);
   void WriteCompileRule(const std::string& language);
   void WriteObjectBuildStatements();
-  void WriteObjectBuildStatement(cmSourceFile const* source,
-                                 bool writeOrderDependsTargetForTarget);
+  void WriteObjectBuildStatement(cmSourceFile const* source);
   void WriteTargetDependInfo(std::string const& lang);
 
   void ExportObjectCompileCommand(
diff --git a/Source/cmNinjaTypes.h b/Source/cmNinjaTypes.h
index b4af70e..ec435d9 100644
--- a/Source/cmNinjaTypes.h
+++ b/Source/cmNinjaTypes.h
@@ -9,6 +9,12 @@
 #include <string>
 #include <vector>
 
+enum cmNinjaTargetDepends
+{
+  DependOnTargetArtifact,
+  DependOnTargetOrdering
+};
+
 typedef std::vector<std::string> cmNinjaDeps;
 typedef std::map<std::string, std::string> cmNinjaVars;
 
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 32c4be8..21e6259 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -119,6 +119,10 @@ if(CMAKE_GENERATOR MATCHES "Make")
   add_RunCMake_test(Make)
 endif()
 if(CMAKE_GENERATOR STREQUAL "Ninja")
+  set(Ninja_ARGS
+    -DCMAKE_C_OUTPUT_EXTENSION=${CMAKE_C_OUTPUT_EXTENSION}
+    -DCMAKE_SHARED_LIBRARY_PREFIX=${CMAKE_SHARED_LIBRARY_PREFIX}
+    -DCMAKE_SHARED_LIBRARY_SUFFIX=${CMAKE_SHARED_LIBRARY_SUFFIX})
   add_RunCMake_test(Ninja)
 endif()
 add_RunCMake_test(CTest)
diff --git a/Tests/RunCMake/Ninja/LooseObjectDepends.cmake b/Tests/RunCMake/Ninja/LooseObjectDepends.cmake
new file mode 100644
index 0000000..360c7ba
--- /dev/null
+++ b/Tests/RunCMake/Ninja/LooseObjectDepends.cmake
@@ -0,0 +1,26 @@
+cmake_minimum_required(VERSION 3.8)
+project(LooseObjectDepends C)
+
+add_custom_command(
+  OUTPUT  "${CMAKE_CURRENT_BINARY_DIR}/command.h"
+  COMMAND "${CMAKE_COMMAND}" -E touch
+          "${CMAKE_CURRENT_BINARY_DIR}/command.h"
+          COMMENT "Creating command.h")
+add_custom_target(create-command.h
+  DEPENDS
+    "${CMAKE_CURRENT_BINARY_DIR}/command.h")
+
+add_custom_target(create-target.h
+  BYPRODUCTS  "${CMAKE_CURRENT_BINARY_DIR}/target.h"
+  COMMAND "${CMAKE_COMMAND}" -E touch
+          "${CMAKE_CURRENT_BINARY_DIR}/target.h"
+  COMMENT "Creating target.h")
+
+add_library(dep SHARED dep.c)
+add_dependencies(dep create-command.h create-target.h)
+target_include_directories(dep
+  PUBLIC
+    "${CMAKE_CURRENT_BINARY_DIR}")
+
+add_library(top top.c)
+target_link_libraries(top PRIVATE dep)
diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
index 063a6d1..fb7798d 100644
--- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
@@ -95,6 +95,23 @@ ${ninja_stderr}
   endif()
 endfunction(run_ninja)
 
+function (run_LooseObjectDepends)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/LooseObjectDepends-build)
+  run_cmake(LooseObjectDepends)
+  run_ninja("${RunCMake_TEST_BINARY_DIR}" "CMakeFiles/top.dir/top.c${CMAKE_C_OUTPUT_EXTENSION}")
+  if (EXISTS "${RunCMake_TEST_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}dep${CMAKE_SHARED_LIBRARY_SUFFIX}")
+    message(FATAL_ERROR
+      "The `dep` library was created when requesting an object file to be "
+      "built; this should no longer be necessary.")
+  endif ()
+  if (EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/dep.dir/dep.c${CMAKE_C_OUTPUT_EXTENSION}")
+    message(FATAL_ERROR
+      "The `dep.c` object file was created when requesting an object file to "
+      "be built; this should no longer be necessary.")
+  endif ()
+endfunction ()
+run_LooseObjectDepends()
+
 function(sleep delay)
   execute_process(
     COMMAND ${CMAKE_COMMAND} -E sleep ${delay}
diff --git a/Tests/RunCMake/Ninja/dep.c b/Tests/RunCMake/Ninja/dep.c
new file mode 100644
index 0000000..728f031
--- /dev/null
+++ b/Tests/RunCMake/Ninja/dep.c
@@ -0,0 +1,4 @@
+int dep()
+{
+  return 0;
+}
diff --git a/Tests/RunCMake/Ninja/top.c b/Tests/RunCMake/Ninja/top.c
new file mode 100644
index 0000000..4a88eb2
--- /dev/null
+++ b/Tests/RunCMake/Ninja/top.c
@@ -0,0 +1,7 @@
+#include "command.h"
+#include "target.h"
+
+int top()
+{
+  return 0;
+}

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=01c5bb9551ff0322f2cb4d5439a2ab9a94c87815
commit 01c5bb9551ff0322f2cb4d5439a2ab9a94c87815
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Tue Apr 18 14:52:44 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:02 2017 -0400

    RunCMake.Ninja: support passing arguments when running ninja

diff --git a/Tests/RunCMake/Ninja/RunCMakeTest.cmake b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
index 7b4e51e..063a6d1 100644
--- a/Tests/RunCMake/Ninja/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Ninja/RunCMakeTest.cmake
@@ -73,7 +73,7 @@ run_SubDir()
 
 function(run_ninja dir)
   execute_process(
-    COMMAND "${RunCMake_MAKE_PROGRAM}"
+    COMMAND "${RunCMake_MAKE_PROGRAM}" ${ARGN}
     WORKING_DIRECTORY "${dir}"
     OUTPUT_VARIABLE ninja_stdout
     ERROR_VARIABLE ninja_stderr

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7f947b602f00ea94161c98b2887479e445d9bc92
commit 7f947b602f00ea94161c98b2887479e445d9bc92
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Tue Apr 18 14:11:40 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:02 2017 -0400

    ninja: remove duplicate order-only dependencies

diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 7fbb2fc..daad3fc 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -737,6 +737,10 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
                    std::back_inserter(orderOnlyDeps), MapToNinjaPath());
   }
 
+  std::sort(orderOnlyDeps.begin(), orderOnlyDeps.end());
+  orderOnlyDeps.erase(std::unique(orderOnlyDeps.begin(), orderOnlyDeps.end()),
+                      orderOnlyDeps.end());
+
   if (!orderOnlyDeps.empty()) {
     cmNinjaDeps orderOnlyTarget;
     orderOnlyTarget.push_back(this->OrderDependsTargetForTarget());

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e9827eba686c431e393cea6dcd71fe25f1eda98f
commit e9827eba686c431e393cea6dcd71fe25f1eda98f
Author:     Ben Boeckel <ben.boeckel at kitware.com>
AuthorDate: Tue Jan 31 13:07:24 2017 -0500
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:02 2017 -0400

    ninja: describe the intermediate order depends target better
    
    This is only used for compiled objects, so indicate it as such.

diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index a34ff3f..7fbb2fc 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -117,7 +117,7 @@ bool cmNinjaTargetGenerator::NeedDyndep(std::string const& lang) const
 
 std::string cmNinjaTargetGenerator::OrderDependsTargetForTarget()
 {
-  return "cmake_order_depends_target_" + this->GetTargetName();
+  return "cmake_object_order_depends_target_" + this->GetTargetName();
 }
 
 // TODO: Most of the code is picked up from

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b57b7d8e55f5380a70c98dd5feeb01c40325f403
commit b57b7d8e55f5380a70c98dd5feeb01c40325f403
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Thu Apr 20 15:55:34 2017 -0400
Commit:     Ben Boeckel <ben.boeckel at kitware.com>
CommitDate: Fri Apr 21 08:57:02 2017 -0400

    Ninja: Order Fortran dyndep file generation explicitly
    
    Each target's dyndep file generation depends on loading information
    generated by the same step in its dependencies.  Add an explicit
    ordering dependency to ensure the needed information is available.
    Without the explicit ordering dependency we were abusing the more
    general target ordering rules through the preprocessor rules generating
    the `.ddi` files used as input to dyndep file generation.

diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index b008158..a34ff3f 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -767,6 +767,17 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatements()
 
     ddOutputs.push_back(this->GetDyndepFilePath("Fortran"));
 
+    // Make sure dyndep files for all our dependencies have already
+    // been generated so that the 'FortranModules.json' files they
+    // produced as side-effects are available for us to read.
+    // Ideally we should depend on the 'FortranModules.json' files
+    // from our dependencies directly, but we don't know which of
+    // our dependencies produces them.  Fixing this will require
+    // refactoring the Ninja generator to generate targets in
+    // dependency order so that we can collect the needed information.
+    this->GetLocalGenerator()->AppendTargetDepends(this->GeneratorTarget,
+                                                   ddOrderOnlyDeps);
+
     this->GetGlobalGenerator()->WriteBuild(
       this->GetBuildFileStream(), ddComment, ddRule, ddOutputs, ddImplicitOuts,
       ddExplicitDeps, ddImplicitDeps, ddOrderOnlyDeps, ddVars);

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=73020305afea789519b42ae59a5940e1dbc26e1a
commit 73020305afea789519b42ae59a5940e1dbc26e1a
Author:     Daniel Pfeifer <daniel at pfeifer-mail.de>
AuthorDate: Fri Apr 21 10:42:27 2017 +0200
Commit:     Daniel Pfeifer <daniel at pfeifer-mail.de>
CommitDate: Fri Apr 21 10:50:25 2017 +0200

    clang-tidy: avoid copy

diff --git a/Source/cmFileMonitor.cxx b/Source/cmFileMonitor.cxx
index 9e66035..ed794c3 100644
--- a/Source/cmFileMonitor.cxx
+++ b/Source/cmFileMonitor.cxx
@@ -236,7 +236,7 @@ public:
                 cmFileMonitor::Callback cb)
     : Parent(p)
     , PathSegment(ps)
-    , CbList({ cb })
+    , CbList({ std::move(cb) })
   {
     assert(p);
     assert(!ps.empty());
diff --git a/Source/cmListFileCache.cxx b/Source/cmListFileCache.cxx
index 16297f3..929b1cd 100644
--- a/Source/cmListFileCache.cxx
+++ b/Source/cmListFileCache.cxx
@@ -16,7 +16,7 @@
 
 struct cmListFileParser
 {
-  cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
+  cmListFileParser(cmListFile* lf, cmListFileBacktrace const& lfbt,
                    cmMessenger* messenger, const char* filename);
   ~cmListFileParser();
   void IssueFileOpenError(std::string const& text) const;
@@ -39,7 +39,8 @@ struct cmListFileParser
   } Separation;
 };
 
-cmListFileParser::cmListFileParser(cmListFile* lf, cmListFileBacktrace lfbt,
+cmListFileParser::cmListFileParser(cmListFile* lf,
+                                   cmListFileBacktrace const& lfbt,
                                    cmMessenger* messenger,
                                    const char* filename)
   : ListFile(lf)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b432e933cb0b2b162149b7e3aeb6a37b00e78d5f
commit b432e933cb0b2b162149b7e3aeb6a37b00e78d5f
Author:     Daniel Pfeifer <daniel at pfeifer-mail.de>
AuthorDate: Fri Apr 21 10:41:38 2017 +0200
Commit:     Daniel Pfeifer <daniel at pfeifer-mail.de>
CommitDate: Fri Apr 21 10:44:07 2017 +0200

    clang-tidy: use .empty() to check emptyness

diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index d738a1b..fdc16b1 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -561,7 +561,7 @@ void cmCTestMultiProcessHandler::CreateParallelTestCostList()
   // In parallel test runs repeatedly move dependencies of the tests on
   // the current dependency level to the next level until no
   // further dependencies exist.
-  while (priorityStack.back().size()) {
+  while (!priorityStack.back().empty()) {
     TestSet& previousSet = priorityStack.back();
     priorityStack.push_back(TestSet());
     TestSet& currentSet = priorityStack.back();

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=012972a926713cdf235c1c24d7b9059c3179855f
commit 012972a926713cdf235c1c24d7b9059c3179855f
Author:     Daniel Pfeifer <daniel at pfeifer-mail.de>
AuthorDate: Fri Apr 21 10:11:15 2017 +0200
Commit:     Daniel Pfeifer <daniel at pfeifer-mail.de>
CommitDate: Fri Apr 21 10:44:07 2017 +0200

    clang-tidy: remove reduntant .data() calls

diff --git a/Source/CPack/IFW/cmCPackIFWInstaller.cxx b/Source/CPack/IFW/cmCPackIFWInstaller.cxx
index 3aebbc8..57b47f1 100644
--- a/Source/CPack/IFW/cmCPackIFWInstaller.cxx
+++ b/Source/CPack/IFW/cmCPackIFWInstaller.cxx
@@ -288,7 +288,7 @@ public:
     hasFiles = false;
     hasErrors = false;
 
-    basePath = cmSystemTools::GetFilenamePath(installer->Resources[r].data());
+    basePath = cmSystemTools::GetFilenamePath(installer->Resources[r]);
 
     ParseFile(installer->Resources[r].data());
 
@@ -360,8 +360,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
       cmSystemTools::GetFilenameName(InstallerApplicationIcon);
     std::string path = Directory + "/config/" + name;
     name = cmSystemTools::GetFilenameWithoutExtension(name);
-    cmsys::SystemTools::CopyFileIfDifferent(InstallerApplicationIcon.data(),
-                                            path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(InstallerApplicationIcon, path);
     xout.Element("InstallerApplicationIcon", name);
   }
 
@@ -369,8 +368,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!InstallerWindowIcon.empty()) {
     std::string name = cmSystemTools::GetFilenameName(InstallerWindowIcon);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(InstallerWindowIcon.data(),
-                                            path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(InstallerWindowIcon, path);
     xout.Element("InstallerWindowIcon", name);
   }
 
@@ -378,7 +376,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!Logo.empty()) {
     std::string name = cmSystemTools::GetFilenameName(Logo);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(Logo.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(Logo, path);
     xout.Element("Logo", name);
   }
 
@@ -386,7 +384,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!Banner.empty()) {
     std::string name = cmSystemTools::GetFilenameName(Banner);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(Banner.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(Banner, path);
     xout.Element("Banner", name);
   }
 
@@ -394,7 +392,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!Watermark.empty()) {
     std::string name = cmSystemTools::GetFilenameName(Watermark);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(Watermark.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(Watermark, path);
     xout.Element("Watermark", name);
   }
 
@@ -402,7 +400,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!Background.empty()) {
     std::string name = cmSystemTools::GetFilenameName(Background);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(Background.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(Background, path);
     xout.Element("Background", name);
   }
 
@@ -480,7 +478,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
   if (!IsVersionLess("2.0") && !ControlScript.empty()) {
     std::string name = cmSystemTools::GetFilenameName(ControlScript);
     std::string path = Directory + "/config/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(ControlScript.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(ControlScript, path);
     xout.Element("ControlScript", name);
   }
 
@@ -492,8 +490,7 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
       if (parser.ParseResource(i)) {
         std::string name = cmSystemTools::GetFilenameName(Resources[i]);
         std::string path = Directory + "/resources/" + name;
-        cmsys::SystemTools::CopyFileIfDifferent(Resources[i].data(),
-                                                path.data());
+        cmsys::SystemTools::CopyFileIfDifferent(Resources[i], path);
         resources.push_back(name);
       } else {
         cmCPackLogger(cmCPackLog::LOG_WARNING, "Can't copy resources from \""
diff --git a/Source/CPack/IFW/cmCPackIFWPackage.cxx b/Source/CPack/IFW/cmCPackIFWPackage.cxx
index 2a95ba8..99e8b9e 100644
--- a/Source/CPack/IFW/cmCPackIFWPackage.cxx
+++ b/Source/CPack/IFW/cmCPackIFWPackage.cxx
@@ -590,7 +590,7 @@ void cmCPackIFWPackage::GeneratePackageFile()
   if (!Script.empty()) {
     std::string name = cmSystemTools::GetFilenameName(Script);
     std::string path = Directory + "/meta/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(Script.data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(Script, path);
     xout.Element("Script", name);
   }
 
@@ -599,8 +599,7 @@ void cmCPackIFWPackage::GeneratePackageFile()
   for (size_t i = 0; i < userInterfaces.size(); i++) {
     std::string name = cmSystemTools::GetFilenameName(userInterfaces[i]);
     std::string path = Directory + "/meta/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(userInterfaces[i].data(),
-                                            path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(userInterfaces[i], path);
     userInterfaces[i] = name;
   }
   if (!userInterfaces.empty()) {
@@ -616,8 +615,7 @@ void cmCPackIFWPackage::GeneratePackageFile()
   for (size_t i = 0; i < translations.size(); i++) {
     std::string name = cmSystemTools::GetFilenameName(translations[i]);
     std::string path = Directory + "/meta/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(translations[i].data(),
-                                            path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(translations[i], path);
     translations[i] = name;
   }
   if (!translations.empty()) {
@@ -675,7 +673,7 @@ void cmCPackIFWPackage::GeneratePackageFile()
   for (size_t i = 1; i < licenses.size(); i += 2) {
     std::string name = cmSystemTools::GetFilenameName(licenses[i]);
     std::string path = Directory + "/meta/" + name;
-    cmsys::SystemTools::CopyFileIfDifferent(licenses[i].data(), path.data());
+    cmsys::SystemTools::CopyFileIfDifferent(licenses[i], path);
     licenses[i] = name;
   }
   if (!licenses.empty()) {

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=b26577c92ae59fa23be49bcaa3404efe36646e1a
commit b26577c92ae59fa23be49bcaa3404efe36646e1a
Author:     Daniel Pfeifer <daniel at pfeifer-mail.de>
AuthorDate: Fri Apr 21 10:06:12 2017 +0200
Commit:     Daniel Pfeifer <daniel at pfeifer-mail.de>
CommitDate: Fri Apr 21 10:44:07 2017 +0200

    clang-tidy: remove else after break and continue

diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx
index 4d970d5..87c532c 100644
--- a/Source/CTest/cmCTestCoverageHandler.cxx
+++ b/Source/CTest/cmCTestCoverageHandler.cxx
@@ -2222,7 +2222,8 @@ void cmCTestCoverageHandler::LoadLabels(const char* dir)
     if (line.empty() || line[0] == '#') {
       // Ignore blank and comment lines.
       continue;
-    } else if (line[0] == ' ') {
+    }
+    if (line[0] == ' ') {
       // Label lines appear indented by one space.
       std::string label = line.substr(1);
       int id = this->GetLabelId(label);
diff --git a/Source/CTest/cmCTestLaunch.cxx b/Source/CTest/cmCTestLaunch.cxx
index 7195bb3..a782150 100644
--- a/Source/CTest/cmCTestLaunch.cxx
+++ b/Source/CTest/cmCTestLaunch.cxx
@@ -306,7 +306,8 @@ void cmCTestLaunch::LoadLabels()
     if (line.empty() || line[0] == '#') {
       // Ignore blank and comment lines.
       continue;
-    } else if (line[0] == ' ') {
+    }
+    if (line[0] == ' ') {
       // Label lines appear indented by one space.
       if (inTarget || inSource) {
         this->Labels.insert(line.c_str() + 1);
diff --git a/Source/CTest/cmParseDelphiCoverage.cxx b/Source/CTest/cmParseDelphiCoverage.cxx
index 9ae48d8..9cdd50b 100644
--- a/Source/CTest/cmParseDelphiCoverage.cxx
+++ b/Source/CTest/cmParseDelphiCoverage.cxx
@@ -46,7 +46,8 @@ public:
         beginSet.push_back("begin");
         coverageVector.push_back(-1);
         continue;
-      } else if (line.find('{') != line.npos) {
+      }
+      if (line.find('{') != line.npos) {
         blockComFlag = true;
       } else if (line.find('}') != line.npos) {
         blockComFlag = false;
diff --git a/Source/CursesDialog/cmCursesLongMessageForm.cxx b/Source/CursesDialog/cmCursesLongMessageForm.cxx
index d299547..7fb065d 100644
--- a/Source/CursesDialog/cmCursesLongMessageForm.cxx
+++ b/Source/CursesDialog/cmCursesLongMessageForm.cxx
@@ -159,7 +159,8 @@ void cmCursesLongMessageForm::HandleInput()
     // quit
     if (key == 'o' || key == 'e') {
       break;
-    } else if (key == KEY_DOWN || key == ctrl('n')) {
+    }
+    if (key == KEY_DOWN || key == ctrl('n')) {
       form_driver(this->Form, REQ_SCR_FLINE);
     } else if (key == KEY_UP || key == ctrl('p')) {
       form_driver(this->Form, REQ_SCR_BLINE);
diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx
index 939c736..ca824c0 100644
--- a/Source/CursesDialog/cmCursesMainForm.cxx
+++ b/Source/CursesDialog/cmCursesMainForm.cxx
@@ -764,9 +764,8 @@ void cmCursesMainForm::HandleInput()
       // quit
       if (key == 'q') {
         break;
-      } else {
-        continue;
       }
+      continue;
     }
 
     currentField = current_field(this->Form);
@@ -826,7 +825,7 @@ void cmCursesMainForm::HandleInput()
       // (index always corresponds to the value field)
       // scroll down with arrow down, ctrl+n (emacs binding), or j (vim
       // binding)
-      else if (key == KEY_DOWN || key == ctrl('n') || key == 'j') {
+      if (key == KEY_DOWN || key == ctrl('n') || key == 'j') {
         FIELD* cur = current_field(this->Form);
         size_t findex = field_index(cur);
         if (findex == 3 * this->NumberOfVisibleEntries - 1) {
diff --git a/Source/cmAddSubDirectoryCommand.cxx b/Source/cmAddSubDirectoryCommand.cxx
index 34ec0e3..dbd4dd1 100644
--- a/Source/cmAddSubDirectoryCommand.cxx
+++ b/Source/cmAddSubDirectoryCommand.cxx
@@ -32,7 +32,8 @@ bool cmAddSubDirectoryCommand::InitialPass(
     if (*i == "EXCLUDE_FROM_ALL") {
       excludeFromAll = true;
       continue;
-    } else if (binArg.empty()) {
+    }
+    if (binArg.empty()) {
       binArg = *i;
     } else {
       this->SetError("called with incorrect number of arguments");
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 034a266..fa166a0 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -613,8 +613,8 @@ bool cmFileCommand::HandleStringsCommand(std::vector<std::string> const& args)
       continue;
     }
 
-    else if ((c >= 0x20 && c < 0x7F) || c == '\t' ||
-             (c == '\n' && newline_consume)) {
+    if ((c >= 0x20 && c < 0x7F) || c == '\t' ||
+        (c == '\n' && newline_consume)) {
       // This is an ASCII character that may be part of a string.
       // Cast added to avoid compiler warning. Cast is ok because
       // c is guaranteed to fit in char by the above if...
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 2799505..a38f968 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -3933,15 +3933,14 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt,
             << theTarget->GetName() << "\".\n";
           cmSystemTools::Error(e.str().c_str());
           break;
-        } else {
-          propContent = consistent.second;
-          continue;
         }
-      } else {
-        // Explicitly set on target and not set in iface. Can't disagree.
+        propContent = consistent.second;
         continue;
       }
-    } else if (impliedByUse) {
+      // Explicitly set on target and not set in iface. Can't disagree.
+      continue;
+    }
+    if (impliedByUse) {
       propContent = impliedValue<PropertyType>(propContent);
 
       if (ifaceIsSet) {
@@ -3959,43 +3958,36 @@ PropertyType checkInterfacePropertyCompatibility(cmGeneratorTarget const* tgt,
             << "\" is in conflict.\n";
           cmSystemTools::Error(e.str().c_str());
           break;
-        } else {
-          propContent = consistent.second;
-          continue;
         }
-      } else {
-        // Implicitly set on target and not set in iface. Can't disagree.
+        propContent = consistent.second;
         continue;
       }
-    } else {
-      if (ifaceIsSet) {
-        if (propInitialized) {
-          std::pair<bool, PropertyType> consistent =
-            consistentProperty(propContent, ifacePropContent, t);
-          report += reportEntry;
-          report += compatibilityAgree(t, propContent != consistent.second);
-          if (!consistent.first) {
-            std::ostringstream e;
-            e << "The INTERFACE_" << p << " property of \""
-              << theTarget->GetName() << "\" does\nnot agree with the value "
-                                         "of "
-              << p << " already determined\nfor \"" << tgt->GetName()
-              << "\".\n";
-            cmSystemTools::Error(e.str().c_str());
-            break;
-          } else {
-            propContent = consistent.second;
-            continue;
-          }
-        } else {
-          report += reportEntry + "(Interface set)\n";
-          propContent = ifacePropContent;
-          propInitialized = true;
+      // Implicitly set on target and not set in iface. Can't disagree.
+      continue;
+    }
+    if (ifaceIsSet) {
+      if (propInitialized) {
+        std::pair<bool, PropertyType> consistent =
+          consistentProperty(propContent, ifacePropContent, t);
+        report += reportEntry;
+        report += compatibilityAgree(t, propContent != consistent.second);
+        if (!consistent.first) {
+          std::ostringstream e;
+          e << "The INTERFACE_" << p << " property of \""
+            << theTarget->GetName() << "\" does\nnot agree with the value of "
+            << p << " already determined\nfor \"" << tgt->GetName() << "\".\n";
+          cmSystemTools::Error(e.str().c_str());
+          break;
         }
-      } else {
-        // Not set. Nothing to agree on.
+        propContent = consistent.second;
         continue;
       }
+      report += reportEntry + "(Interface set)\n";
+      propContent = ifacePropContent;
+      propInitialized = true;
+    } else {
+      // Not set. Nothing to agree on.
+      continue;
     }
   }
 
diff --git a/Source/cmOutputRequiredFilesCommand.cxx b/Source/cmOutputRequiredFilesCommand.cxx
index 8b8cf07..2339d68 100644
--- a/Source/cmOutputRequiredFilesCommand.cxx
+++ b/Source/cmOutputRequiredFilesCommand.cxx
@@ -188,9 +188,8 @@ protected:
           if (qstart == std::string::npos) {
             cmSystemTools::Error("unknown include directive ", line.c_str());
             continue;
-          } else {
-            qend = line.find('>', qstart + 1);
           }
+          qend = line.find('>', qstart + 1);
         } else {
           qend = line.find('\"', qstart + 1);
         }
diff --git a/Source/cmRST.cxx b/Source/cmRST.cxx
index 70ffc7d..938cad9 100644
--- a/Source/cmRST.cxx
+++ b/Source/cmRST.cxx
@@ -96,14 +96,14 @@ void cmRST::ProcessModule(std::istream& is)
         if (line == "#") {
           this->ProcessLine("");
           continue;
-        } else if (line.substr(0, 2) == "# ") {
+        }
+        if (line.substr(0, 2) == "# ") {
           this->ProcessLine(line.substr(2, line.npos));
           continue;
-        } else {
-          rst = "";
-          this->Reset();
-          this->OutputLinePending = true;
         }
+        rst = "";
+        this->Reset();
+        this->OutputLinePending = true;
       }
       if (line == "#.rst:") {
         rst = "#";
diff --git a/Source/cmSetTargetPropertiesCommand.cxx b/Source/cmSetTargetPropertiesCommand.cxx
index da26972..6425913 100644
--- a/Source/cmSetTargetPropertiesCommand.cxx
+++ b/Source/cmSetTargetPropertiesCommand.cxx
@@ -32,9 +32,8 @@ bool cmSetTargetPropertiesCommand::InitialPass(
       }
       propertyPairs.insert(propertyPairs.end(), j, args.end());
       break;
-    } else {
-      numFiles++;
     }
+    numFiles++;
   }
   if (propertyPairs.empty()) {
     this->SetError("called with illegal arguments, maybe missing "
diff --git a/Source/cmSetTestsPropertiesCommand.cxx b/Source/cmSetTestsPropertiesCommand.cxx
index 4fd379f..e27c675 100644
--- a/Source/cmSetTestsPropertiesCommand.cxx
+++ b/Source/cmSetTestsPropertiesCommand.cxx
@@ -32,9 +32,8 @@ bool cmSetTestsPropertiesCommand::InitialPass(
       }
       propertyPairs.insert(propertyPairs.end(), j, args.end());
       break;
-    } else {
-      numFiles++;
     }
+    numFiles++;
   }
   if (propertyPairs.empty()) {
     this->SetError("called with illegal arguments, maybe "
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 7ace0a3..9d3d91f 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1667,7 +1667,8 @@ int cmSystemTools::WaitForLine(cmsysProcess* process, std::string& line,
     for (; outiter != out.end(); ++outiter) {
       if ((*outiter == '\r') && ((outiter + 1) == out.end())) {
         break;
-      } else if (*outiter == '\n' || *outiter == '\0') {
+      }
+      if (*outiter == '\n' || *outiter == '\0') {
         std::vector<char>::size_type length = outiter - out.begin();
         if (length > 1 && *(outiter - 1) == '\r') {
           --length;
@@ -1684,7 +1685,8 @@ int cmSystemTools::WaitForLine(cmsysProcess* process, std::string& line,
     for (; erriter != err.end(); ++erriter) {
       if ((*erriter == '\r') && ((erriter + 1) == err.end())) {
         break;
-      } else if (*erriter == '\n' || *erriter == '\0') {
+      }
+      if (*erriter == '\n' || *erriter == '\0') {
         std::vector<char>::size_type length = erriter - err.begin();
         if (length > 1 && *(erriter - 1) == '\r') {
           --length;
@@ -2583,29 +2585,28 @@ bool cmSystemTools::RemoveRPath(std::string const& file, std::string* emsg,
         it = dentries.erase(it);
         entriesErased++;
         continue;
-      } else {
-        if (cmELF::TagMipsRldMapRel != 0 &&
-            it->first == cmELF::TagMipsRldMapRel) {
-          // Background: debuggers need to know the "linker map" which contains
-          // the addresses each dynamic object is loaded at. Most arches use
-          // the DT_DEBUG tag which the dynamic linker writes to (directly) and
-          // contain the location of the linker map, however on MIPS the
-          // .dynamic section is always read-only so this is not possible. MIPS
-          // objects instead contain a DT_MIPS_RLD_MAP tag which contains the
-          // address where the dyanmic linker will write to (an indirect
-          // version of DT_DEBUG). Since this doesn't work when using PIE, a
-          // relative equivalent was created - DT_MIPS_RLD_MAP_REL. Since this
-          // version contains a relative offset, moving it changes the
-          // calculated address. This may cause the dyanmic linker to write
-          // into memory it should not be changing.
-          //
-          // To fix this, we adjust the value of DT_MIPS_RLD_MAP_REL here. If
-          // we move it up by n bytes, we add n bytes to the value of this tag.
-          it->second += entriesErased * sizeof_dentry;
-        }
-
-        it++;
       }
+      if (cmELF::TagMipsRldMapRel != 0 &&
+          it->first == cmELF::TagMipsRldMapRel) {
+        // Background: debuggers need to know the "linker map" which contains
+        // the addresses each dynamic object is loaded at. Most arches use
+        // the DT_DEBUG tag which the dynamic linker writes to (directly) and
+        // contain the location of the linker map, however on MIPS the
+        // .dynamic section is always read-only so this is not possible. MIPS
+        // objects instead contain a DT_MIPS_RLD_MAP tag which contains the
+        // address where the dyanmic linker will write to (an indirect
+        // version of DT_DEBUG). Since this doesn't work when using PIE, a
+        // relative equivalent was created - DT_MIPS_RLD_MAP_REL. Since this
+        // version contains a relative offset, moving it changes the
+        // calculated address. This may cause the dyanmic linker to write
+        // into memory it should not be changing.
+        //
+        // To fix this, we adjust the value of DT_MIPS_RLD_MAP_REL here. If
+        // we move it up by n bytes, we add n bytes to the value of this tag.
+        it->second += entriesErased * sizeof_dentry;
+      }
+
+      it++;
     }
 
     // Encode new entries list
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 974dd5f..cc954e6 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -1450,7 +1450,8 @@ bool cmVSLink::Parse(std::vector<std::string>::const_iterator argBeg,
     if (*arg == "--") {
       ++arg;
       break;
-    } else if (*arg == "--manifests") {
+    }
+    if (*arg == "--manifests") {
       for (++arg; arg != argEnd && !cmHasLiteralPrefix(*arg, "-"); ++arg) {
         this->UserManifests.push_back(*arg);
       }

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

Summary of changes:
 Help/release/dev/ninja-loosen-object-deps.rst      |    8 +++
 Source/CPack/IFW/cmCPackIFWInstaller.cxx           |   21 +++----
 Source/CPack/IFW/cmCPackIFWPackage.cxx             |   10 ++-
 Source/CTest/cmCTestCoverageHandler.cxx            |    3 +-
 Source/CTest/cmCTestLaunch.cxx                     |    3 +-
 Source/CTest/cmCTestMultiProcessHandler.cxx        |    2 +-
 Source/CTest/cmParseDelphiCoverage.cxx             |    3 +-
 Source/CursesDialog/cmCursesLongMessageForm.cxx    |    3 +-
 Source/CursesDialog/cmCursesMainForm.cxx           |    5 +-
 Source/cmAddSubDirectoryCommand.cxx                |    3 +-
 Source/cmFileCommand.cxx                           |    4 +-
 Source/cmFileMonitor.cxx                           |    2 +-
 Source/cmGeneratorTarget.cxx                       |   66 +++++++++-----------
 Source/cmGlobalNinjaGenerator.cxx                  |   29 +++++++--
 Source/cmGlobalNinjaGenerator.h                    |   10 +--
 Source/cmListFileCache.cxx                         |    5 +-
 Source/cmLocalNinjaGenerator.cxx                   |    6 +-
 Source/cmLocalNinjaGenerator.h                     |    4 +-
 Source/cmNinjaTargetGenerator.cxx                  |   31 ++++++---
 Source/cmNinjaTargetGenerator.h                    |    3 +-
 Source/cmNinjaTypes.h                              |    6 ++
 Source/cmOutputRequiredFilesCommand.cxx            |    3 +-
 Source/cmRST.cxx                                   |   10 +--
 Source/cmSetTargetPropertiesCommand.cxx            |    3 +-
 Source/cmSetTestsPropertiesCommand.cxx             |    3 +-
 Source/cmSourceGroupCommand.cxx                    |   59 ++++++++++++-----
 Source/cmSystemTools.cxx                           |   49 ++++++++-------
 Source/cmcmd.cxx                                   |    3 +-
 Tests/CMakeOnly/AllFindModules/CMakeLists.txt      |    6 +-
 Tests/CustomCommandWorkingDirectory/CMakeLists.txt |    2 +
 Tests/FindModulesExecuteAll/CMakeLists.txt         |    2 +-
 Tests/RunCMake/CMakeLists.txt                      |    4 ++
 Tests/RunCMake/Ninja/AssumedSources.cmake          |   20 ++++++
 Tests/RunCMake/Ninja/LooseObjectDepends.cmake      |   26 ++++++++
 Tests/RunCMake/Ninja/RunCMakeTest.cmake            |   35 ++++++++++-
 .../foo.cpp => RunCMake/Ninja/dep.c}               |    2 +-
 Tests/RunCMake/Ninja/top.c                         |    7 +++
 37 files changed, 309 insertions(+), 152 deletions(-)
 create mode 100644 Help/release/dev/ninja-loosen-object-deps.rst
 create mode 100644 Tests/RunCMake/Ninja/AssumedSources.cmake
 create mode 100644 Tests/RunCMake/Ninja/LooseObjectDepends.cmake
 copy Tests/{CompatibleInterface/foo.cpp => RunCMake/Ninja/dep.c} (61%)
 create mode 100644 Tests/RunCMake/Ninja/top.c


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list