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:
parent
54ff77dc62
commit
b20a32ac73
|
@ -261,6 +261,24 @@ bool cmGlobalVisualStudio10Generator::InitializeWindowsStore(cmMakefile* mf)
|
|||
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
|
||||
{
|
||||
|
|
|
@ -118,9 +118,10 @@ protected:
|
|||
virtual bool InitializeWindowsCE(cmMakefile* mf);
|
||||
virtual bool InitializeWindowsPhone(cmMakefile* mf);
|
||||
virtual bool InitializeWindowsStore(cmMakefile* mf);
|
||||
|
||||
virtual std::string SelectWindowsCEToolset() const;
|
||||
virtual std::string SelectWindowsPhoneToolset() const { return ""; }
|
||||
virtual std::string SelectWindowsStoreToolset() const { return ""; }
|
||||
virtual bool SelectWindowsPhoneToolset(std::string& toolset) const;
|
||||
virtual bool SelectWindowsStoreToolset(std::string& toolset) const;
|
||||
|
||||
virtual const char* GetIDEVersion() { return "10.0"; }
|
||||
|
||||
|
|
|
@ -131,12 +131,20 @@ cmGlobalVisualStudio11Generator::MatchesGeneratorName(
|
|||
//----------------------------------------------------------------------------
|
||||
bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf)
|
||||
{
|
||||
this->DefaultPlatformToolset = this->SelectWindowsPhoneToolset();
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
if(!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset))
|
||||
{
|
||||
cmOStringStream e;
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
{
|
||||
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());
|
||||
return false;
|
||||
}
|
||||
|
@ -146,12 +154,20 @@ bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf)
|
|||
//----------------------------------------------------------------------------
|
||||
bool cmGlobalVisualStudio11Generator::InitializeWindowsStore(cmMakefile* mf)
|
||||
{
|
||||
this->DefaultPlatformToolset = this->SelectWindowsStoreToolset();
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
if(!this->SelectWindowsStoreToolset(this->DefaultPlatformToolset))
|
||||
{
|
||||
cmOStringStream e;
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
{
|
||||
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());
|
||||
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")
|
||||
{
|
||||
return "v110_wp80";
|
||||
if (this->IsWindowsPhoneToolsetInstalled() &&
|
||||
this->IsWindowsDesktopToolsetInstalled())
|
||||
{
|
||||
toolset = "v110_wp80";
|
||||
return true;
|
||||
}
|
||||
return this->cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset();
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return
|
||||
this->cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset(toolset);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::string cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset() const
|
||||
bool
|
||||
cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(
|
||||
std::string& toolset) const
|
||||
{
|
||||
if(this->SystemVersion == "8.0")
|
||||
{
|
||||
return "v110";
|
||||
if(this->IsWindowsStoreToolsetInstalled() &&
|
||||
this->IsWindowsDesktopToolsetInstalled())
|
||||
{
|
||||
toolset = "v110";
|
||||
return true;
|
||||
}
|
||||
return this->cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset();
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return
|
||||
this->cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset(toolset);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -256,3 +296,54 @@ cmGlobalVisualStudio11Generator::NeedsDeploy(cmTarget::TargetType type) const
|
|||
}
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -36,8 +36,15 @@ public:
|
|||
protected:
|
||||
virtual bool InitializeWindowsPhone(cmMakefile* mf);
|
||||
virtual bool InitializeWindowsStore(cmMakefile* mf);
|
||||
virtual std::string SelectWindowsPhoneToolset() const;
|
||||
virtual std::string SelectWindowsStoreToolset() const;
|
||||
virtual bool SelectWindowsPhoneToolset(std::string& toolset) 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"; }
|
||||
bool UseFolderProperty();
|
||||
static std::set<std::string> GetInstalledWindowsCESDKs();
|
||||
|
|
|
@ -111,12 +111,20 @@ cmGlobalVisualStudio12Generator::MatchesGeneratorName(
|
|||
//----------------------------------------------------------------------------
|
||||
bool cmGlobalVisualStudio12Generator::InitializeWindowsPhone(cmMakefile* mf)
|
||||
{
|
||||
this->DefaultPlatformToolset = this->SelectWindowsPhoneToolset();
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
if(!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << this->GetName() << " supports Windows Phone '8.0' and '8.1', "
|
||||
"but not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
{
|
||||
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());
|
||||
return false;
|
||||
}
|
||||
|
@ -126,12 +134,20 @@ bool cmGlobalVisualStudio12Generator::InitializeWindowsPhone(cmMakefile* mf)
|
|||
//----------------------------------------------------------------------------
|
||||
bool cmGlobalVisualStudio12Generator::InitializeWindowsStore(cmMakefile* mf)
|
||||
{
|
||||
this->DefaultPlatformToolset = this->SelectWindowsStoreToolset();
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
if(!this->SelectWindowsStoreToolset(this->DefaultPlatformToolset))
|
||||
{
|
||||
cmOStringStream e;
|
||||
e << this->GetName() << " supports Windows Store '8.0' and '8.1', "
|
||||
"but not '" << this->SystemVersion << "'. Check CMAKE_SYSTEM_VERSION.";
|
||||
if(this->DefaultPlatformToolset.empty())
|
||||
{
|
||||
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());
|
||||
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")
|
||||
{
|
||||
return "v120_wp81";
|
||||
if (this->IsWindowsPhoneToolsetInstalled() &&
|
||||
this->IsWindowsDesktopToolsetInstalled())
|
||||
{
|
||||
toolset = "v120_wp81";
|
||||
return true;
|
||||
}
|
||||
return this->cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset();
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return
|
||||
this->cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset(toolset);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::string cmGlobalVisualStudio12Generator::SelectWindowsStoreToolset() const
|
||||
bool
|
||||
cmGlobalVisualStudio12Generator::SelectWindowsStoreToolset(
|
||||
std::string& toolset) const
|
||||
{
|
||||
if(this->SystemVersion == "8.1")
|
||||
{
|
||||
return "v120";
|
||||
if(this->IsWindowsStoreToolsetInstalled() &&
|
||||
this->IsWindowsDesktopToolsetInstalled())
|
||||
{
|
||||
toolset = "v120";
|
||||
return true;
|
||||
}
|
||||
return this->cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset();
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return
|
||||
this->cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(toolset);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -180,3 +220,46 @@ cmLocalGenerator *cmGlobalVisualStudio12Generator::CreateLocalGenerator()
|
|||
lg->SetGlobalGenerator(this);
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -41,8 +41,14 @@ public:
|
|||
protected:
|
||||
virtual bool InitializeWindowsPhone(cmMakefile* mf);
|
||||
virtual bool InitializeWindowsStore(cmMakefile* mf);
|
||||
virtual std::string SelectWindowsPhoneToolset() const;
|
||||
virtual std::string SelectWindowsStoreToolset() const;
|
||||
virtual bool SelectWindowsPhoneToolset(std::string& toolset) 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"; }
|
||||
private:
|
||||
class Factory;
|
||||
|
|
Loading…
Reference in New Issue