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  a6a04cc446e67017e74e294a4aef84e9e8da4323 (commit)
       via  6e8acc51a57e60aff307e4730c8a2314e5cf737a (commit)
       via  9dad42d21a67592040d1100882147eed77753392 (commit)
       via  4fe34b2d29ca67ea91b2545b223dad8abbcad282 (commit)
       via  57cedb18c097a7231223b8a4279534216cad1b93 (commit)
       via  6136ab5e179b33ddd659ad458ad8efd773ec8db8 (commit)
       via  6a23fbce47294e746c15ee851dc3460a3a17da2b (commit)
      from  05af1770a05e00d67f12f4e3ef294360d8d6480d (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=a6a04cc446e67017e74e294a4aef84e9e8da4323
commit a6a04cc446e67017e74e294a4aef84e9e8da4323
Merge: 6e8acc5 4fe34b2
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 30 13:55:22 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 30 09:58:37 2019 -0400

    Merge topic 'fix-clang-warnings'
    
    4fe34b2d29 Fixing warnings generated by clang 8.0 on Windows
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3396


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6e8acc51a57e60aff307e4730c8a2314e5cf737a
commit 6e8acc51a57e60aff307e4730c8a2314e5cf737a
Merge: 9dad42d 57cedb1
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 30 13:53:04 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 30 09:57:11 2019 -0400

    Merge topic 'string-tar'
    
    57cedb18c0 cmSystemTools: std::string parameters for tar functions
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3392


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9dad42d21a67592040d1100882147eed77753392
commit 9dad42d21a67592040d1100882147eed77753392
Merge: 05af177 6136ab5
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 30 13:52:50 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 30 09:53:09 2019 -0400

    Merge topic 'ninja_rule_class'
    
    6136ab5e17 Ninja: Use cmNinjaRule as sole parameter in the WriteRule and 
AddRule methods
    6a23fbce47 Ninja: Add cmNinjaRule class
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3393


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4fe34b2d29ca67ea91b2545b223dad8abbcad282
commit 4fe34b2d29ca67ea91b2545b223dad8abbcad282
Author:     Zsolt Parragi <zsolt.parr...@cancellar.hu>
AuthorDate: Wed May 29 18:03:34 2019 +0200
Commit:     Zsolt Parragi <zsolt.parr...@cancellar.hu>
CommitDate: Wed May 29 18:18:09 2019 +0200

    Fixing warnings generated by clang 8.0 on Windows
    
    * Deprecation removals previously specific to MSVC/Intel now also used
      by clang
    * String literals were assigned to non const pointers. These are stored
      in mutable arrays now
    * An implicit function pointer to pointer conversion is a Microsoft
      extension warning is suppressed by an explicit reinterpret_cast
    * The MSVC specific deprecation macro for jsoncpp was moved after the
      clang macro to avoid redefinition warnings. This is consistent with
      how jsoncpp fixed the issue in 36d8cfd7

diff --git a/CompileFlags.cmake b/CompileFlags.cmake
index c231ede..91f2adf 100644
--- a/CompileFlags.cmake
+++ b/CompileFlags.cmake
@@ -8,11 +8,16 @@ if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Intel")
   set(_INTEL_WINDOWS 1)
 endif()
 
+if(WIN32 AND CMAKE_C_COMPILER_ID STREQUAL "Clang"
+   AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
+  set(_CLANG_MSVC_WINDOWS 1)
+endif()
+
 # Disable deprecation warnings for standard C functions.
 # really only needed for newer versions of VS, but should
 # not hurt other versions, and this will work into the
 # future
-if(MSVC OR _INTEL_WINDOWS)
+if(MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS)
   add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
 else()
 endif()
@@ -21,9 +26,7 @@ if(MSVC)
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stack:10000000")
 endif()
 
-if(CMAKE_CXX_COMPILER_ID STREQUAL Clang
-   AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC"
-   AND "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
+if(_CLANG_MSVC_WINDOWS AND "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL 
"xGNU")
   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker 
-stack:20000000")
 endif()
 
diff --git a/Source/cmCallVisualStudioMacro.cxx 
b/Source/cmCallVisualStudioMacro.cxx
index 2f6cf64..f7a2244 100644
--- a/Source/cmCallVisualStudioMacro.cxx
+++ b/Source/cmCallVisualStudioMacro.cxx
@@ -61,7 +61,8 @@ HRESULT InstanceCallMacro(IDispatch* vsIDE, const 
std::string& macro,
 
   if (0 != vsIDE) {
     DISPID dispid = (DISPID)-1;
-    OLECHAR* name = L"ExecuteCommand";
+    wchar_t execute_command[] = L"ExecuteCommand";
+    OLECHAR* name = execute_command;
 
     hr =
       vsIDE->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispid);
@@ -119,7 +120,8 @@ HRESULT InstanceCallMacro(IDispatch* vsIDE, const 
std::string& macro,
         }
         oss << "  dwHelpContext: " << excep.dwHelpContext << std::endl;
         oss << "  pvReserved: " << excep.pvReserved << std::endl;
-        oss << "  pfnDeferredFillIn: " << excep.pfnDeferredFillIn << std::endl;
+        oss << "  pfnDeferredFillIn: "
+            << reinterpret_cast<void*>(excep.pfnDeferredFillIn) << std::endl;
         oss << "  scode: " << excep.scode << std::endl;
       }
 
@@ -140,7 +142,8 @@ HRESULT GetSolutionObject(IDispatch* vsIDE, IDispatchPtr& 
vsSolution)
 
   if (0 != vsIDE) {
     DISPID dispid = (DISPID)-1;
-    OLECHAR* name = L"Solution";
+    wchar_t solution[] = L"Solution";
+    OLECHAR* name = solution;
 
     hr =
       vsIDE->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispid);
@@ -183,7 +186,8 @@ HRESULT GetSolutionFullName(IDispatch* vsSolution, 
std::string& fullName)
 
   if (0 != vsSolution) {
     DISPID dispid = (DISPID)-1;
-    OLECHAR* name = L"FullName";
+    wchar_t full_name[] = L"FullName";
+    OLECHAR* name = full_name;
 
     hr = vsSolution->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT,
                                    &dispid);
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 3495f2a..26886f5 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -535,11 +535,22 @@ void cmGlobalGenerator::EnableLanguage(
 
 #  ifdef KWSYS_WINDOWS_DEPRECATED_GetVersionEx
 #    pragma warning(push)
-#    pragma warning(disable : 4996)
+#    ifdef __INTEL_COMPILER
+#      pragma warning(disable : 1478)
+#    elif defined __clang__
+#      pragma clang diagnostic push
+#      pragma clang diagnostic ignored "-Wdeprecated-declarations"
+#    else
+#      pragma warning(disable : 4996)
+#    endif
 #  endif
     GetVersionExW((OSVERSIONINFOW*)&osviex);
 #  ifdef KWSYS_WINDOWS_DEPRECATED_GetVersionEx
-#    pragma warning(pop)
+#    ifdef __clang__
+#      pragma clang diagnostic pop
+#    else
+#      pragma warning(pop)
+#    endif
 #  endif
     std::ostringstream windowsVersionString;
     windowsVersionString << osviex.dwMajorVersion << "."
diff --git a/Utilities/cmjsoncpp/include/json/config.h 
b/Utilities/cmjsoncpp/include/json/config.h
index 34f7314..2cc8462 100644
--- a/Utilities/cmjsoncpp/include/json/config.h
+++ b/Utilities/cmjsoncpp/include/json/config.h
@@ -79,11 +79,6 @@
 #    pragma warning(disable : 4786)
 #  endif // MSVC 6
 
-#  if _MSC_VER >= 1500 // MSVC 2008
-    /// Indicates that the following function is deprecated.
-#    define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
-#  endif
-
 #endif // defined(_MSC_VER)
 
 // In c++11 the override keyword allows you to explicity define that a function
@@ -137,7 +132,10 @@
 #  elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
 #    define JSONCPP_DEPRECATED(message)  __attribute__((__deprecated__))
 #  endif  // GNUC version
-#endif // __clang__ || __GNUC__
+#elif defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
+    /// Indicates that the following function is deprecated.
+#    define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
+#endif // __clang__ || __GNUC__ || _MSC_VER
 
 #undef JSONCPP_DEPRECATED // no deprecations in CMake copy
 #if !defined(JSONCPP_DEPRECATED)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=57cedb18c097a7231223b8a4279534216cad1b93
commit 57cedb18c097a7231223b8a4279534216cad1b93
Author:     Vitaly Stakhovsky <vvs31...@gitlab.org>
AuthorDate: Wed May 29 08:15:40 2019 -0400
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Wed May 29 09:56:08 2019 -0400

    cmSystemTools: std::string parameters for tar functions

diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 071ff56..d1226c3 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -1611,8 +1611,8 @@ std::string cmCTest::Base64GzipEncodeFile(std::string 
const& file)
   std::vector<std::string> files;
   files.push_back(file);
 
-  if (!cmSystemTools::CreateTar(tarFile.c_str(), files,
-                                cmSystemTools::TarCompressGZip, false)) {
+  if (!cmSystemTools::CreateTar(tarFile, files, cmSystemTools::TarCompressGZip,
+                                false)) {
     cmCTestLog(this, ERROR_MESSAGE,
                "Error creating tar while "
                "encoding file: "
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 2453aea..ef29217 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -1529,7 +1529,7 @@ bool cmSystemTools::IsPathToFramework(const std::string& 
path)
           cmHasLiteralSuffix(path, ".framework"));
 }
 
-bool cmSystemTools::CreateTar(const char* outFileName,
+bool cmSystemTools::CreateTar(const std::string& outFileName,
                               const std::vector<std::string>& files,
                               cmTarCompression compressType, bool verbose,
                               std::string const& mtime,
@@ -1537,7 +1537,7 @@ bool cmSystemTools::CreateTar(const char* outFileName,
 {
 #if defined(CMAKE_BUILD_WITH_CMAKE)
   std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
-  cmsys::ofstream fout(outFileName, std::ios::out | std::ios::binary);
+  cmsys::ofstream fout(outFileName.c_str(), std::ios::out | std::ios::binary);
   if (!fout) {
     std::string e = "Cannot open output file \"";
     e += outFileName;
@@ -1757,7 +1757,7 @@ bool copy_data(struct archive* ar, struct archive* aw)
 #  endif
 }
 
-bool extract_tar(const char* outFileName,
+bool extract_tar(const std::string& outFileName,
                  const std::vector<std::string>& files, bool verbose,
                  bool extract)
 {
@@ -1783,7 +1783,7 @@ bool extract_tar(const char* outFileName,
     }
   }
 
-  int r = cm_archive_read_open_file(a, outFileName, 10240);
+  int r = cm_archive_read_open_file(a, outFileName.c_str(), 10240);
   if (r) {
     ArchiveError("Problem with archive_read_open_file(): ", a);
     archive_write_free(ext);
@@ -1878,7 +1878,7 @@ bool extract_tar(const char* outFileName,
 }
 #endif
 
-bool cmSystemTools::ExtractTar(const char* outFileName,
+bool cmSystemTools::ExtractTar(const std::string& outFileName,
                                const std::vector<std::string>& files,
                                bool verbose)
 {
@@ -1892,7 +1892,7 @@ bool cmSystemTools::ExtractTar(const char* outFileName,
 #endif
 }
 
-bool cmSystemTools::ListTar(const char* outFileName,
+bool cmSystemTools::ListTar(const std::string& outFileName,
                             const std::vector<std::string>& files,
                             bool verbose)
 {
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index 09a4d13..7fb369e 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -450,14 +450,14 @@ public:
     TarCompressNone
   };
 
-  static bool ListTar(const char* outFileName,
+  static bool ListTar(const std::string& outFileName,
                       const std::vector<std::string>& files, bool verbose);
-  static bool CreateTar(const char* outFileName,
+  static bool CreateTar(const std::string& outFileName,
                         const std::vector<std::string>& files,
                         cmTarCompression compressType, bool verbose,
                         std::string const& mtime = std::string(),
                         std::string const& format = std::string());
-  static bool ExtractTar(const char* inFileName,
+  static bool ExtractTar(const std::string& inFileName,
                          const std::vector<std::string>& files, bool verbose);
   // This should be called first thing in main
   // it will keep child processes from inheriting the
diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index 4ddfddd..8f416a4 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -1127,7 +1127,7 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> 
const& args)
         return 1;
       }
       if (action == cmSystemTools::TarActionList) {
-        if (!cmSystemTools::ListTar(outFile.c_str(), files, verbose)) {
+        if (!cmSystemTools::ListTar(outFile, files, verbose)) {
           cmSystemTools::Error("Problem listing tar: " + outFile);
           return 1;
         }
@@ -1136,13 +1136,13 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> 
const& args)
           cmSystemTools::Message("tar: No files or directories specified",
                                  "Warning");
         }
-        if (!cmSystemTools::CreateTar(outFile.c_str(), files, compress,
-                                      verbose, mtime, format)) {
+        if (!cmSystemTools::CreateTar(outFile, files, compress, verbose, mtime,
+                                      format)) {
           cmSystemTools::Error("Problem creating tar: " + outFile);
           return 1;
         }
       } else if (action == cmSystemTools::TarActionExtract) {
-        if (!cmSystemTools::ExtractTar(outFile.c_str(), files, verbose)) {
+        if (!cmSystemTools::ExtractTar(outFile, files, verbose)) {
           cmSystemTools::Error("Problem extracting tar: " + outFile);
           return 1;
         }

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6136ab5e179b33ddd659ad458ad8efd773ec8db8
commit 6136ab5e179b33ddd659ad458ad8efd773ec8db8
Author:     Sebastian Holtermann <sebh...@xwmw.org>
AuthorDate: Wed May 29 13:04:52 2019 +0200
Commit:     Sebastian Holtermann <sebh...@xwmw.org>
CommitDate: Wed May 29 13:04:52 2019 +0200

    Ninja: Use cmNinjaRule as sole parameter in the WriteRule and AddRule 
methods
    
    Instead of passing multiple strings to the `WriteRule` and `AddRule` methods
    of `cmGlobalNinjaGenerator`, pass only a `cmNinjaRule` instance reference,
    that is set up beforehand.
    
    Adapt calls to `WriteRule` and `AddRule` in multiple places.

diff --git a/Source/cmGlobalNinjaGenerator.cxx 
b/Source/cmGlobalNinjaGenerator.cxx
index ea65a77..4abccd7 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -238,14 +238,11 @@ void cmGlobalNinjaGenerator::WritePhonyBuild(
 
 void cmGlobalNinjaGenerator::AddCustomCommandRule()
 {
-  this->AddRule("CUSTOM_COMMAND", "$COMMAND", "$DESC",
-                "Rule for running custom commands.",
-                /*depfile*/ "",
-                /*deptype*/ "",
-                /*rspfile*/ "",
-                /*rspcontent*/ "",
-                /*restat*/ "", // bound on each build statement as needed
-                /*generator*/ false);
+  cmNinjaRule rule("CUSTOM_COMMAND");
+  rule.Command = "$COMMAND";
+  rule.Description = "$DESC";
+  rule.Comment = "Rule for running custom commands.";
+  this->AddRule(rule);
 }
 
 void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
@@ -293,15 +290,11 @@ void cmGlobalNinjaGenerator::WriteCustomCommandBuild(
 
 void cmGlobalNinjaGenerator::AddMacOSXContentRule()
 {
-  this->AddRule("COPY_OSX_CONTENT", CMakeCmd() + " -E copy $in $out",
-                "Copying OS X Content $out",
-                "Rule for copying OS X bundle content file.",
-                /*depfile*/ "",
-                /*deptype*/ "",
-                /*rspfile*/ "",
-                /*rspcontent*/ "",
-                /*restat*/ "",
-                /*generator*/ false);
+  cmNinjaRule rule("COPY_OSX_CONTENT");
+  rule.Command = CMakeCmd() + " -E copy $in $out";
+  rule.Description = "Copying OS X Content $out";
+  rule.Comment = "Rule for copying OS X bundle content file.";
+  this->AddRule(rule);
 }
 
 void cmGlobalNinjaGenerator::WriteMacOSXContentBuild(const std::string& input,
@@ -320,40 +313,36 @@ void 
cmGlobalNinjaGenerator::WriteMacOSXContentBuild(const std::string& input,
                    cmNinjaDeps(), cmNinjaVars());
 }
 
-void cmGlobalNinjaGenerator::WriteRule(
-  std::ostream& os, const std::string& name, const std::string& command,
-  const std::string& description, const std::string& comment,
-  const std::string& depfile, const std::string& deptype,
-  const std::string& rspfile, const std::string& rspcontent,
-  const std::string& restat, bool generator)
+void cmGlobalNinjaGenerator::WriteRule(std::ostream& os,
+                                       cmNinjaRule const& rule)
 {
   // -- Parameter checks
   // Make sure the rule has a name.
-  if (name.empty()) {
+  if (rule.Name.empty()) {
     cmSystemTools::Error("No name given for WriteRule! called with comment: " +
-                         comment);
+                         rule.Comment);
     return;
   }
 
   // Make sure a command is given.
-  if (command.empty()) {
+  if (rule.Command.empty()) {
     cmSystemTools::Error(
-      "No command given for WriteRule! called with comment: " + comment);
+      "No command given for WriteRule! called with comment: " + rule.Comment);
     return;
   }
 
   // Make sure response file content is given
-  if (!rspfile.empty() && rspcontent.empty()) {
+  if (!rule.RspFile.empty() && rule.RspContent.empty()) {
     cmSystemTools::Error("rspfile but no rspfile_content given for WriteRule! "
                          "called with comment: " +
-                         comment);
+                         rule.Comment);
     return;
   }
 
   // -- Write rule
   // Write rule intro
-  cmGlobalNinjaGenerator::WriteComment(os, comment);
-  os << "rule " << name << '\n';
+  cmGlobalNinjaGenerator::WriteComment(os, rule.Comment);
+  os << "rule " << rule.Name << '\n';
 
   // Write rule key/value pairs
   auto writeKV = [&os](const char* key, std::string const& value) {
@@ -363,16 +352,16 @@ void cmGlobalNinjaGenerator::WriteRule(
     }
   };
 
-  writeKV("depfile", depfile);
-  writeKV("deps", deptype);
-  writeKV("command", command);
-  writeKV("description", description);
-  if (!rspfile.empty()) {
-    writeKV("rspfile", rspfile);
-    writeKV("rspfile_content", rspcontent);
+  writeKV("depfile", rule.DepFile);
+  writeKV("deps", rule.DepType);
+  writeKV("command", rule.Command);
+  writeKV("description", rule.Description);
+  if (!rule.RspFile.empty()) {
+    writeKV("rspfile", rule.RspFile);
+    writeKV("rspfile_content", rule.RspContent);
   }
-  writeKV("restat", restat);
-  if (generator) {
+  writeKV("restat", rule.Restat);
+  if (rule.Generator) {
     writeKV("generator", "1");
   }
 
@@ -690,23 +679,16 @@ cmGlobalNinjaGenerator::GenerateBuildCommand(
 
 // Non-virtual public methods.
 
-void cmGlobalNinjaGenerator::AddRule(
-  const std::string& name, const std::string& command,
-  const std::string& description, const std::string& comment,
-  const std::string& depfile, const std::string& deptype,
-  const std::string& rspfile, const std::string& rspcontent,
-  const std::string& restat, bool generator)
+void cmGlobalNinjaGenerator::AddRule(cmNinjaRule const& rule)
 {
   // Do not add the same rule twice.
-  if (!this->Rules.insert(name).second) {
+  if (!this->Rules.insert(rule.Name).second) {
     return;
   }
   // Store command length
-  this->RuleCmdLength[name] = static_cast<int>(command.size());
+  this->RuleCmdLength[rule.Name] = static_cast<int>(rule.Command.size());
   // Write rule
-  cmGlobalNinjaGenerator::WriteRule(*this->RulesFileStream, name, command,
-                                    description, comment, depfile, deptype,
-                                    rspfile, rspcontent, restat, generator);
+  cmGlobalNinjaGenerator::WriteRule(*this->RulesFileStream, rule);
 }
 
 bool cmGlobalNinjaGenerator::HasRule(const std::string& name)
@@ -1322,21 +1304,18 @@ void 
cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
   cmLocalGenerator* lg = this->LocalGenerators[0];
 
   {
-    std::string cmd = CMakeCmd();
-    cmd += " -S";
-    cmd += lg->ConvertToOutputFormat(lg->GetSourceDirectory(),
-                                     cmOutputConverter::SHELL);
-    cmd += " -B";
-    cmd += lg->ConvertToOutputFormat(lg->GetBinaryDirectory(),
-                                     cmOutputConverter::SHELL);
-    WriteRule(*this->RulesFileStream, "RERUN_CMAKE", cmd,
-              "Re-running CMake...", "Rule for re-running cmake.",
-              /*depfile=*/"",
-              /*deptype=*/"",
-              /*rspfile=*/"",
-              /*rspcontent*/ "",
-              /*restat=*/"",
-              /*generator=*/true);
+    cmNinjaRule rule("RERUN_CMAKE");
+    rule.Command = CMakeCmd();
+    rule.Command += " -S";
+    rule.Command += lg->ConvertToOutputFormat(lg->GetSourceDirectory(),
+                                              cmOutputConverter::SHELL);
+    rule.Command += " -B";
+    rule.Command += lg->ConvertToOutputFormat(lg->GetBinaryDirectory(),
+                                              cmOutputConverter::SHELL);
+    rule.Description = "Re-running CMake...";
+    rule.Comment = "Rule for re-running cmake.";
+    rule.Generator = true;
+    WriteRule(*this->RulesFileStream, rule);
   }
 
   cmNinjaDeps implicitDeps;
@@ -1358,20 +1337,15 @@ void 
cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os)
   cmake* cm = this->GetCMakeInstance();
   if (this->SupportsManifestRestat() && cm->DoWriteGlobVerifyTarget()) {
     {
-      std::string cmd = CMakeCmd();
-      cmd += " -P ";
-      cmd += lg->ConvertToOutputFormat(cm->GetGlobVerifyScript(),
-                                       cmOutputConverter::SHELL);
-
-      WriteRule(*this->RulesFileStream, "VERIFY_GLOBS", cmd,
-                "Re-checking globbed directories...",
-                "Rule for re-checking globbed directories.",
-                /*depfile=*/"",
-                /*deptype=*/"",
-                /*rspfile=*/"",
-                /*rspcontent*/ "",
-                /*restat=*/"",
-                /*generator=*/true);
+      cmNinjaRule rule("VERIFY_GLOBS");
+      rule.Command = CMakeCmd();
+      rule.Command += " -P ";
+      rule.Command += lg->ConvertToOutputFormat(cm->GetGlobVerifyScript(),
+                                                cmOutputConverter::SHELL);
+      rule.Description = "Re-checking globbed directories...";
+      rule.Comment = "Rule for re-checking globbed directories.";
+      rule.Generator = true;
+      this->WriteRule(*this->RulesFileStream, rule);
     }
 
     std::string verifyForce = cm->GetGlobVerifyScript() + "_force";
@@ -1507,19 +1481,14 @@ bool 
cmGlobalNinjaGenerator::WriteTargetCleanAdditional(std::ostream& os)
 
   // Write rule
   {
-    std::string cmd = CMakeCmd();
-    cmd += " -P ";
-    cmd += lgr->ConvertToOutputFormat(this->NinjaOutputPath(cleanScriptRel),
-                                      cmOutputConverter::SHELL);
-    WriteRule(*this->RulesFileStream, "CLEAN_ADDITIONAL", cmd,
-              "Cleaning additional files...",
-              "Rule for cleaning additional files.",
-              /*depfile=*/"",
-              /*deptype=*/"",
-              /*rspfile=*/"",
-              /*rspcontent*/ "",
-              /*restat=*/"",
-              /*generator=*/false);
+    cmNinjaRule rule("CLEAN_ADDITIONAL");
+    rule.Command = CMakeCmd();
+    rule.Command += " -P ";
+    rule.Command += lgr->ConvertToOutputFormat(
+      this->NinjaOutputPath(cleanScriptRel), cmOutputConverter::SHELL);
+    rule.Description = "Cleaning additional files...";
+    rule.Comment = "Rule for cleaning additional files.";
+    WriteRule(*this->RulesFileStream, rule);
   }
 
   // Write build
@@ -1546,15 +1515,13 @@ void 
cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
 
   // -- Default clean target
   // Write rule
-  WriteRule(*this->RulesFileStream, "CLEAN", NinjaCmd() + " -t clean",
-            "Cleaning all built files...",
-            "Rule for cleaning all built files.",
-            /*depfile=*/"",
-            /*deptype=*/"",
-            /*rspfile=*/"",
-            /*rspcontent*/ "",
-            /*restat=*/"",
-            /*generator=*/false);
+  {
+    cmNinjaRule rule("CLEAN");
+    rule.Command = NinjaCmd() + " -t clean";
+    rule.Description = "Cleaning all built files...";
+    rule.Comment = "Rule for cleaning all built files.";
+    WriteRule(*this->RulesFileStream, rule);
+  }
 
   // Write build
   {
@@ -1577,15 +1544,13 @@ void 
cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os)
 
 void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
 {
-  WriteRule(*this->RulesFileStream, "HELP", NinjaCmd() + " -t targets",
-            "All primary targets available:",
-            "Rule for printing all primary targets available.",
-            /*depfile=*/"",
-            /*deptype=*/"",
-            /*rspfile=*/"",
-            /*rspcontent*/ "",
-            /*restat=*/"",
-            /*generator=*/false);
+  {
+    cmNinjaRule rule("HELP");
+    rule.Command = NinjaCmd() + " -t targets";
+    rule.Description = "All primary targets available:";
+    rule.Comment = "Rule for printing all primary targets available.";
+    WriteRule(*this->RulesFileStream, rule);
+  }
   WriteBuild(os, "Print all primary targets available.", "HELP",
              /*outputs=*/cmNinjaDeps(1, this->NinjaOutputPath("help")),
              /*implicitOuts=*/cmNinjaDeps(),
diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h
index 47685c2..dcc358b 100644
--- a/Source/cmGlobalNinjaGenerator.h
+++ b/Source/cmGlobalNinjaGenerator.h
@@ -138,18 +138,10 @@ public:
                                const std::string& output);
 
   /**
-   * Write a rule statement named @a name to @a os with the @a comment,
-   * the mandatory @a command, the @a depfile and the @a description.
-   * It also writes the variables bound to this rule statement.
+   * Write a rule statement to @a os.
    * @warning no escaping of any kind is done here.
    */
-  static void WriteRule(std::ostream& os, const std::string& name,
-                        const std::string& command,
-                        const std::string& description,
-                        const std::string& comment, const std::string& depfile,
-                        const std::string& deptype, const std::string& rspfile,
-                        const std::string& rspcontent,
-                        const std::string& restat, bool generator);
+  static void WriteRule(std::ostream& os, cmNinjaRule const& rule);
 
   /**
    * Write a variable named @a name to @a os with value @a value and an
@@ -273,11 +265,7 @@ public:
    * Call WriteRule() behind the scene but perform some check before like:
    * - Do not add twice the same rule.
    */
-  void AddRule(const std::string& name, const std::string& command,
-               const std::string& description, const std::string& comment,
-               const std::string& depfile, const std::string& deptype,
-               const std::string& rspfile, const std::string& rspcontent,
-               const std::string& restat, bool generator);
+  void AddRule(cmNinjaRule const& rule);
 
   bool HasRule(const std::string& name);
 
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx 
b/Source/cmNinjaNormalTargetGenerator.cxx
index 77af45e..6e9e112 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -162,13 +162,8 @@ struct cmNinjaRemoveNoOpCommands
 
 void cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(bool useResponseFile)
 {
-  cmStateEnums::TargetType targetType = this->GetGeneratorTarget()->GetType();
-  std::string ruleName = this->LanguageLinkerDeviceRule();
-  // Select whether to use a response file for objects.
-  std::string rspfile;
-  std::string rspcontent;
-
-  if (!this->GetGlobalGenerator()->HasRule(ruleName)) {
+  cmNinjaRule rule(this->LanguageLinkerDeviceRule());
+  if (!this->GetGlobalGenerator()->HasRule(rule.Name)) {
     cmRulePlaceholderExpander::RuleVariables vars;
     vars.CMTargetName = this->GetGeneratorTarget()->GetName().c_str();
     vars.CMTargetType =
@@ -192,16 +187,16 @@ void 
cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(bool useResponseFile)
       } else {
         responseFlag = "@";
       }
-      rspfile = "$RSP_FILE";
-      responseFlag += rspfile;
+      rule.RspFile = "$RSP_FILE";
+      responseFlag += rule.RspFile;
 
       // build response file content
       if (this->GetGlobalGenerator()->IsGCCOnWindows()) {
-        rspcontent = "$in";
+        rule.RspContent = "$in";
       } else {
-        rspcontent = "$in_newline";
+        rule.RspContent = "$in_newline";
       }
-      rspcontent += " $LINK_LIBRARIES";
+      rule.RspContent += " $LINK_LIBRARIES";
       vars.Objects = responseFlag.c_str();
       vars.LinkLibraries = "";
     }
@@ -220,7 +215,7 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(bool 
useResponseFile)
     vars.Manifests = "$MANIFESTS";
 
     std::string langFlags;
-    if (targetType != cmStateEnums::EXECUTABLE) {
+    if (this->GetGeneratorTarget()->GetType() != cmStateEnums::EXECUTABLE) {
       langFlags += "$LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS";
       vars.LanguageCompileFlags = langFlags.c_str();
     }
@@ -247,39 +242,35 @@ void 
cmNinjaNormalTargetGenerator::WriteDeviceLinkRule(bool useResponseFile)
     // If there is no ranlib the command will be ":".  Skip it.
     cmEraseIf(linkCmds, cmNinjaRemoveNoOpCommands());
 
-    std::string linkCmd =
-      this->GetLocalGenerator()->BuildCommandLine(linkCmds);
+    rule.Command = this->GetLocalGenerator()->BuildCommandLine(linkCmds);
 
     // Write the linker rule with response file if needed.
-    std::ostringstream comment;
-    comment << "Rule for linking " << this->TargetLinkLanguage << " "
-            << this->GetVisibleTypeName() << ".";
-    std::ostringstream description;
-    description << "Linking " << this->TargetLinkLanguage << " "
-                << this->GetVisibleTypeName() << " $TARGET_FILE";
-    this->GetGlobalGenerator()->AddRule(ruleName, linkCmd, description.str(),
-                                        comment.str(),
-                                        /*depfile*/ "",
-                                        /*deptype*/ "", rspfile, rspcontent,
-                                        /*restat*/ "$RESTAT",
-                                        /*generator*/ false);
+    rule.Comment = "Rule for linking ";
+    rule.Comment += this->TargetLinkLanguage;
+    rule.Comment += " ";
+    rule.Comment += this->GetVisibleTypeName();
+    rule.Comment += ".";
+    rule.Description = "Linking ";
+    rule.Description += this->TargetLinkLanguage;
+    rule.Description += " ";
+    rule.Description += this->GetVisibleTypeName();
+    rule.Description += " $TARGET_FILE";
+    rule.Restat = "$RESTAT";
+
+    this->GetGlobalGenerator()->AddRule(rule);
   }
 }
 
 void cmNinjaNormalTargetGenerator::WriteLinkRule(bool useResponseFile)
 {
   cmStateEnums::TargetType targetType = this->GetGeneratorTarget()->GetType();
-  std::string ruleName = this->LanguageLinkerRule();
 
-  // Select whether to use a response file for objects.
-  std::string rspfile;
-  std::string rspcontent;
-
-  if (!this->GetGlobalGenerator()->HasRule(ruleName)) {
+  std::string linkRuleName = this->LanguageLinkerRule();
+  if (!this->GetGlobalGenerator()->HasRule(linkRuleName)) {
+    cmNinjaRule rule(std::move(linkRuleName));
     cmRulePlaceholderExpander::RuleVariables vars;
     vars.CMTargetName = this->GetGeneratorTarget()->GetName().c_str();
-    vars.CMTargetType =
-      cmState::GetTargetTypeName(this->GetGeneratorTarget()->GetType());
+    vars.CMTargetType = cmState::GetTargetTypeName(targetType);
 
     vars.Language = this->TargetLinkLanguage.c_str();
 
@@ -311,16 +302,16 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool 
useResponseFile)
       } else {
         responseFlag = "@";
       }
-      rspfile = "$RSP_FILE";
-      responseFlag += rspfile;
+      rule.RspFile = "$RSP_FILE";
+      responseFlag += rule.RspFile;
 
       // build response file content
       if (this->GetGlobalGenerator()->IsGCCOnWindows()) {
-        rspcontent = "$in";
+        rule.RspContent = "$in";
       } else {
-        rspcontent = "$in_newline";
+        rule.RspContent = "$in_newline";
       }
-      rspcontent += " $LINK_PATH $LINK_LIBRARIES";
+      rule.RspContent += " $LINK_PATH $LINK_LIBRARIES";
       if (this->TargetLinkLanguage == "Swift") {
         vars.SwiftSources = responseFlag.c_str();
       } else {
@@ -389,22 +380,21 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool 
useResponseFile)
 
     linkCmds.insert(linkCmds.begin(), "$PRE_LINK");
     linkCmds.emplace_back("$POST_BUILD");
-    std::string linkCmd =
-      this->GetLocalGenerator()->BuildCommandLine(linkCmds);
+    rule.Command = this->GetLocalGenerator()->BuildCommandLine(linkCmds);
 
     // Write the linker rule with response file if needed.
-    std::ostringstream comment;
-    comment << "Rule for linking " << this->TargetLinkLanguage << " "
-            << this->GetVisibleTypeName() << ".";
-    std::ostringstream description;
-    description << "Linking " << this->TargetLinkLanguage << " "
-                << this->GetVisibleTypeName() << " $TARGET_FILE";
-    this->GetGlobalGenerator()->AddRule(ruleName, linkCmd, description.str(),
-                                        comment.str(),
-                                        /*depfile*/ "",
-                                        /*deptype*/ "", rspfile, rspcontent,
-                                        /*restat*/ "$RESTAT",
-                                        /*generator*/ false);
+    rule.Comment = "Rule for linking ";
+    rule.Comment += this->TargetLinkLanguage;
+    rule.Comment += " ";
+    rule.Comment += this->GetVisibleTypeName();
+    rule.Comment += ".";
+    rule.Description = "Linking ";
+    rule.Description += this->TargetLinkLanguage;
+    rule.Description += " ";
+    rule.Description += this->GetVisibleTypeName();
+    rule.Description += " $TARGET_FILE";
+    rule.Restat = "$RESTAT";
+    this->GetGlobalGenerator()->AddRule(rule);
   }
 
   if (this->TargetNames.Output != this->TargetNames.Real &&
@@ -413,41 +403,28 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool 
useResponseFile)
       this->GetLocalGenerator()->ConvertToOutputFormat(
         cmSystemTools::GetCMakeCommand(), cmOutputConverter::SHELL);
     if (targetType == cmStateEnums::EXECUTABLE) {
-      std::vector<std::string> commandLines;
-      commandLines.push_back(cmakeCommand +
-                             " -E cmake_symlink_executable $in $out");
-      commandLines.emplace_back("$POST_BUILD");
-
-      this->GetGlobalGenerator()->AddRule(
-        "CMAKE_SYMLINK_EXECUTABLE",
-        this->GetLocalGenerator()->BuildCommandLine(commandLines),
-        "Creating executable symlink $out",
-        "Rule for creating "
-        "executable symlink.",
-        /*depfile*/ "",
-        /*deptype*/ "",
-        /*rspfile*/ "",
-        /*rspcontent*/ "",
-        /*restat*/ "",
-        /*generator*/ false);
+      cmNinjaRule rule("CMAKE_SYMLINK_EXECUTABLE");
+      {
+        std::vector<std::string> cmd;
+        cmd.push_back(cmakeCommand + " -E cmake_symlink_executable $in $out");
+        cmd.emplace_back("$POST_BUILD");
+        rule.Command = this->GetLocalGenerator()->BuildCommandLine(cmd);
+      }
+      rule.Description = "Creating executable symlink $out";
+      rule.Comment = "Rule for creating executable symlink.";
+      this->GetGlobalGenerator()->AddRule(rule);
     } else {
-      std::vector<std::string> commandLines;
-      commandLines.push_back(cmakeCommand +
-                             " -E cmake_symlink_library $in $SONAME $out");
-      commandLines.emplace_back("$POST_BUILD");
-
-      this->GetGlobalGenerator()->AddRule(
-        "CMAKE_SYMLINK_LIBRARY",
-        this->GetLocalGenerator()->BuildCommandLine(commandLines),
-        "Creating library symlink $out",
-        "Rule for creating "
-        "library symlink.",
-        /*depfile*/ "",
-        /*deptype*/ "",
-        /*rspfile*/ "",
-        /*rspcontent*/ "",
-        /*restat*/ "",
-        /*generator*/ false);
+      cmNinjaRule rule("CMAKE_SYMLINK_LIBRARY");
+      {
+        std::vector<std::string> cmd;
+        cmd.push_back(cmakeCommand +
+                      " -E cmake_symlink_library $in $SONAME $out");
+        cmd.emplace_back("$POST_BUILD");
+        rule.Command = this->GetLocalGenerator()->BuildCommandLine(cmd);
+      }
+      rule.Description = "Creating library symlink $out";
+      rule.Comment = "Rule for creating library symlink.";
+      this->GetGlobalGenerator()->AddRule(rule);
     }
   }
 }
diff --git a/Source/cmNinjaTargetGenerator.cxx 
b/Source/cmNinjaTargetGenerator.cxx
index 9652a51..5b8ed90 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -495,9 +495,10 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
       cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
 
   if (explicitPP) {
+    cmNinjaRule rule(this->LanguagePreprocessRule(lang));
     // Explicit preprocessing always uses a depfile.
-    std::string const ppDeptype; // no deps= for multiple outputs
-    std::string const ppDepfile = "$DEP_FILE";
+    rule.DepType = ""; // no deps= for multiple outputs
+    rule.DepFile = "$DEP_FILE";
 
     cmRulePlaceholderExpander::RuleVariables ppVars;
     ppVars.CMTargetName = vars.CMTargetName;
@@ -505,7 +506,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
     ppVars.Language = vars.Language;
     ppVars.Object = "$out"; // for RULE_LAUNCH_COMPILE
     ppVars.PreprocessedSource = "$out";
-    ppVars.DependencyFile = ppDepfile.c_str();
+    ppVars.DependencyFile = rule.DepFile.c_str();
 
     // Preprocessing uses the original source,
     // compilation uses preprocessed output.
@@ -524,17 +525,15 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
     ppVars.Includes = vars.Includes;
 
     // If using a response file, move defines, includes, and flags into it.
-    std::string ppRspFile;
-    std::string ppRspContent;
     if (!responseFlag.empty()) {
-      ppRspFile = "$RSP_FILE";
-      ppRspContent = " ";
-      ppRspContent += ppVars.Defines;
-      ppRspContent += " ";
-      ppRspContent += ppVars.Includes;
-      ppRspContent += " ";
-      ppRspContent += ppFlags;
-      ppFlags = responseFlag + ppRspFile;
+      rule.RspFile = "$RSP_FILE";
+      rule.RspContent = " ";
+      rule.RspContent += ppVars.Defines;
+      rule.RspContent += " ";
+      rule.RspContent += ppVars.Includes;
+      rule.RspContent += " ";
+      rule.RspContent += ppFlags;
+      ppFlags = responseFlag + rule.RspFile;
       ppVars.Defines = "";
       ppVars.Includes = "";
     }
@@ -570,31 +569,25 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
       }
       ppCmds.emplace_back(std::move(ccmd));
     }
-    std::string const ppCmdLine =
-      this->GetLocalGenerator()->BuildCommandLine(ppCmds);
+    rule.Command = this->GetLocalGenerator()->BuildCommandLine(ppCmds);
 
     // Write the rule for preprocessing file of the given language.
-    std::string ppComment = "Rule for preprocessing ";
-    ppComment += lang;
-    ppComment += " files.";
-    std::string ppDesc = "Building ";
-    ppDesc += lang;
-    ppDesc += " preprocessed $out";
-    this->GetGlobalGenerator()->AddRule(
-      this->LanguagePreprocessRule(lang), ppCmdLine, ppDesc, ppComment,
-      ppDepfile, ppDeptype, ppRspFile, ppRspContent,
-      /*restat*/ "",
-      /*generator*/ false);
+    rule.Comment = "Rule for preprocessing ";
+    rule.Comment += lang;
+    rule.Comment += " files.";
+    rule.Description = "Building ";
+    rule.Description += lang;
+    rule.Description += " preprocessed $out";
+    this->GetGlobalGenerator()->AddRule(rule);
   }
 
   if (needDyndep) {
     // Write the rule for ninja dyndep file generation.
-
+    cmNinjaRule rule(this->LanguageDyndepRule(lang));
     // Command line length is almost always limited -> use response file for
     // dyndep rules
-    std::string ddRspFile = "$out.rsp";
-    std::string ddRspContent = "$in";
-    std::string ddCmdLine;
+    rule.RspFile = "$out.rsp";
+    rule.RspContent = "$in";
 
     // Run CMake dependency scanner on the source file (using the preprocessed
     // source if that was performed).
@@ -608,53 +601,49 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
         ccmd += lang;
         ccmd += " --dd=$out ";
         ccmd += "@";
-        ccmd += ddRspFile;
+        ccmd += rule.RspFile;
         ddCmds.emplace_back(std::move(ccmd));
       }
-      ddCmdLine = this->GetLocalGenerator()->BuildCommandLine(ddCmds);
+      rule.Command = this->GetLocalGenerator()->BuildCommandLine(ddCmds);
     }
-    std::string ddComment = "Rule to generate ninja dyndep files for ";
-    ddComment += lang;
-    ddComment += ".";
-    std::string ddDesc = "Generating ";
-    ddDesc += lang;
-    ddDesc += " dyndep file $out";
-    this->GetGlobalGenerator()->AddRule(this->LanguageDyndepRule(lang),
-                                        ddCmdLine, ddDesc, ddComment,
-                                        /*depfile*/ "",
-                                        /*deps*/ "", ddRspFile, ddRspContent,
-                                        /*restat*/ "",
-                                        /*generator*/ false);
+    rule.Comment = "Rule to generate ninja dyndep files for ";
+    rule.Comment += lang;
+    rule.Comment += ".";
+    rule.Description = "Generating ";
+    rule.Description += lang;
+    rule.Description += " dyndep file $out";
+    this->GetGlobalGenerator()->AddRule(rule);
   }
 
+  cmNinjaRule rule(this->LanguageCompilerRule(lang));
   // If using a response file, move defines, includes, and flags into it.
-  std::string rspfile;
-  std::string rspcontent;
   if (!responseFlag.empty()) {
-    rspfile = "$RSP_FILE";
-    rspcontent =
-      std::string(" ") + vars.Defines + " " + vars.Includes + " " + flags;
-    flags = responseFlag + rspfile;
+    rule.RspFile = "$RSP_FILE";
+    rule.RspContent = " ";
+    rule.RspContent += vars.Defines;
+    rule.RspContent += " ";
+    rule.RspContent += vars.Includes;
+    rule.RspContent += " ";
+    rule.RspContent += flags;
+    flags = responseFlag + rule.RspFile;
     vars.Defines = "";
     vars.Includes = "";
   }
 
   // Tell ninja dependency format so all deps can be loaded into a database
-  std::string deptype;
-  std::string depfile;
   std::string cldeps;
   if (explicitPP) {
     // The explicit preprocessing step will handle dependency scanning.
   } else if (this->NeedDepTypeMSVC(lang)) {
-    deptype = "msvc";
-    depfile.clear();
+    rule.DepType = "msvc";
+    rule.DepFile.clear();
     flags += " /showIncludes";
   } else if (mf->IsOn("CMAKE_NINJA_CMCLDEPS_" + lang)) {
     // For the MS resource compiler we need cmcldeps, but skip dependencies
     // for source-file try_compile cases because they are always fresh.
     if (!mf->GetIsSourceFileTryCompile()) {
-      deptype = "gcc";
-      depfile = "$DEP_FILE";
+      rule.DepType = "gcc";
+      rule.DepFile = "$DEP_FILE";
       const std::string cl = mf->GetDefinition("CMAKE_C_COMPILER")
         ? mf->GetSafeDefinition("CMAKE_C_COMPILER")
         : mf->GetSafeDefinition("CMAKE_CXX_COMPILER");
@@ -665,8 +654,8 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
       cldeps += "\" \"" + cl + "\" ";
     }
   } else {
-    deptype = "gcc";
-    depfile = "$DEP_FILE";
+    rule.DepType = "gcc";
+    rule.DepFile = "$DEP_FILE";
     const std::string flagsName = "CMAKE_DEPFILE_FLAGS_" + lang;
     std::string depfileFlags = mf->GetSafeDefinition(flagsName);
     if (!depfileFlags.empty()) {
@@ -679,7 +668,7 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
   }
 
   vars.Flags = flags.c_str();
-  vars.DependencyFile = depfile.c_str();
+  vars.DependencyFile = rule.DepFile.c_str();
 
   // Rule for compiling object file.
   std::vector<std::string> compileCmds;
@@ -784,21 +773,16 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
                                                  vars);
   }
 
-  std::string cmdLine =
-    this->GetLocalGenerator()->BuildCommandLine(compileCmds);
+  rule.Command = this->GetLocalGenerator()->BuildCommandLine(compileCmds);
 
   // Write the rule for compiling file of the given language.
-  std::string comment = "Rule for compiling ";
-  comment += lang;
-  comment += " files.";
-  std::string description = "Building ";
-  description += lang;
-  description += " object $out";
-  this->GetGlobalGenerator()->AddRule(this->LanguageCompilerRule(lang),
-                                      cmdLine, description, comment, depfile,
-                                      deptype, rspfile, rspcontent,
-                                      /*restat*/ "",
-                                      /*generator*/ false);
+  rule.Comment = "Rule for compiling ";
+  rule.Comment += lang;
+  rule.Comment += " files.";
+  rule.Description = "Building ";
+  rule.Description += lang;
+  rule.Description += " object $out";
+  this->GetGlobalGenerator()->AddRule(rule);
 }
 
 void cmNinjaTargetGenerator::WriteObjectBuildStatements()

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=6a23fbce47294e746c15ee851dc3460a3a17da2b
commit 6a23fbce47294e746c15ee851dc3460a3a17da2b
Author:     Sebastian Holtermann <sebh...@xwmw.org>
AuthorDate: Wed May 29 11:48:22 2019 +0200
Commit:     Sebastian Holtermann <sebh...@xwmw.org>
CommitDate: Wed May 29 12:59:31 2019 +0200

    Ninja: Add cmNinjaRule class

diff --git a/Source/cmNinjaTypes.h b/Source/cmNinjaTypes.h
index 9e962f1..78f3917 100644
--- a/Source/cmNinjaTypes.h
+++ b/Source/cmNinjaTypes.h
@@ -8,6 +8,7 @@
 #include <map>
 #include <set>
 #include <string>
+#include <utility>
 #include <vector>
 
 enum cmNinjaTargetDepends
@@ -20,4 +21,24 @@ typedef std::vector<std::string> cmNinjaDeps;
 typedef std::set<std::string> cmNinjaOuts;
 typedef std::map<std::string, std::string> cmNinjaVars;
 
+class cmNinjaRule
+{
+public:
+  cmNinjaRule(std::string name)
+    : Name(std::move(name))
+  {
+  }
+
+  std::string Name;
+  std::string Command;
+  std::string Description;
+  std::string Comment;
+  std::string DepFile;
+  std::string DepType;
+  std::string RspFile;
+  std::string RspContent;
+  std::string Restat;
+  bool Generator = false;
+};
+
 #endif // ! cmNinjaTypes_h

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

Summary of changes:
 CompileFlags.cmake                        |  11 +-
 Source/cmCTest.cxx                        |   4 +-
 Source/cmCallVisualStudioMacro.cxx        |  12 +-
 Source/cmGlobalGenerator.cxx              |  15 ++-
 Source/cmGlobalNinjaGenerator.cxx         | 187 ++++++++++++------------------
 Source/cmGlobalNinjaGenerator.h           |  18 +--
 Source/cmNinjaNormalTargetGenerator.cxx   | 153 +++++++++++-------------
 Source/cmNinjaTargetGenerator.cxx         | 128 +++++++++-----------
 Source/cmNinjaTypes.h                     |  21 ++++
 Source/cmSystemTools.cxx                  |  12 +-
 Source/cmSystemTools.h                    |   6 +-
 Source/cmcmd.cxx                          |   8 +-
 Utilities/cmjsoncpp/include/json/config.h |  10 +-
 13 files changed, 268 insertions(+), 317 deletions(-)


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
https://cmake.org/mailman/listinfo/cmake-commits

Reply via email to