Просмотр исходного кода

Enable 64-bit tools with VS 2010 Express (#9981, #10722)

The Express Edition does not come with 64-bit tools, but one can install
the "Microsoft Windows SDK v7.1" to get them.  Detect this case and
check for the SDK.  If found, set PlatformToolset to use the SDK tools.
Otherwise, fail with a concise and informative error.
Brad King 15 лет назад
Родитель
Сommit
fb97ba6293

+ 14 - 0
Source/cmGlobalVisualStudio10Generator.cxx

@@ -19,6 +19,10 @@
 cmGlobalVisualStudio10Generator::cmGlobalVisualStudio10Generator()
 {
   this->FindMakeProgramFile = "CMakeVS10FindMake.cmake";
+  std::string vc10Express;
+  this->ExpressEdition = cmSystemTools::ReadRegistryValue(
+    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\10.0\\Setup\\VC;"
+    "ProductDir", vc10Express, cmSystemTools::KeyWOW64_32);
 }
 
 //----------------------------------------------------------------------------
@@ -62,6 +66,16 @@ void cmGlobalVisualStudio10Generator
   cmGlobalVisualStudio8Generator::EnableLanguage(lang, mf, optional);
 }
 
+//----------------------------------------------------------------------------
+const char* cmGlobalVisualStudio10Generator::GetPlatformToolset()
+{
+  if(!this->PlatformToolset.empty())
+    {
+    return this->PlatformToolset.c_str();
+    }
+  return 0;
+}
+
 //----------------------------------------------------------------------------
 std::string cmGlobalVisualStudio10Generator::GetUserMacrosDirectory()
 {

+ 10 - 0
Source/cmGlobalVisualStudio10Generator.h

@@ -54,6 +54,12 @@ public:
                               cmMakefile *, bool optional);
   virtual void WriteSLNHeader(std::ostream& fout);
 
+  /** Is the installed VS an Express edition?  */
+  bool IsExpressEdition() const { return this->ExpressEdition; }
+
+  /** The toolset name for the target platform.  */
+  const char* GetPlatformToolset();
+
   /**
    * Where does this version of Visual Studio look for macros for the
    * current user? Returns the empty string if this version of Visual
@@ -70,5 +76,9 @@ public:
     { return "$(Configuration)";}
 protected:
   virtual const char* GetIDEVersion() { return "10.0"; }
+
+  std::string PlatformToolset;
+private:
+  bool ExpressEdition;
 };
 #endif

+ 49 - 0
Source/cmGlobalVisualStudio10Win64Generator.cxx

@@ -36,3 +36,52 @@ void cmGlobalVisualStudio10Win64Generator
   mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "x64");
   mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "x64");
 }
+
+//----------------------------------------------------------------------------
+bool cmGlobalVisualStudio10Win64Generator::Find64BitTools(cmMakefile* mf)
+{
+  if(!this->PlatformToolset.empty())
+    {
+    return true;
+    }
+  // This edition does not come with 64-bit tools.  Look for them.
+  //
+  // TODO: Detect available tools?  x64\v100 exists but does not work?
+  // KHLM\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\4.0;VCTargetsPath
+  // c:/Program Files (x86)/MSBuild/Microsoft.Cpp/v4.0/Platforms/
+  //   {Itanium,Win32,x64}/PlatformToolsets/{v100,v90,Windows7.1SDK}
+  std::string winSDK_7_1;
+  if(cmSystemTools::ReadRegistryValue(
+       "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\"
+       "Windows\\v7.1;InstallationFolder", winSDK_7_1))
+    {
+    cmOStringStream m;
+    m << "Found Windows SDK v7.1: " << winSDK_7_1;
+    mf->DisplayStatus(m.str().c_str(), -1);
+    this->PlatformToolset = "Windows7.1SDK";
+    return true;
+    }
+  else
+    {
+    cmOStringStream e;
+    e << "Cannot enable 64-bit tools with Visual Studio 2010 Express.\n"
+      << "Install the Microsoft Windows SDK v7.1 to get 64-bit tools:\n"
+      << "  http://msdn.microsoft.com/en-us/windows/bb980924.aspx";
+    mf->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
+    cmSystemTools::SetFatalErrorOccured();
+    return false;
+    }
+}
+
+//----------------------------------------------------------------------------
+void cmGlobalVisualStudio10Win64Generator
+::EnableLanguage(std::vector<std::string> const& languages,
+                 cmMakefile* mf, bool optional)
+{
+  if(this->IsExpressEdition() && !this->Find64BitTools(mf))
+    {
+    return;
+    }
+  this->cmGlobalVisualStudio10Generator
+    ::EnableLanguage(languages, mf, optional);
+}

+ 3 - 0
Source/cmGlobalVisualStudio10Win64Generator.h

@@ -34,5 +34,8 @@ public:
 
   virtual void AddPlatformDefinitions(cmMakefile* mf);
 
+  bool Find64BitTools(cmMakefile* mf);
+  virtual void EnableLanguage(std::vector<std::string>const& languages,
+                              cmMakefile *, bool optional);
 };
 #endif

+ 9 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -244,6 +244,8 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurations()
 
 void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
 {
+  cmGlobalVisualStudio10Generator* gg =
+    static_cast<cmGlobalVisualStudio10Generator*>(this->GlobalGenerator);
   std::vector<std::string> *configs =
     static_cast<cmGlobalVisualStudio7Generator *>
     (this->GlobalGenerator)->GetConfigurations();
@@ -291,6 +293,13 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
       {
       this->WriteString("<CharacterSet>MultiByte</CharacterSet>\n", 2);
       }
+    if(const char* toolset = gg->GetPlatformToolset())
+      {
+      std::string pts = "<PlatformToolset>";
+      pts += toolset;
+      pts += "</PlatformToolset>\n";
+      this->WriteString(pts.c_str(), 2);
+      }
     this->WriteString("</PropertyGroup>\n", 1);
     }
 }