From 807fca4ce67e4c95133082060b82fdecca30fcde Mon Sep 17 00:00:00 2001
From: Patrick Gansterer <paroga@paroga.com>
Date: Mon, 16 Aug 2010 21:49:14 +0200
Subject: [PATCH 1/4] VS: Convert PlatformName member to a virtual method

---
 Source/cmGlobalVisualStudio10Generator.cxx      |  2 +-
 Source/cmGlobalVisualStudio10Win64Generator.cxx |  1 -
 Source/cmGlobalVisualStudio10Win64Generator.h   |  2 ++
 Source/cmGlobalVisualStudio8Generator.cxx       | 14 +++++++-------
 Source/cmGlobalVisualStudio8Generator.h         |  5 ++---
 Source/cmGlobalVisualStudio8Win64Generator.cxx  |  3 +--
 Source/cmGlobalVisualStudio8Win64Generator.h    |  2 ++
 Source/cmGlobalVisualStudio9Generator.cxx       |  1 +
 Source/cmGlobalVisualStudio9Win64Generator.cxx  |  3 +--
 Source/cmGlobalVisualStudio9Win64Generator.h    |  2 ++
 10 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx
index 691502f1a..403507f98 100644
--- a/Source/cmGlobalVisualStudio10Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Generator.cxx
@@ -40,7 +40,7 @@ void cmGlobalVisualStudio10Generator::WriteSLNHeader(std::ostream& fout)
 cmLocalGenerator *cmGlobalVisualStudio10Generator::CreateLocalGenerator()
 {
   cmLocalVisualStudio10Generator* lg =  new cmLocalVisualStudio10Generator;
-  lg->SetPlatformName(this->PlatformName.c_str());
+  lg->SetPlatformName(this->GetPlatformName());
   lg->SetGlobalGenerator(this);
   return lg;
 }
diff --git a/Source/cmGlobalVisualStudio10Win64Generator.cxx b/Source/cmGlobalVisualStudio10Win64Generator.cxx
index 1004fa98f..109b60d1f 100644
--- a/Source/cmGlobalVisualStudio10Win64Generator.cxx
+++ b/Source/cmGlobalVisualStudio10Win64Generator.cxx
@@ -16,7 +16,6 @@
 //----------------------------------------------------------------------------
 cmGlobalVisualStudio10Win64Generator::cmGlobalVisualStudio10Win64Generator()
 {
-  this->PlatformName = "x64";
 }
 
 //----------------------------------------------------------------------------
diff --git a/Source/cmGlobalVisualStudio10Win64Generator.h b/Source/cmGlobalVisualStudio10Win64Generator.h
index 98ba03ceb..39c9d081b 100644
--- a/Source/cmGlobalVisualStudio10Win64Generator.h
+++ b/Source/cmGlobalVisualStudio10Win64Generator.h
@@ -27,6 +27,8 @@ public:
     return cmGlobalVisualStudio10Win64Generator::GetActualName();}
   static const char* GetActualName() {return "Visual Studio 10 Win64";}
 
+  virtual const char* GetPlatformName() const {return "x64";}
+
   /** Get the documentation entry for this generator.  */
   virtual void GetDocumentation(cmDocumentationEntry& entry) const;
 
diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
index 6e0f0480e..c4de91efc 100644
--- a/Source/cmGlobalVisualStudio8Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Generator.cxx
@@ -21,7 +21,6 @@ cmGlobalVisualStudio8Generator::cmGlobalVisualStudio8Generator()
 {
   this->FindMakeProgramFile = "CMakeVS8FindMake.cmake";
   this->ProjectConfigurationSectionName = "ProjectConfigurationPlatforms";
-  this->PlatformName = "Win32";
 }
 
 //----------------------------------------------------------------------------
