VS: Improve error messages when compiler is not detected (#15228)

CMake requires both the Desktop SDK and the correct platform SDK
(Windows Phone or Windows Store) to be installed when targeting the
Windows mobile platforms.  Verify that the right platform components are
installed and give a more detailed error message when something is
wrong.
This commit is contained in:
Gilles Khouzam 2014-11-13 11:47:01 -08:00 committed by Brad King
parent 54ff77dc62
commit b20a32ac73
6 changed files with 240 additions and 34 deletions

View File

@ -261,6 +261,24 @@ bool cmGlobalVisualStudio10Generator::InitializeWindowsStore(cmMakefile* mf)
return false; return false;
} }
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset(
std::string& toolset) const
{
toolset = "";
return false;
}
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset(
std::string& toolset) const
{
toolset = "";
return false;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmGlobalVisualStudio10Generator::SelectWindowsCEToolset() const std::string cmGlobalVisualStudio10Generator::SelectWindowsCEToolset() const
{ {

View File

@ -118,9 +118,10 @@ protected:
virtual bool InitializeWindowsCE(cmMakefile* mf); virtual bool InitializeWindowsCE(cmMakefile* mf);
virtual bool InitializeWindowsPhone(cmMakefile* mf); virtual bool InitializeWindowsPhone(cmMakefile* mf);
virtual bool InitializeWindowsStore(cmMakefile* mf); virtual bool InitializeWindowsStore(cmMakefile* mf);
virtual std::string SelectWindowsCEToolset() const; virtual std::string SelectWindowsCEToolset() const;
virtual std::string SelectWindowsPhoneToolset() const { return ""; } virtual bool SelectWindowsPhoneToolset(std::string& toolset) const;
virtual std::string SelectWindowsStoreToolset() const { return ""; } virtual bool SelectWindowsStoreToolset(std::string& toolset) const;
virtual const char* GetIDEVersion() { return "10.0"; } virtual const char* GetIDEVersion() { return "10.0"; }

View File

@ -131,12 +131,20 @@ cmGlobalVisualStudio11Generator::MatchesGeneratorName(
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf) bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf)
{ {
this->DefaultPlatformToolset = this->SelectWindowsPhoneToolset(); if(!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset))
if(this->DefaultPlatformToolset.empty())
{ {
cmOStringStream e; cmOStringStream e;
e << this->GetName() << " supports Windows Phone '8.0', but not '" if(this->DefaultPlatformToolset.empty())
<< this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION."; {
e << this->GetName() << " supports Windows Phone '8.0', but not '"
<< this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
}
else
{
e << "A Windows Phone component with CMake requires both the Windows "
<< "Desktop SDK as well as the Windows Phone '" << this->SystemVersion
<< "' SDK. Please make sure that you have both installed";
}
mf->IssueMessage(cmake::FATAL_ERROR, e.str()); mf->IssueMessage(cmake::FATAL_ERROR, e.str());
return false; return false;
} }
@ -146,12 +154,20 @@ bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmGlobalVisualStudio11Generator::InitializeWindowsStore(cmMakefile* mf) bool cmGlobalVisualStudio11Generator::InitializeWindowsStore(cmMakefile* mf)
{ {
this->DefaultPlatformToolset = this->SelectWindowsStoreToolset(); if(!this->SelectWindowsStoreToolset(this->DefaultPlatformToolset))
if(this->DefaultPlatformToolset.empty())
{ {
cmOStringStream e; cmOStringStream e;
e << this->GetName() << " supports Windows Store '8.0', but not '" if(this->DefaultPlatformToolset.empty())
<< this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION."; {
e << this->GetName() << " supports Windows Store '8.0', but not '"
<< this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
}
else
{
e << "A Windows Store component with CMake requires both the Windows "
<< "Desktop SDK as well as the Windows Store '" << this->SystemVersion
<< "' SDK. Please make sure that you have both installed";
}
mf->IssueMessage(cmake::FATAL_ERROR, e.str()); mf->IssueMessage(cmake::FATAL_ERROR, e.str());
return false; return false;
} }
@ -159,23 +175,47 @@ bool cmGlobalVisualStudio11Generator::InitializeWindowsStore(cmMakefile* mf)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset() const bool
cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset(
std::string& toolset) const
{ {
if(this->SystemVersion == "8.0") if(this->SystemVersion == "8.0")
{ {
return "v110_wp80"; if (this->IsWindowsPhoneToolsetInstalled() &&
this->IsWindowsDesktopToolsetInstalled())
{
toolset = "v110_wp80";
return true;
}
else
{
return false;
}
} }
return this->cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset(); return
this->cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset(toolset);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset() const bool
cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(
std::string& toolset) const
{ {
if(this->SystemVersion == "8.0") if(this->SystemVersion == "8.0")
{ {
return "v110"; if(this->IsWindowsStoreToolsetInstalled() &&
this->IsWindowsDesktopToolsetInstalled())
{
toolset = "v110";
return true;
}
else
{
return false;
}
} }
return this->cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset(); return
this->cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset(toolset);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -256,3 +296,54 @@ cmGlobalVisualStudio11Generator::NeedsDeploy(cmTarget::TargetType type) const
} }
return cmGlobalVisualStudio10Generator::NeedsDeploy(type); return cmGlobalVisualStudio10Generator::NeedsDeploy(type);
} }
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio11Generator::IsWindowsDesktopToolsetInstalled() const
{
const char desktop80Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\11.0\\VC\\Libraries\\Extended";
const char VS2012DesktopExpressKey[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"WDExpress\\11.0;InstallDir";
std::vector<std::string> subkeys;
std::string path;
return cmSystemTools::ReadRegistryValue(VS2012DesktopExpressKey,
path,
cmSystemTools::KeyWOW64_32) ||
cmSystemTools::GetRegistrySubKeys(desktop80Key,
subkeys,
cmSystemTools::KeyWOW64_32);
}
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio11Generator::IsWindowsPhoneToolsetInstalled() const
{
const char wp80Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"Microsoft SDKs\\WindowsPhone\\v8.0\\"
"Install Path;Install Path";
std::string path;
cmSystemTools::ReadRegistryValue(wp80Key,
path,
cmSystemTools::KeyWOW64_32);
return !path.empty();
}
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio11Generator::IsWindowsStoreToolsetInstalled() const
{
const char win80Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\11.0\\VC\\Libraries\\Core\\Arm";
std::vector<std::string> subkeys;
return cmSystemTools::GetRegistrySubKeys(win80Key,
subkeys,
cmSystemTools::KeyWOW64_32);
}

View File

@ -36,8 +36,15 @@ public:
protected: protected:
virtual bool InitializeWindowsPhone(cmMakefile* mf); virtual bool InitializeWindowsPhone(cmMakefile* mf);
virtual bool InitializeWindowsStore(cmMakefile* mf); virtual bool InitializeWindowsStore(cmMakefile* mf);
virtual std::string SelectWindowsPhoneToolset() const; virtual bool SelectWindowsPhoneToolset(std::string& toolset) const;
virtual std::string SelectWindowsStoreToolset() const; virtual bool SelectWindowsStoreToolset(std::string& toolset) const;
// These aren't virtual because we need to check if the selected version
// of the toolset is installed
bool IsWindowsDesktopToolsetInstalled() const;
bool IsWindowsPhoneToolsetInstalled() const;
bool IsWindowsStoreToolsetInstalled() const;
virtual const char* GetIDEVersion() { return "11.0"; } virtual const char* GetIDEVersion() { return "11.0"; }
bool UseFolderProperty(); bool UseFolderProperty();
static std::set<std::string> GetInstalledWindowsCESDKs(); static std::set<std::string> GetInstalledWindowsCESDKs();

View File

@ -111,12 +111,20 @@ cmGlobalVisualStudio12Generator::MatchesGeneratorName(
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmGlobalVisualStudio12Generator::InitializeWindowsPhone(cmMakefile* mf) bool cmGlobalVisualStudio12Generator::InitializeWindowsPhone(cmMakefile* mf)
{ {
this->DefaultPlatformToolset = this->SelectWindowsPhoneToolset(); if(!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset))
if(this->DefaultPlatformToolset.empty())
{ {
cmOStringStream e; cmOStringStream e;
e << this->GetName() << " supports Windows Phone '8.0' and '8.1', " if(this->DefaultPlatformToolset.empty())
"but not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION."; {
e << this->GetName() << " supports Windows Phone '8.0' and '8.1', but "
"not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
}
else
{
e << "A Windows Phone component with CMake requires both the Windows "
<< "Desktop SDK as well as the Windows Phone '" << this->SystemVersion
<< "' SDK. Please make sure that you have both installed";
}
mf->IssueMessage(cmake::FATAL_ERROR, e.str()); mf->IssueMessage(cmake::FATAL_ERROR, e.str());
return false; return false;
} }
@ -126,12 +134,20 @@ bool cmGlobalVisualStudio12Generator::InitializeWindowsPhone(cmMakefile* mf)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool cmGlobalVisualStudio12Generator::InitializeWindowsStore(cmMakefile* mf) bool cmGlobalVisualStudio12Generator::InitializeWindowsStore(cmMakefile* mf)
{ {
this->DefaultPlatformToolset = this->SelectWindowsStoreToolset(); if(!this->SelectWindowsStoreToolset(this->DefaultPlatformToolset))
if(this->DefaultPlatformToolset.empty())
{ {
cmOStringStream e; cmOStringStream e;
e << this->GetName() << " supports Windows Store '8.0' and '8.1', " if(this->DefaultPlatformToolset.empty())
"but not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION."; {
e << this->GetName() << " supports Windows Store '8.0' and '8.1', but "
"not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
}
else
{
e << "A Windows Store component with CMake requires both the Windows "
<< "Desktop SDK as well as the Windows Store '" << this->SystemVersion
<< "' SDK. Please make sure that you have both installed";
}
mf->IssueMessage(cmake::FATAL_ERROR, e.str()); mf->IssueMessage(cmake::FATAL_ERROR, e.str());
return false; return false;
} }
@ -139,23 +155,47 @@ bool cmGlobalVisualStudio12Generator::InitializeWindowsStore(cmMakefile* mf)
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmGlobalVisualStudio12Generator::SelectWindowsPhoneToolset() const bool
cmGlobalVisualStudio12Generator::SelectWindowsPhoneToolset(
std::string& toolset) const
{ {
if(this->SystemVersion == "8.1") if(this->SystemVersion == "8.1")
{ {
return "v120_wp81"; if (this->IsWindowsPhoneToolsetInstalled() &&
this->IsWindowsDesktopToolsetInstalled())
{
toolset = "v120_wp81";
return true;
}
else
{
return false;
}
} }
return this->cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset(); return
this->cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset(toolset);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
std::string cmGlobalVisualStudio12Generator::SelectWindowsStoreToolset() const bool
cmGlobalVisualStudio12Generator::SelectWindowsStoreToolset(
std::string& toolset) const
{ {
if(this->SystemVersion == "8.1") if(this->SystemVersion == "8.1")
{ {
return "v120"; if(this->IsWindowsStoreToolsetInstalled() &&
this->IsWindowsDesktopToolsetInstalled())
{
toolset = "v120";
return true;
}
else
{
return false;
}
} }
return this->cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(); return
this->cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(toolset);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -180,3 +220,46 @@ cmLocalGenerator *cmGlobalVisualStudio12Generator::CreateLocalGenerator()
lg->SetGlobalGenerator(this); lg->SetGlobalGenerator(this);
return lg; return lg;
} }
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio12Generator::IsWindowsDesktopToolsetInstalled() const
{
const char desktop81Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\12.0\\VC\\LibraryDesktop";
std::vector<std::string> subkeys;
return cmSystemTools::GetRegistrySubKeys(desktop81Key,
subkeys,
cmSystemTools::KeyWOW64_32);
}
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio12Generator::IsWindowsPhoneToolsetInstalled() const
{
const char wp81Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"Microsoft SDKs\\WindowsPhone\\v8.1\\Install Path;Install Path";
std::string path;
cmSystemTools::ReadRegistryValue(wp81Key,
path,
cmSystemTools::KeyWOW64_32);
return !path.empty();
}
//----------------------------------------------------------------------------
bool
cmGlobalVisualStudio12Generator::IsWindowsStoreToolsetInstalled() const
{
const char win81Key[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\12.0\\VC\\Libraries\\Core\\Arm";
std::vector<std::string> subkeys;
return cmSystemTools::GetRegistrySubKeys(win81Key,
subkeys,
cmSystemTools::KeyWOW64_32);
}

View File

@ -41,8 +41,14 @@ public:
protected: protected:
virtual bool InitializeWindowsPhone(cmMakefile* mf); virtual bool InitializeWindowsPhone(cmMakefile* mf);
virtual bool InitializeWindowsStore(cmMakefile* mf); virtual bool InitializeWindowsStore(cmMakefile* mf);
virtual std::string SelectWindowsPhoneToolset() const; virtual bool SelectWindowsPhoneToolset(std::string& toolset) const;
virtual std::string SelectWindowsStoreToolset() const; virtual bool SelectWindowsStoreToolset(std::string& toolset) const;
// These aren't virtual because we need to check if the selected version
// of the toolset is installed
bool IsWindowsDesktopToolsetInstalled() const;
bool IsWindowsPhoneToolsetInstalled() const;
bool IsWindowsStoreToolsetInstalled() const;
virtual const char* GetIDEVersion() { return "12.0"; } virtual const char* GetIDEVersion() { return "12.0"; }
private: private:
class Factory; class Factory;