cmGlobalVisualStudio9Generator.cxx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmGlobalVisualStudio9Generator.h"
  4. #include <cstring>
  5. #include <utility>
  6. #include <vector>
  7. #include "cmGlobalGenerator.h"
  8. #include "cmGlobalGeneratorFactory.h"
  9. #include "cmGlobalVisualStudioGenerator.h"
  10. #include "cmStringAlgorithms.h"
  11. #include "cmSystemTools.h"
  12. #include "cmVisualStudioWCEPlatformParser.h"
  13. class cmake;
  14. static const char vs9generatorName[] = "Visual Studio 9 2008";
  15. class cmGlobalVisualStudio9Generator::Factory : public cmGlobalGeneratorFactory
  16. {
  17. public:
  18. std::unique_ptr<cmGlobalGenerator> CreateGlobalGenerator(
  19. const std::string& name, bool allowArch, cmake* cm) const override
  20. {
  21. if (strncmp(name.c_str(), vs9generatorName,
  22. sizeof(vs9generatorName) - 1) != 0) {
  23. return std::unique_ptr<cmGlobalGenerator>();
  24. }
  25. const char* p = name.c_str() + sizeof(vs9generatorName) - 1;
  26. if (p[0] == '\0') {
  27. return std::unique_ptr<cmGlobalGenerator>(
  28. new cmGlobalVisualStudio9Generator(cm, name, ""));
  29. }
  30. if (!allowArch || p[0] != ' ') {
  31. return std::unique_ptr<cmGlobalGenerator>();
  32. }
  33. ++p;
  34. if (!strcmp(p, "IA64")) {
  35. return std::unique_ptr<cmGlobalGenerator>(
  36. new cmGlobalVisualStudio9Generator(cm, name, "Itanium"));
  37. }
  38. if (!strcmp(p, "Win64")) {
  39. return std::unique_ptr<cmGlobalGenerator>(
  40. new cmGlobalVisualStudio9Generator(cm, name, "x64"));
  41. }
  42. cmVisualStudioWCEPlatformParser parser(p);
  43. parser.ParseVersion("9.0");
  44. if (!parser.Found()) {
  45. return std::unique_ptr<cmGlobalGenerator>();
  46. }
  47. auto ret = std::unique_ptr<cmGlobalVisualStudio9Generator>(
  48. new cmGlobalVisualStudio9Generator(cm, name, p));
  49. ret->WindowsCEVersion = parser.GetOSVersion();
  50. return std::unique_ptr<cmGlobalGenerator>(std::move(ret));
  51. }
  52. cmDocumentationEntry GetDocumentation() const override
  53. {
  54. return { cmStrCat(vs9generatorName, " [arch]"),
  55. "Deprecated. Generates Visual Studio 2008 project files. "
  56. "Optional [arch] can be \"Win64\" or \"IA64\"." };
  57. }
  58. std::vector<std::string> GetGeneratorNames() const override
  59. {
  60. std::vector<std::string> names;
  61. names.emplace_back(vs9generatorName);
  62. return names;
  63. }
  64. std::vector<std::string> GetGeneratorNamesWithPlatform() const override
  65. {
  66. std::vector<std::string> names;
  67. names.emplace_back(cmStrCat(vs9generatorName, " Win64"));
  68. names.emplace_back(cmStrCat(vs9generatorName, " IA64"));
  69. cmVisualStudioWCEPlatformParser parser;
  70. parser.ParseVersion("9.0");
  71. const std::vector<std::string>& availablePlatforms =
  72. parser.GetAvailablePlatforms();
  73. for (std::string const& i : availablePlatforms) {
  74. names.emplace_back(cmStrCat("Visual Studio 9 2008 ", i));
  75. }
  76. return names;
  77. }
  78. bool SupportsToolset() const override { return false; }
  79. bool SupportsPlatform() const override { return true; }
  80. std::vector<std::string> GetKnownPlatforms() const override
  81. {
  82. std::vector<std::string> platforms;
  83. platforms.emplace_back("x64");
  84. platforms.emplace_back("Win32");
  85. platforms.emplace_back("Itanium");
  86. cmVisualStudioWCEPlatformParser parser;
  87. parser.ParseVersion("9.0");
  88. const std::vector<std::string>& availablePlatforms =
  89. parser.GetAvailablePlatforms();
  90. for (std::string const& i : availablePlatforms) {
  91. platforms.emplace_back(i);
  92. }
  93. return platforms;
  94. }
  95. std::string GetDefaultPlatformName() const override { return "Win32"; }
  96. };
  97. std::unique_ptr<cmGlobalGeneratorFactory>
  98. cmGlobalVisualStudio9Generator::NewFactory()
  99. {
  100. return std::unique_ptr<cmGlobalGeneratorFactory>(new Factory);
  101. }
  102. cmGlobalVisualStudio9Generator::cmGlobalVisualStudio9Generator(
  103. cmake* cm, const std::string& name,
  104. std::string const& platformInGeneratorName)
  105. : cmGlobalVisualStudio8Generator(cm, name, platformInGeneratorName)
  106. {
  107. this->Version = VSVersion::VS9;
  108. std::string vc9Express;
  109. this->ExpressEdition = cmSystemTools::ReadRegistryValue(
  110. "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VCExpress\\9.0\\Setup\\VC;"
  111. "ProductDir",
  112. vc9Express, cmSystemTools::KeyWOW64_32);
  113. }
  114. std::string cmGlobalVisualStudio9Generator::GetUserMacrosDirectory()
  115. {
  116. std::string base;
  117. std::string path;
  118. // base begins with the VisualStudioProjectsLocation reg value...
  119. if (cmSystemTools::ReadRegistryValue(
  120. "HKEY_CURRENT_USER\\Software\\Microsoft\\VisualStudio\\9.0;"
  121. "VisualStudioProjectsLocation",
  122. base)) {
  123. cmSystemTools::ConvertToUnixSlashes(base);
  124. // 9.0 macros folder:
  125. path = cmStrCat(base, "/VSMacros80");
  126. // *NOT* a typo; right now in Visual Studio 2008 beta the macros
  127. // folder is VSMacros80... They may change it to 90 before final
  128. // release of 2008 or they may not... we'll have to keep our eyes
  129. // on it
  130. }
  131. // path is (correctly) still empty if we did not read the base value from
  132. // the Registry value
  133. return path;
  134. }
  135. std::string cmGlobalVisualStudio9Generator::GetUserMacrosRegKeyBase()
  136. {
  137. return R"(Software\Microsoft\VisualStudio\9.0\vsmacros)";
  138. }