@@ -30,6 +29,7 @@ cmLocalGenerator *cmGlobalVisualStudio8Generator::CreateLocalGenerator()
 {
   cmLocalVisualStudio7Generator *lg = new cmLocalVisualStudio7Generator;
   lg->SetVersion8();
+  lg->SetPlatformName(this->GetPlatformName());
   lg->SetExtraFlagTable(this->GetExtraFlagTableVS8());
   lg->SetGlobalGenerator(this);
   return lg;
@@ -252,8 +252,8 @@ cmGlobalVisualStudio8Generator
   for(std::vector<std::string>::iterator i = this->Configurations.begin();
       i != this->Configurations.end(); ++i)
     {
-    fout << "\t\t" << *i << "|" << this->PlatformName << " = " << *i << "|"
-         << this->PlatformName << "\n";
+    fout << "\t\t" << *i << "|" << this->GetPlatformName() << " = " << *i << "|"
+         << this->GetPlatformName() << "\n";
     }
   fout << "\tEndGlobalSection\n";
 }
@@ -269,13 +269,13 @@ cmGlobalVisualStudio8Generator
       i != this->Configurations.end(); ++i)
     {
     fout << "\t\t{" << guid << "}." << *i
-         << "|" << this->PlatformName << ".ActiveCfg = "
-         << *i << "|" << this->PlatformName << "\n";
+         << "|" << this->GetPlatformName() << ".ActiveCfg = "
+         << *i << "|" << this->GetPlatformName() << "\n";
     if(partOfDefaultBuild)
       {
       fout << "\t\t{" << guid << "}." << *i
-           << "|" << this->PlatformName << ".Build.0 = "
-           << *i << "|" << this->PlatformName << "\n";
+           << "|" << this->GetPlatformName() << ".Build.0 = "
+           << *i << "|" << this->GetPlatformName() << "\n";
       }
     }
 }
diff --git a/Source/cmGlobalVisualStudio8Generator.h b/Source/cmGlobalVisualStudio8Generator.h
index 9d836bda3..ceee53bcc 100644
--- a/Source/cmGlobalVisualStudio8Generator.h
+++ b/Source/cmGlobalVisualStudio8Generator.h
@@ -32,14 +32,14 @@ public:
     return cmGlobalVisualStudio8Generator::GetActualName();}
   static const char* GetActualName() {return "Visual Studio 8 2005";}
 
+  virtual const char* GetPlatformName() const {return "Win32";}
+
   /** Get the documentation entry for this generator.  */
   virtual void GetDocumentation(cmDocumentationEntry& entry) const;
   
   ///! Create a local generator appropriate to this Global Generator
   virtual cmLocalGenerator *CreateLocalGenerator();
 
-  std::string const& GetPlatformName() const { return this->PlatformName; }
-
   /**
    * Override Configure and Generate to add the build-system check
    * target.
@@ -78,6 +78,5 @@ protected:
   virtual void WriteProjectConfigurations(std::ostream& fout,
                                           const char* name,
                                           bool partOfDefaultBuild);
-  std::string PlatformName; // Win32 or x64 
 };
 #endif
diff --git a/Source/cmGlobalVisualStudio8Win64Generator.cxx b/Source/cmGlobalVisualStudio8Win64Generator.cxx
index d5558bb91..ea2c65f3a 100644
--- a/Source/cmGlobalVisualStudio8Win64Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Win64Generator.cxx
@@ -19,7 +19,6 @@
 
 cmGlobalVisualStudio8Win64Generator::cmGlobalVisualStudio8Win64Generator()
 {
-  this->PlatformName = "x64";
 }
 
 ///! Create a local generator appropriate to this Global Generator
@@ -27,7 +26,7 @@ cmLocalGenerator *cmGlobalVisualStudio8Win64Generator::CreateLocalGenerator()
 {
   cmLocalVisualStudio7Generator *lg = new cmLocalVisualStudio7Generator;
   lg->SetVersion8();
-  lg->SetPlatformName(this->PlatformName.c_str());
+  lg->SetPlatformName(this->GetPlatformName());
   lg->SetExtraFlagTable(this->GetExtraFlagTableVS8());
   lg->SetGlobalGenerator(this);
   return lg;
diff --git a/Source/cmGlobalVisualStudio8Win64Generator.h b/Source/cmGlobalVisualStudio8Win64Generator.h
index 44c237cd4..084ba697c 100644
--- a/Source/cmGlobalVisualStudio8Win64Generator.h
+++ b/Source/cmGlobalVisualStudio8Win64Generator.h
@@ -33,6 +33,8 @@ public:
     return cmGlobalVisualStudio8Win64Generator::GetActualName();}
   static const char* GetActualName() {return "Visual Studio 8 2005 Win64";}
 
+  virtual const char* GetPlatformName() const {return "x64";}
+
   /** Get the documentation entry for this generator.  */
   virtual void GetDocumentation(cmDocumentationEntry& entry) const;
 
