From c8ba777f6dfd7a5d8a4c4fa7b420bbdb5b93b366 Mon Sep 17 00:00:00 2001
From: Stephan Szabo <stephan.szabo@sony.com>
Date: Thu, 3 Jan 2019 12:54:24 -0800
Subject: GlobalVisualStudio10Generator: Support non-standard toolset json flag
 files.

If given a toolset that does not have an explicit mapping in
cmVisualStudio10ToolsetOptions, check for a json flag file using the
toolset name before trying the default toolset for the generator.
---
 Source/cmGlobalVisualStudio10Generator.cxx | 116 ++++++++++++++++++++---------
 Source/cmGlobalVisualStudio10Generator.h   |   4 +-
 Source/cmVisualStudio10ToolsetOptions.cxx  |  30 +++-----
 Source/cmVisualStudio10ToolsetOptions.h    |  20 ++---
 4 files changed, 100 insertions(+), 70 deletions(-)

diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index c9c6938..f18798d 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -1123,14 +1123,32 @@ static cmIDEFlagTable const* cmLoadFlagTableJson(
   return ret;
 }
 
+static std::string cmGetFlagTableName(std::string const& toolsetName,
+                                      std::string const& table)
+{
+  return cmSystemTools::GetCMakeRoot() + "/Templates/MSBuild/FlagTables/" +
+    toolsetName + "_" + table + ".json";
+}
+
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::LoadFlagTable(
-  std::string const& flagTableName, std::string const& table) const
+  std::string const& optionsName, std::string const& toolsetName,
+  std::string const& defaultName, std::string const& table) const
 {
   cmIDEFlagTable const* ret = nullptr;
 
-  std::string filename = cmSystemTools::GetCMakeRoot() +
-    "/Templates/MSBuild/FlagTables/" + flagTableName + "_" + table + ".json";
-  ret = cmLoadFlagTableJson(filename);
+  std::string filename;
+  if (!optionsName.empty()) {
+    filename = cmGetFlagTableName(optionsName, table);
+    ret = cmLoadFlagTableJson(filename);
+  } else {
+    filename = cmGetFlagTableName(toolsetName, table);
+    if (cmSystemTools::FileExists(filename)) {
+      ret = cmLoadFlagTableJson(filename);
+    } else {
+      filename = cmGetFlagTableName(defaultName, table);
+      ret = cmLoadFlagTableJson(filename);
+    }
+  }
 
   if (!ret) {
     cmMakefile* mf = this->GetCurrentMakefile();
@@ -1147,71 +1165,95 @@ cmIDEFlagTable const* cmGlobalVisualStudio10Generator::LoadFlagTable(
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetClFlagTable() const
 {
-  std::string flagTableName = this->ToolsetOptions.GetClFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultCLFlagTableName);
-
-  return LoadFlagTable(flagTableName, "CL");
+  std::string optionsName = this->ToolsetOptions.GetClFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultCLFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "CL");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetCSharpFlagTable()
   const
 {
-  std::string flagTableName = this->ToolsetOptions.GetCSharpFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultCSharpFlagTableName);
-
-  return LoadFlagTable(flagTableName, "CSharp");
+  std::string optionsName = this->ToolsetOptions.GetCSharpFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultCSharpFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "CSharp");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetRcFlagTable() const
 {
-  std::string flagTableName = this->ToolsetOptions.GetRcFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultRCFlagTableName);
-
-  return LoadFlagTable(flagTableName, "RC");
+  std::string optionsName = this->ToolsetOptions.GetRcFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultRCFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "RC");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetLibFlagTable() const
 {
-  std::string flagTableName = this->ToolsetOptions.GetLibFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultLibFlagTableName);
-
-  return LoadFlagTable(flagTableName, "LIB");
+  std::string optionsName = this->ToolsetOptions.GetLibFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultLibFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "LIB");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetLinkFlagTable() const
 {
-  std::string flagTableName = this->ToolsetOptions.GetLinkFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultLinkFlagTableName);
-
-  return LoadFlagTable(flagTableName, "Link");
+  std::string optionsName = this->ToolsetOptions.GetLinkFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultLinkFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "Link");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetCudaFlagTable() const
 {
-  return LoadFlagTable(this->DefaultCudaFlagTableName, "Cuda");
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultCudaFlagTableName);
+  return LoadFlagTable("", toolsetName, defaultName, "Cuda");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetCudaHostFlagTable()
   const
 {
-  return LoadFlagTable(this->DefaultCudaHostFlagTableName, "CudaHost");
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultCudaHostFlagTableName);
+  return LoadFlagTable("", toolsetName, defaultName, "CudaHost");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetMasmFlagTable() const
 {
-  std::string flagTableName = this->ToolsetOptions.GetMasmFlagTableName(
-    this->GetPlatformName(), this->GetPlatformToolsetString(),
-    this->DefaultMasmFlagTableName);
-
-  return LoadFlagTable(flagTableName, "MASM");
+  std::string optionsName = this->ToolsetOptions.GetMasmFlagTableName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultMasmFlagTableName);
+  return LoadFlagTable(optionsName, toolsetName, defaultName, "MASM");
 }
 
 cmIDEFlagTable const* cmGlobalVisualStudio10Generator::GetNasmFlagTable() const
 {
-  return LoadFlagTable(this->DefaultNasmFlagTableName, "NASM");
+  std::string toolsetName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->GetPlatformToolsetString());
+  std::string defaultName = this->ToolsetOptions.GetToolsetName(
+    this->GetPlatformName(), this->DefaultNasmFlagTableName);
+  return LoadFlagTable("", toolsetName, defaultName, "NASM");
 }
diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h
index 15244ac..ab55f06 100644
--- a/Source/cmGlobalVisualStudio10Generator.h
+++ b/Source/cmGlobalVisualStudio10Generator.h
@@ -144,7 +144,9 @@ protected:
 
   std::string const& GetMSBuildCommand();
 
-  cmIDEFlagTable const* LoadFlagTable(std::string const& flagTableName,
+  cmIDEFlagTable const* LoadFlagTable(std::string const& optionsName,
+                                      std::string const& toolsetName,
+                                      std::string const& defaultName,
                                       std::string const& table) const;
 
   std::string GeneratorToolset;
diff --git a/Source/cmVisualStudio10ToolsetOptions.cxx b/Source/cmVisualStudio10ToolsetOptions.cxx
index f71b8b7..39063ed 100644
--- a/Source/cmVisualStudio10ToolsetOptions.cxx
+++ b/Source/cmVisualStudio10ToolsetOptions.cxx
@@ -7,8 +7,7 @@
 #include "cmVisualStudioGeneratorOptions.h"
 
 std::string cmVisualStudio10ToolsetOptions::GetClFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -23,13 +22,12 @@ std::string cmVisualStudio10ToolsetOptions::GetClFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
 std::string cmVisualStudio10ToolsetOptions::GetCSharpFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -44,13 +42,12 @@ std::string cmVisualStudio10ToolsetOptions::GetCSharpFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
 std::string cmVisualStudio10ToolsetOptions::GetRcFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -63,13 +60,12 @@ std::string cmVisualStudio10ToolsetOptions::GetRcFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
 std::string cmVisualStudio10ToolsetOptions::GetLibFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -82,13 +78,12 @@ std::string cmVisualStudio10ToolsetOptions::GetLibFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
 std::string cmVisualStudio10ToolsetOptions::GetLinkFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -103,13 +98,12 @@ std::string cmVisualStudio10ToolsetOptions::GetLinkFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
 std::string cmVisualStudio10ToolsetOptions::GetMasmFlagTableName(
-  std::string const& name, std::string const& toolset,
-  std::string const& defaultToolset) const
+  std::string const& name, std::string const& toolset) const
 {
   std::string const useToolset = this->GetToolsetName(name, toolset);
 
@@ -122,7 +116,7 @@ std::string cmVisualStudio10ToolsetOptions::GetMasmFlagTableName(
   } else if (useToolset == "v100") {
     return "v10";
   } else {
-    return this->GetToolsetName(name, defaultToolset);
+    return "";
   }
 }
 
diff --git a/Source/cmVisualStudio10ToolsetOptions.h b/Source/cmVisualStudio10ToolsetOptions.h
index 43946f0..875a35b 100644
--- a/Source/cmVisualStudio10ToolsetOptions.h
+++ b/Source/cmVisualStudio10ToolsetOptions.h
@@ -16,25 +16,17 @@ class cmVisualStudio10ToolsetOptions
 {
 public:
   std::string GetClFlagTableName(std::string const& name,
-                                 std::string const& toolset,
-                                 std::string const& defaultToolset) const;
+                                 std::string const& toolset) const;
   std::string GetCSharpFlagTableName(std::string const& name,
-                                     std::string const& toolset,
-                                     std::string const& defaultToolset) const;
+                                     std::string const& toolset) const;
   std::string GetRcFlagTableName(std::string const& name,
-                                 std::string const& toolset,
-                                 std::string const& defaultToolset) const;
+                                 std::string const& toolset) const;
   std::string GetLibFlagTableName(std::string const& name,
-                                  std::string const& toolset,
-                                  std::string const& defaultToolset) const;
+                                  std::string const& toolset) const;
   std::string GetLinkFlagTableName(std::string const& name,
-                                   std::string const& toolset,
-                                   std::string const& defaultToolset) const;
+                                   std::string const& toolset) const;
   std::string GetMasmFlagTableName(std::string const& name,
-                                   std::string const& toolset,
-                                   std::string const& defaultToolset) const;
-
-private:
+                                   std::string const& toolset) const;
   std::string GetToolsetName(std::string const& name,
                              std::string const& toolset) const;
 };
-- 
cgit v0.12