From b83fe27d8d3f25ed6e229270966b8323f5fc3ae5 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Thu, 1 Nov 2018 10:37:53 -0400
Subject: fileapi: Report cmake generator in reply index file

---
 Help/manual/cmake-file-api.7.rst          | 13 +++++++++++++
 Source/cmFileAPI.cxx                      |  2 ++
 Source/cmGlobalGenerator.cxx              |  9 +++++++++
 Source/cmGlobalGenerator.h                |  6 ++++++
 Source/cmGlobalVisualStudio7Generator.cxx |  9 +++++++++
 Source/cmGlobalVisualStudio7Generator.h   |  4 ++++
 Tests/RunCMake/FileAPI/check_index.py     | 13 ++++++++++++-
 7 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/Help/manual/cmake-file-api.7.rst b/Help/manual/cmake-file-api.7.rst
index f5e4eeb..a1b4830 100644
--- a/Help/manual/cmake-file-api.7.rst
+++ b/Help/manual/cmake-file-api.7.rst
@@ -197,6 +197,9 @@ The reply index file contains a JSON object:
         "ctest": "/prefix/bin/ctest",
         "cpack": "/prefix/bin/cpack",
         "root": "/prefix/share/cmake-3.14"
+      },
+      "generator": {
+        "name": "Unix Makefiles"
       }
     },
     "objects": [
@@ -260,6 +263,16 @@ The members are:
     the absolute path to the directory containing CMake resources like the
     ``Modules/`` directory (see :variable:`CMAKE_ROOT`).
 
+  ``generator``
+    A JSON object describing the CMake generator used for the build.
+    It has members:
+
+    ``name``
+      A string specifying the name of the generator.
+    ``platform``
+      If the generator supports :variable:`CMAKE_GENERATOR_PLATFORM`,
+      this is a string specifying the generator platform name.
+
 ``objects``
   A JSON array listing all versions of all `Object Kinds`_ generated
   as part of the reply.  Each array entry is a
diff --git a/Source/cmFileAPI.cxx b/Source/cmFileAPI.cxx
index 2fa5495..1a41370 100644
--- a/Source/cmFileAPI.cxx
+++ b/Source/cmFileAPI.cxx
@@ -4,6 +4,7 @@
 
 #include "cmAlgorithms.h"
 #include "cmCryptoHash.h"
+#include "cmGlobalGenerator.h"
 #include "cmSystemTools.h"
 #include "cmTimestamp.h"
 #include "cmake.h"
@@ -311,6 +312,7 @@ Json::Value cmFileAPI::BuildCMake()
   cmake_paths["ctest"] = cmSystemTools::GetCTestCommand();
   cmake_paths["cpack"] = cmSystemTools::GetCPackCommand();
   cmake_paths["root"] = cmSystemTools::GetCMakeRoot();
+  cmake["generator"] = this->CMakeInstance->GetGlobalGenerator()->GetJson();
   return cmake;
 }
 
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 8b20db6..35d716c 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -112,6 +112,15 @@ cmGlobalGenerator::~cmGlobalGenerator()
   delete this->ExtraGenerator;
 }
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+Json::Value cmGlobalGenerator::GetJson() const
+{
+  Json::Value generator = Json::objectValue;
+  generator["name"] = this->GetName();
+  return generator;
+}
+#endif
+
 bool cmGlobalGenerator::SetGeneratorInstance(std::string const& i,
                                              cmMakefile* mf)
 {
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 1ea2d24..4e6b6de 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -24,6 +24,7 @@
 
 #if defined(CMAKE_BUILD_WITH_CMAKE)
 #  include "cmFileLockPool.h"
+#  include "cm_jsoncpp_value.h"
 #endif
 
 #define CMAKE_DIRECTORY_ID_SEP "::@"
@@ -70,6 +71,11 @@ public:
     return codecvt::None;
   }
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+  /** Get a JSON object describing the generator.  */
+  virtual Json::Value GetJson() const;
+#endif
+
   /** Tell the generator about the target system.  */
   virtual bool SetSystemName(std::string const&, cmMakefile*) { return true; }
 
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index 21121f2..1be80ac 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -254,6 +254,15 @@ cmLocalGenerator* cmGlobalVisualStudio7Generator::CreateLocalGenerator(
   return lg;
 }
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+Json::Value cmGlobalVisualStudio7Generator::GetJson() const
+{
+  Json::Value generator = this->cmGlobalVisualStudioGenerator::GetJson();
+  generator["platform"] = this->GetPlatformName();
+  return generator;
+}
+#endif
+
 std::string const& cmGlobalVisualStudio7Generator::GetPlatformName() const
 {
   if (!this->GeneratorPlatform.empty()) {
diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h
index 251478d..59e7a98 100644
--- a/Source/cmGlobalVisualStudio7Generator.h
+++ b/Source/cmGlobalVisualStudio7Generator.h
@@ -28,6 +28,10 @@ public:
   ///! Create a local generator appropriate to this Global Generator
   cmLocalGenerator* CreateLocalGenerator(cmMakefile* mf) override;
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+  Json::Value GetJson() const override;
+#endif
+
   bool SetSystemName(std::string const& s, cmMakefile* mf) override;
 
   bool SetGeneratorPlatform(std::string const& p, cmMakefile* mf) override;
diff --git a/Tests/RunCMake/FileAPI/check_index.py b/Tests/RunCMake/FileAPI/check_index.py
index 4d90d59..d8eaecb 100644
--- a/Tests/RunCMake/FileAPI/check_index.py
+++ b/Tests/RunCMake/FileAPI/check_index.py
@@ -23,9 +23,10 @@ def is_string(x):
 
 def check_cmake(cmake):
     assert is_dict(cmake)
-    assert sorted(cmake.keys()) == ["paths", "version"]
+    assert sorted(cmake.keys()) == ["generator", "paths", "version"]
     check_cmake_version(cmake["version"])
     check_cmake_paths(cmake["paths"])
+    check_cmake_generator(cmake["generator"])
 
 def check_cmake_version(v):
     assert is_dict(v)
@@ -45,6 +46,16 @@ def check_cmake_paths(v):
     assert is_string(v["ctest"])
     assert is_string(v["root"])
 
+def check_cmake_generator(g):
+    assert is_dict(g)
+    name = g.get("name", None)
+    assert is_string(name)
+    if name.startswith("Visual Studio"):
+        assert sorted(g.keys()) == ["name", "platform"]
+        assert is_string(g["platform"])
+    else:
+        assert sorted(g.keys()) == ["name"]
+
 def check_index_object(indexEntry, kind, major, minor, check):
     assert is_dict(indexEntry)
     assert sorted(indexEntry.keys()) == ["jsonFile", "kind", "version"]
-- 
cgit v0.12