diff --git a/Source/cmGlobalVisualStudio9Generator.cxx b/Source/cmGlobalVisualStudio9Generator.cxx
index f6ae70599..98acf0f89 100644
--- a/Source/cmGlobalVisualStudio9Generator.cxx
+++ b/Source/cmGlobalVisualStudio9Generator.cxx
@@ -42,6 +42,7 @@ cmLocalGenerator *cmGlobalVisualStudio9Generator::CreateLocalGenerator()
 {
   cmLocalVisualStudio7Generator *lg = new cmLocalVisualStudio7Generator;
   lg->SetVersion9();
+  lg->SetPlatformName(this->GetPlatformName());
   lg->SetExtraFlagTable(this->GetExtraFlagTableVS8());
   lg->SetGlobalGenerator(this);
   return lg;
diff --git a/Source/cmGlobalVisualStudio9Win64Generator.cxx b/Source/cmGlobalVisualStudio9Win64Generator.cxx
index c5b9babfd..67c0bf612 100644
--- a/Source/cmGlobalVisualStudio9Win64Generator.cxx
+++ b/Source/cmGlobalVisualStudio9Win64Generator.cxx
@@ -16,7 +16,6 @@
 
 cmGlobalVisualStudio9Win64Generator::cmGlobalVisualStudio9Win64Generator()
 {
-  this->PlatformName = "x64";
 }
 
 ///! Create a local generator appropriate to this Global Generator
@@ -24,7 +23,7 @@ cmLocalGenerator *cmGlobalVisualStudio9Win64Generator::CreateLocalGenerator()
 {
   cmLocalVisualStudio7Generator *lg = new cmLocalVisualStudio7Generator;
   lg->SetVersion9();
-  lg->SetPlatformName(this->PlatformName.c_str());
+  lg->SetPlatformName(this->GetPlatformName());
   lg->SetExtraFlagTable(this->GetExtraFlagTableVS8());
   lg->SetGlobalGenerator(this);
   return lg;
diff --git a/Source/cmGlobalVisualStudio9Win64Generator.h b/Source/cmGlobalVisualStudio9Win64Generator.h
index 55abcfc56..f6dcc03cd 100644
--- a/Source/cmGlobalVisualStudio9Win64Generator.h
+++ b/Source/cmGlobalVisualStudio9Win64Generator.h
@@ -33,6 +33,8 @@ public:
     return cmGlobalVisualStudio9Win64Generator::GetActualName();}
   static const char* GetActualName() {return "Visual Studio 9 2008 Win64";}
 
+  virtual const char* GetPlatformName() const {return "x64";}
+
   /** Get the documentation entry for this generator.  */
   virtual void GetDocumentation(cmDocumentationEntry& entry) const;
 

From be491298d4150888d452d95bbc76db6921cda40c Mon Sep 17 00:00:00 2001
From: Patrick Gansterer <paroga@paroga.com>
Date: Tue, 17 Aug 2010 21:28:52 +0200
Subject: [PATCH 2/4] VS: Add more TargetMachine option values

---
 Source/cmLocalVisualStudio7Generator.cxx | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx
index e411d3e54..296674518 100644
--- a/Source/cmLocalVisualStudio7Generator.cxx
+++ b/Source/cmLocalVisualStudio7Generator.cxx
@@ -480,6 +480,21 @@ cmVS7FlagTable cmLocalVisualStudio7GeneratorLinkFlagTable[] =
   {"OptimizeReferences", "OPT:REF", "Eliminate unreferenced data", "2", 0},
   {"TargetMachine", "MACHINE:I386", "Machine x86", "1", 0},
   {"TargetMachine", "MACHINE:X86", "Machine x86", "1", 0},
+  {"TargetMachine", "MACHINE:AM33", "Machine AM33", "2", 0},
+  {"TargetMachine", "MACHINE:ARM", "Machine ARM", "3", 0},
+  {"TargetMachine", "MACHINE:EBC", "Machine EBC", "4", 0},
+  {"TargetMachine", "MACHINE:IA64", "Machine IA64", "5", 0},
+  {"TargetMachine", "MACHINE:M32R", "Machine M32R", "6", 0},
+  {"TargetMachine", "MACHINE:MIPS", "Machine MIPS", "7", 0},
+  {"TargetMachine", "MACHINE:MIPS16", "Machine MIPS16", "8", 0},
+  {"TargetMachine", "MACHINE:MIPSFPU)", "Machine MIPSFPU", "9", 0},
+  {"TargetMachine", "MACHINE:MIPSFPU16", "Machine MIPSFPU16", "10", 0},
+  {"TargetMachine", "MACHINE:MIPSR41XX", "Machine MIPSR41XX", "11", 0},
+  {"TargetMachine", "MACHINE:SH3", "Machine SH3", "12", 0},
+  {"TargetMachine", "MACHINE:SH3DSP", "Machine SH3DSP", "13", 0},
+  {"TargetMachine", "MACHINE:SH4", "Machine SH4", "14", 0},
+  {"TargetMachine", "MACHINE:SH5", "Machine SH5", "15", 0},
+  {"TargetMachine", "MACHINE:THUMB", "Machine THUMB", "16", 0},
   {"TargetMachine", "MACHINE:X64", "Machine x64", "17", 0},
   {"ModuleDefinitionFile", "DEF:", "add an export def file", "",
    cmVS7FlagTable::UserValue}, 

From 4fec681fa7cdc89a4aa40c95fa0156c566ff8722 Mon Sep 17 00:00:00 2001
From: Patrick Gansterer <paroga@paroga.com>
Date: Sun, 22 Aug 2010 21:14:17 +0200
Subject: [PATCH 3/4] VS: Map /ENTRY linker option to EntryPointSymbol

---
 Source/cmLocalVisualStudio7Generator.cxx | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx
index 296674518..cb34bb6cf 100644
--- a/Source/cmLocalVisualStudio7Generator.cxx
+++ b/Source/cmLocalVisualStudio7Generator.cxx
@@ -466,6 +466,8 @@ cmVS7FlagTable cmLocalVisualStudio7GeneratorLinkFlagTable[] =
   {"GenerateManifest", "MANIFEST", "enable manifest generation", "TRUE", 0},
   {"LinkIncremental", "INCREMENTAL:NO", "link incremental", "1", 0},
   {"LinkIncremental", "INCREMENTAL:YES", "link incremental", "2", 0},
+  {"EntryPointSymbol", "ENTRY:", "sets the starting address", "",
+   cmVS7FlagTable::UserValue},
   {"IgnoreDefaultLibraryNames", "NODEFAULTLIB:", "default libs to ignore", "",
   cmVS7FlagTable::UserValue | cmVS7FlagTable::SemicolonAppendable},
   {"IgnoreAllDefaultLibraries", "NODEFAULTLIB", "ignore all default libs",

From ef4394defa22ba4288731ae65285c2f33e9e360a Mon Sep 17 00:00:00 2001
From: Patrick Gansterer <paroga@paroga.com>
Date: Sun, 22 Aug 2010 21:23:11 +0200
Subject: [PATCH 4/4] VS: Add ArchitectureId to VS 8 and 9 generators

Avoid duplicate architecture string literals.
---
 Source/cmGlobalVisualStudio8Generator.cxx      | 5 +++--
 Source/cmGlobalVisualStudio8Generator.h        | 2 ++
 Source/cmGlobalVisualStudio8Win64Generator.cxx | 3 +--
 Source/cmGlobalVisualStudio9Generator.cxx      | 4 ++--
 Source/cmGlobalVisualStudio9Win64Generator.cxx | 3 +--
 5 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
index c4de91efc..2612a08b2 100644
--- a/Source/cmGlobalVisualStudio8Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Generator.cxx
@@ -21,6 +21,7 @@ cmGlobalVisualStudio8Generator::cmGlobalVisualStudio8Generator()
 {
   this->FindMakeProgramFile = "CMakeVS8FindMake.cmake";
   this->ProjectConfigurationSectionName = "ProjectConfigurationPlatforms";
+  this->ArchitectureId = "X86";
 }
 
 //----------------------------------------------------------------------------
@@ -55,8 +56,8 @@ void cmGlobalVisualStudio8Generator
 //----------------------------------------------------------------------------
 void cmGlobalVisualStudio8Generator::AddPlatformDefinitions(cmMakefile* mf)
 {
-  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "X86");
-  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "X86");
+  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", this->ArchitectureId);
+  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", this->ArchitectureId);
   mf->AddDefinition("MSVC80", "1");
 }
 
