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"
9 #include <cm3p/json/value.h>
11 #include "cmFileAPI.h"
12 #include "cmGlobalGenerator.h"
13 #include "cmLocalGenerator.h"
14 #include "cmMakefile.h"
15 #include "cmSystemTools.h"
23 unsigned long Version;
24 std::string CMakeModules;
25 std::string const& TopSource;
26 std::string const& TopBuild;
29 Json::Value DumpPaths();
30 Json::Value DumpInputs();
31 Json::Value DumpInput(std::string const& file);
34 CMakeFiles(cmFileAPI& fileAPI, unsigned long version);
38 CMakeFiles::CMakeFiles(cmFileAPI& fileAPI, unsigned long version)
41 , CMakeModules(cmSystemTools::GetCMakeRoot() + "/Modules")
42 , TopSource(this->FileAPI.GetCMakeInstance()->GetHomeDirectory())
43 , TopBuild(this->FileAPI.GetCMakeInstance()->GetHomeOutputDirectory())
44 , OutOfSource(this->TopBuild != this->TopSource)
46 static_cast<void>(this->Version);
49 Json::Value CMakeFiles::Dump()
51 Json::Value cmakeFiles = Json::objectValue;
52 cmakeFiles["paths"] = this->DumpPaths();
53 cmakeFiles["inputs"] = this->DumpInputs();
57 Json::Value CMakeFiles::DumpPaths()
59 Json::Value paths = Json::objectValue;
60 paths["source"] = this->TopSource;
61 paths["build"] = this->TopBuild;
65 Json::Value CMakeFiles::DumpInputs()
67 Json::Value inputs = Json::arrayValue;
69 cmGlobalGenerator* gg =
70 this->FileAPI.GetCMakeInstance()->GetGlobalGenerator();
71 for (const auto& lg : gg->GetLocalGenerators()) {
72 cmMakefile const* mf = lg->GetMakefile();
73 for (std::string const& file : mf->GetListFiles()) {
74 inputs.append(this->DumpInput(file));
81 Json::Value CMakeFiles::DumpInput(std::string const& file)
83 Json::Value input = Json::objectValue;
85 bool const isCMake = cmSystemTools::IsSubDirectory(file, this->CMakeModules);
87 input["isCMake"] = true;
90 if (!cmSystemTools::IsSubDirectory(file, this->TopSource) &&
91 !cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
92 input["isExternal"] = true;
95 if (this->OutOfSource &&
96 cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
97 input["isGenerated"] = true;
100 std::string path = file;
101 if (!isCMake && cmSystemTools::IsSubDirectory(path, this->TopSource)) {
102 // Use a relative path within the source directory.
103 path = cmSystemTools::RelativePath(this->TopSource, path);
105 input["path"] = path;
111 Json::Value cmFileAPICMakeFilesDump(cmFileAPI& fileAPI, unsigned long version)
113 CMakeFiles cmakeFiles(fileAPI, version);
114 return cmakeFiles.Dump();