cmFileAPICMakeFiles.cxx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 "cmFileAPICMakeFiles.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 "cmLocalGenerator.h"
  11. #include "cmMakefile.h"
  12. #include "cmSystemTools.h"
  13. #include "cmake.h"
  14. namespace {
  15. class CMakeFiles
  16. {
  17. cmFileAPI& FileAPI;
  18. unsigned long Version;
  19. std::string CMakeModules;
  20. std::string const& TopSource;
  21. std::string const& TopBuild;
  22. bool OutOfSource;
  23. Json::Value DumpPaths();
  24. Json::Value DumpInputs();
  25. Json::Value DumpInput(std::string const& file);
  26. public:
  27. CMakeFiles(cmFileAPI& fileAPI, unsigned long version);
  28. Json::Value Dump();
  29. };
  30. CMakeFiles::CMakeFiles(cmFileAPI& fileAPI, unsigned long version)
  31. : FileAPI(fileAPI)
  32. , Version(version)
  33. , CMakeModules(cmSystemTools::GetCMakeRoot() + "/Modules")
  34. , TopSource(this->FileAPI.GetCMakeInstance()->GetHomeDirectory())
  35. , TopBuild(this->FileAPI.GetCMakeInstance()->GetHomeOutputDirectory())
  36. , OutOfSource(this->TopBuild != this->TopSource)
  37. {
  38. static_cast<void>(this->Version);
  39. }
  40. Json::Value CMakeFiles::Dump()
  41. {
  42. Json::Value cmakeFiles = Json::objectValue;
  43. cmakeFiles["paths"] = this->DumpPaths();
  44. cmakeFiles["inputs"] = this->DumpInputs();
  45. return cmakeFiles;
  46. }
  47. Json::Value CMakeFiles::DumpPaths()
  48. {
  49. Json::Value paths = Json::objectValue;
  50. paths["source"] = this->TopSource;
  51. paths["build"] = this->TopBuild;
  52. return paths;
  53. }
  54. Json::Value CMakeFiles::DumpInputs()
  55. {
  56. Json::Value inputs = Json::arrayValue;
  57. cmGlobalGenerator* gg =
  58. this->FileAPI.GetCMakeInstance()->GetGlobalGenerator();
  59. for (const auto& lg : gg->GetLocalGenerators()) {
  60. cmMakefile const* mf = lg->GetMakefile();
  61. for (std::string const& file : mf->GetListFiles()) {
  62. inputs.append(this->DumpInput(file));
  63. }
  64. }
  65. return inputs;
  66. }
  67. Json::Value CMakeFiles::DumpInput(std::string const& file)
  68. {
  69. Json::Value input = Json::objectValue;
  70. bool const isCMake = cmSystemTools::IsSubDirectory(file, this->CMakeModules);
  71. if (isCMake) {
  72. input["isCMake"] = true;
  73. }
  74. if (!cmSystemTools::IsSubDirectory(file, this->TopSource) &&
  75. !cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
  76. input["isExternal"] = true;
  77. }
  78. if (this->OutOfSource &&
  79. cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
  80. input["isGenerated"] = true;
  81. }
  82. std::string path = file;
  83. if (!isCMake && cmSystemTools::IsSubDirectory(path, this->TopSource)) {
  84. // Use a relative path within the source directory.
  85. path = cmSystemTools::RelativePath(this->TopSource, path);
  86. }
  87. input["path"] = path;
  88. return input;
  89. }
  90. }
  91. Json::Value cmFileAPICMakeFilesDump(cmFileAPI& fileAPI, unsigned long version)
  92. {
  93. CMakeFiles cmakeFiles(fileAPI, version);
  94. return cmakeFiles.Dump();
  95. }