diff --git a/Source/cmGlobalVisualStudio8Generator.h b/Source/cmGlobalVisualStudio8Generator.h
index ceee53bcc..e0d5d8044 100644
--- a/Source/cmGlobalVisualStudio8Generator.h
+++ b/Source/cmGlobalVisualStudio8Generator.h
@@ -78,5 +78,7 @@ protected:
   virtual void WriteProjectConfigurations(std::ostream& fout,
                                           const char* name,
                                           bool partOfDefaultBuild);
+
+  const char* ArchitectureId;
 };
 #endif
diff --git a/Source/cmGlobalVisualStudio8Win64Generator.cxx b/Source/cmGlobalVisualStudio8Win64Generator.cxx
index ea2c65f3a..3469b1710 100644
--- a/Source/cmGlobalVisualStudio8Win64Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Win64Generator.cxx
@@ -19,6 +19,7 @@
 
 cmGlobalVisualStudio8Win64Generator::cmGlobalVisualStudio8Win64Generator()
 {
+  this->ArchitectureId = "x64";
 }
 
 ///! Create a local generator appropriate to this Global Generator
@@ -47,6 +48,4 @@ void cmGlobalVisualStudio8Win64Generator
 {
   this->cmGlobalVisualStudio8Generator::AddPlatformDefinitions(mf);
   mf->AddDefinition("CMAKE_FORCE_WIN64", "TRUE");
-  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "x64");
-  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "x64");
 }
