cmFileAPIToolchains.cxx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file LICENSE.rst or https://cmake.org/licensing for details. */
  3. #include "cmFileAPIToolchains.h"
  4. #include <memory>
  5. #include <string>
  6. #include <vector>
  7. #include <cm3p/json/value.h>
  8. #include "cmFileAPI.h"
  9. #include "cmGlobalGenerator.h"
  10. #include "cmList.h"
  11. #include "cmMakefile.h"
  12. #include "cmState.h"
  13. #include "cmStringAlgorithms.h"
  14. #include "cmValue.h"
  15. #include "cmake.h"
  16. namespace {
  17. struct ToolchainVariable
  18. {
  19. std::string ObjectKey;
  20. std::string VariableSuffix;
  21. bool IsList;
  22. };
  23. class Toolchains
  24. {
  25. cmFileAPI& FileAPI;
  26. unsigned long Version;
  27. Json::Value DumpToolchains();
  28. Json::Value DumpToolchain(std::string const& lang);
  29. Json::Value DumpToolchainVariables(
  30. cmMakefile const* mf, std::string const& lang,
  31. std::vector<ToolchainVariable> const& variables);
  32. void DumpToolchainVariable(cmMakefile const* mf, Json::Value& object,
  33. std::string const& lang,
  34. ToolchainVariable const& variable);
  35. public:
  36. Toolchains(cmFileAPI& fileAPI, unsigned long version);
  37. Json::Value Dump();
  38. };
  39. Toolchains::Toolchains(cmFileAPI& fileAPI, unsigned long version)
  40. : FileAPI(fileAPI)
  41. , Version(version)
  42. {
  43. static_cast<void>(this->Version);
  44. }
  45. Json::Value Toolchains::Dump()
  46. {
  47. Json::Value toolchains = Json::objectValue;
  48. toolchains["toolchains"] = this->DumpToolchains();
  49. return toolchains;
  50. }
  51. Json::Value Toolchains::DumpToolchains()
  52. {
  53. Json::Value toolchains = Json::arrayValue;
  54. for (std::string const& lang :
  55. this->FileAPI.GetCMakeInstance()->GetState()->GetEnabledLanguages()) {
  56. toolchains.append(this->DumpToolchain(lang));
  57. }
  58. return toolchains;
  59. }
  60. Json::Value Toolchains::DumpToolchain(std::string const& lang)
  61. {
  62. static std::vector<ToolchainVariable> const CompilerVariables{
  63. { "path", "COMPILER", false },
  64. { "id", "COMPILER_ID", false },
  65. { "version", "COMPILER_VERSION", false },
  66. { "target", "COMPILER_TARGET", false },
  67. };
  68. static std::vector<ToolchainVariable> const CompilerImplicitVariables{
  69. { "includeDirectories", "IMPLICIT_INCLUDE_DIRECTORIES", true },
  70. { "linkDirectories", "IMPLICIT_LINK_DIRECTORIES", true },
  71. { "linkFrameworkDirectories", "IMPLICIT_LINK_FRAMEWORK_DIRECTORIES",
  72. true },
  73. { "linkLibraries", "IMPLICIT_LINK_LIBRARIES", true },
  74. };
  75. static ToolchainVariable const SourceFileExtensionsVariable{
  76. "sourceFileExtensions", "SOURCE_FILE_EXTENSIONS", true
  77. };
  78. auto const& mf =
  79. this->FileAPI.GetCMakeInstance()->GetGlobalGenerator()->GetMakefiles()[0];
  80. Json::Value toolchain = Json::objectValue;
  81. toolchain["language"] = lang;
  82. toolchain["compiler"] =
  83. this->DumpToolchainVariables(mf.get(), lang, CompilerVariables);
  84. toolchain["compiler"]["implicit"] =
  85. this->DumpToolchainVariables(mf.get(), lang, CompilerImplicitVariables);
  86. this->DumpToolchainVariable(mf.get(), toolchain, lang,
  87. SourceFileExtensionsVariable);
  88. return toolchain;
  89. }
  90. Json::Value Toolchains::DumpToolchainVariables(
  91. cmMakefile const* mf, std::string const& lang,
  92. std::vector<ToolchainVariable> const& variables)
  93. {
  94. Json::Value object = Json::objectValue;
  95. for (auto const& variable : variables) {
  96. this->DumpToolchainVariable(mf, object, lang, variable);
  97. }
  98. return object;
  99. }
  100. void Toolchains::DumpToolchainVariable(cmMakefile const* mf,
  101. Json::Value& object,
  102. std::string const& lang,
  103. ToolchainVariable const& variable)
  104. {
  105. std::string const variableName =
  106. cmStrCat("CMAKE_", lang, '_', variable.VariableSuffix);
  107. if (variable.IsList) {
  108. cmValue data = mf->GetDefinition(variableName);
  109. if (data) {
  110. cmList values(data);
  111. Json::Value jsonArray = Json::arrayValue;
  112. for (auto const& value : values) {
  113. jsonArray.append(value);
  114. }
  115. object[variable.ObjectKey] = jsonArray;
  116. }
  117. } else {
  118. cmValue def = mf->GetDefinition(variableName);
  119. if (def) {
  120. object[variable.ObjectKey] = *def;
  121. }
  122. }
  123. }
  124. }
  125. Json::Value cmFileAPIToolchainsDump(cmFileAPI& fileAPI, unsigned long version)
  126. {
  127. Toolchains toolchains(fileAPI, version);
  128. return toolchains.Dump();
  129. }