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.
This commit is contained in:
parent
5cf99388c3
commit
fb97ba6293
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue