cmake/Source/cmGlobalVisualStudio11Generator.cxx

186 lines
6.0 KiB
C++
Raw Normal View History

2016-10-30 18:24:19 +01:00
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
2012-02-18 12:40:36 +02:00
#include "cmGlobalVisualStudio11Generator.h"
2016-07-09 11:21:54 +02:00
2022-03-29 21:10:50 +02:00
#include <cstring>
2020-08-30 11:54:41 +02:00
#include <utility>
2022-03-29 21:10:50 +02:00
#include <vector>
2020-08-30 11:54:41 +02:00
2023-12-07 09:12:54 +01:00
#include <cmext/string_view>
2022-03-29 21:10:50 +02:00
#include "cmGlobalGenerator.h"
#include "cmGlobalVisualStudioGenerator.h"
2012-02-18 12:40:36 +02:00
#include "cmMakefile.h"
2022-03-29 21:10:50 +02:00
#include "cmMessageType.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
2012-02-18 12:40:36 +02:00
2016-07-09 11:21:54 +02:00
cmGlobalVisualStudio11Generator::cmGlobalVisualStudio11Generator(
2019-11-11 23:01:05 +01:00
cmake* cm, const std::string& name,
std::string const& platformInGeneratorName)
: cmGlobalVisualStudio10Generator(cm, name, platformInGeneratorName)
2012-02-18 12:40:36 +02:00
{
2014-08-03 19:52:23 +02:00
}
2023-05-23 16:38:00 +02:00
void cmGlobalVisualStudio11Generator::EnableLanguage(
std::vector<std::string> const& lang, cmMakefile* mf, bool optional)
{
for (std::string const& it : lang) {
2023-12-07 09:12:54 +01:00
if (it == "ASM_MARMASM"_s) {
2023-05-23 16:38:00 +02:00
this->MarmasmEnabled = true;
}
}
this->AddPlatformDefinitions(mf);
cmGlobalVisualStudio10Generator::EnableLanguage(lang, mf, optional);
}
2015-04-27 22:25:09 +02:00
bool cmGlobalVisualStudio11Generator::InitializeWindowsPhone(cmMakefile* mf)
{
2016-07-09 11:21:54 +02:00
if (!this->SelectWindowsPhoneToolset(this->DefaultPlatformToolset)) {
2023-12-07 09:12:54 +01:00
std::string e;
2016-07-09 11:21:54 +02:00
if (this->DefaultPlatformToolset.empty()) {
2023-12-07 09:12:54 +01:00
e = cmStrCat(this->GetName(), " supports Windows Phone '8.0', but not '",
this->SystemVersion, "'. Check CMAKE_SYSTEM_VERSION.");
2016-07-09 11:21:54 +02:00
} else {
2023-12-07 09:12:54 +01:00
e = cmStrCat(
"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");
2016-07-09 11:21:54 +02:00
}
2023-12-07 09:12:54 +01:00
mf->IssueMessage(MessageType::FATAL_ERROR, e);
2015-04-27 22:25:09 +02:00
return false;
2016-07-09 11:21:54 +02:00
}
2015-04-27 22:25:09 +02:00
return true;
}
bool cmGlobalVisualStudio11Generator::InitializeWindowsStore(cmMakefile* mf)
{
2016-07-09 11:21:54 +02:00
if (!this->SelectWindowsStoreToolset(this->DefaultPlatformToolset)) {
2023-12-07 09:12:54 +01:00
std::string e;
2016-07-09 11:21:54 +02:00
if (this->DefaultPlatformToolset.empty()) {
2023-12-07 09:12:54 +01:00
e = cmStrCat(this->GetName(), " supports Windows Store '8.0', but not '",
this->SystemVersion, "'. Check CMAKE_SYSTEM_VERSION.");
2016-07-09 11:21:54 +02:00
} else {
2023-12-07 09:12:54 +01:00
e = cmStrCat(
"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");
2016-07-09 11:21:54 +02:00
}
2023-12-07 09:12:54 +01:00
mf->IssueMessage(MessageType::FATAL_ERROR, e);
2015-04-27 22:25:09 +02:00
return false;
2016-07-09 11:21:54 +02:00
}
2015-04-27 22:25:09 +02:00
return true;
}
2016-07-09 11:21:54 +02:00
bool cmGlobalVisualStudio11Generator::SelectWindowsPhoneToolset(
2015-04-27 22:25:09 +02:00
std::string& toolset) const
{
2023-12-07 09:12:54 +01:00
if (this->SystemVersion == "8.0"_s) {
2015-04-27 22:25:09 +02:00
if (this->IsWindowsPhoneToolsetInstalled() &&
2016-07-09 11:21:54 +02:00
this->IsWindowsDesktopToolsetInstalled()) {
2015-04-27 22:25:09 +02:00
toolset = "v110_wp80";
return true;
}
2023-05-23 16:38:00 +02:00
return false;
2016-07-09 11:21:54 +02:00
}
return this->cmGlobalVisualStudio10Generator::SelectWindowsPhoneToolset(
toolset);
2015-04-27 22:25:09 +02:00
}
2016-07-09 11:21:54 +02:00
bool cmGlobalVisualStudio11Generator::SelectWindowsStoreToolset(
2015-04-27 22:25:09 +02:00
std::string& toolset) const
{
2023-12-07 09:12:54 +01:00
if (this->SystemVersion == "8.0"_s) {
2016-07-09 11:21:54 +02:00
if (this->IsWindowsStoreToolsetInstalled() &&
this->IsWindowsDesktopToolsetInstalled()) {
2015-04-27 22:25:09 +02:00
toolset = "v110";
return true;
}
2023-05-23 16:38:00 +02:00
return false;
2016-07-09 11:21:54 +02:00
}
return this->cmGlobalVisualStudio10Generator::SelectWindowsStoreToolset(
toolset);
2015-04-27 22:25:09 +02:00
}
2019-11-11 23:01:05 +01:00
bool cmGlobalVisualStudio11Generator::UseFolderProperty() const
2012-02-18 12:40:36 +02:00
{
2016-07-09 11:21:54 +02:00
// Intentionally skip up to the top-level class implementation.
// Folders are not supported by the Express editions in VS10 and earlier,
// but they are in VS11 Express and above.
2023-05-23 16:38:00 +02:00
// NOLINTNEXTLINE(bugprone-parent-virtual-call)
2016-07-09 11:21:54 +02:00
return cmGlobalGenerator::UseFolderProperty();
2012-02-18 12:40:36 +02:00
}
2013-11-03 12:27:13 +02:00
std::set<std::string>
cmGlobalVisualStudio11Generator::GetInstalledWindowsCESDKs()
{
const char sdksKey[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"Windows CE Tools\\SDKs";
std::vector<std::string> subkeys;
cmSystemTools::GetRegistrySubKeys(sdksKey, subkeys,
cmSystemTools::KeyWOW64_32);
std::set<std::string> ret;
2018-04-23 21:13:27 +02:00
for (std::string const& i : subkeys) {
2013-11-03 12:27:13 +02:00
std::string key = sdksKey;
key += '\\';
2018-04-23 21:13:27 +02:00
key += i;
2013-11-03 12:27:13 +02:00
key += ';';
std::string path;
2018-04-23 21:13:27 +02:00
if (cmSystemTools::ReadRegistryValue(key, path,
2016-07-09 11:21:54 +02:00
cmSystemTools::KeyWOW64_32) &&
!path.empty()) {
2018-04-23 21:13:27 +02:00
ret.insert(i);
2013-11-03 12:27:13 +02:00
}
2016-07-09 11:21:54 +02:00
}
2013-11-03 12:27:13 +02:00
return ret;
}
2015-04-27 22:25:09 +02:00
2019-11-11 23:01:05 +01:00
bool cmGlobalVisualStudio11Generator::TargetSystemSupportsDeployment() const
2015-04-27 22:25:09 +02:00
{
2019-11-11 23:01:05 +01:00
return this->SystemIsWindowsPhone || this->SystemIsWindowsStore ||
cmGlobalVisualStudio10Generator::TargetSystemSupportsDeployment();
2015-04-27 22:25:09 +02:00
}
2016-07-09 11:21:54 +02:00
bool cmGlobalVisualStudio11Generator::IsWindowsDesktopToolsetInstalled() const
2015-04-27 22:25:09 +02:00
{
2016-07-09 11:21:54 +02:00
const char desktop80Key[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\11.0\\VC\\Libraries\\Extended";
2015-04-27 22:25:09 +02:00
const char VS2012DesktopExpressKey[] =
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"WDExpress\\11.0;InstallDir";
std::vector<std::string> subkeys;
std::string path;
2016-07-09 11:21:54 +02:00
return cmSystemTools::ReadRegistryValue(VS2012DesktopExpressKey, path,
2015-04-27 22:25:09 +02:00
cmSystemTools::KeyWOW64_32) ||
2016-07-09 11:21:54 +02:00
cmSystemTools::GetRegistrySubKeys(desktop80Key, subkeys,
cmSystemTools::KeyWOW64_32);
2015-04-27 22:25:09 +02:00
}
2016-07-09 11:21:54 +02:00
bool cmGlobalVisualStudio11Generator::IsWindowsPhoneToolsetInstalled() const
2015-04-27 22:25:09 +02:00
{
2016-07-09 11:21:54 +02:00
const char wp80Key[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"Microsoft SDKs\\WindowsPhone\\v8.0\\"
"Install Path;Install Path";
2015-04-27 22:25:09 +02:00
std::string path;
2016-07-09 11:21:54 +02:00
cmSystemTools::ReadRegistryValue(wp80Key, path, cmSystemTools::KeyWOW64_32);
2015-04-27 22:25:09 +02:00
return !path.empty();
}
2016-07-09 11:21:54 +02:00
bool cmGlobalVisualStudio11Generator::IsWindowsStoreToolsetInstalled() const
2015-04-27 22:25:09 +02:00
{
2016-07-09 11:21:54 +02:00
const char win80Key[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"
"VisualStudio\\11.0\\VC\\Libraries\\Core\\Arm";
2015-04-27 22:25:09 +02:00
std::vector<std::string> subkeys;
2016-07-09 11:21:54 +02:00
return cmSystemTools::GetRegistrySubKeys(win80Key, subkeys,
2015-04-27 22:25:09 +02:00
cmSystemTools::KeyWOW64_32);
}