cmFileAPICMakeFiles.cxx 2.8 KB

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