diff --git a/Source/cmGlobalVisualStudio9Generator.cxx b/Source/cmGlobalVisualStudio9Generator.cxx
index 98acf0f89..f8ceea0b0 100644
--- a/Source/cmGlobalVisualStudio9Generator.cxx
+++ b/Source/cmGlobalVisualStudio9Generator.cxx
@@ -25,8 +25,8 @@ cmGlobalVisualStudio9Generator::cmGlobalVisualStudio9Generator()
 //----------------------------------------------------------------------------
 void cmGlobalVisualStudio9Generator::AddPlatformDefinitions(cmMakefile* mf)
 {
-  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "X86");
-  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "X86");
+  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", this->ArchitectureId);
+  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", this->ArchitectureId);
   mf->AddDefinition("MSVC90", "1");
 }
 
diff --git a/Source/cmGlobalVisualStudio9Win64Generator.cxx b/Source/cmGlobalVisualStudio9Win64Generator.cxx
index 67c0bf612..ff4fd4f5d 100644
--- a/Source/cmGlobalVisualStudio9Win64Generator.cxx
+++ b/Source/cmGlobalVisualStudio9Win64Generator.cxx
@@ -16,6 +16,7 @@
 
 cmGlobalVisualStudio9Win64Generator::cmGlobalVisualStudio9Win64Generator()
 {
+  this->ArchitectureId = "x64";
 }
 
 ///! Create a local generator appropriate to this Global Generator
@@ -44,6 +45,4 @@ void cmGlobalVisualStudio9Win64Generator
 {
   cmGlobalVisualStudio9Generator::AddPlatformDefinitions(mf);
   mf->AddDefinition("CMAKE_FORCE_WIN64", "TRUE");
-  mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "x64");
-  mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "x64");
 }