resolve cyclic dependency with zstd
[platform/upstream/cmake.git] / Source / cmFileAPICMakeFiles.cxx
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
5 #include <memory>
6 #include <string>
7 #include <vector>
8
9 #include <cm3p/json/value.h>
10
11 #include "cmFileAPI.h"
12 #include "cmGlobalGenerator.h"
13 #include "cmLocalGenerator.h"
14 #include "cmMakefile.h"
15 #include "cmSystemTools.h"
16 #include "cmake.h"
17
18 namespace {
19
20 class CMakeFiles
21 {
22   cmFileAPI& FileAPI;
23   unsigned long Version;
24   std::string CMakeModules;
25   std::string const& TopSource;
26   std::string const& TopBuild;
27   bool OutOfSource;
28
29   Json::Value DumpPaths();
30   Json::Value DumpInputs();
31   Json::Value DumpInput(std::string const& file);
32
33 public:
34   CMakeFiles(cmFileAPI& fileAPI, unsigned long version);
35   Json::Value Dump();
36 };
37
38 CMakeFiles::CMakeFiles(cmFileAPI& fileAPI, unsigned long version)
39   : FileAPI(fileAPI)
40   , Version(version)
41   , CMakeModules(cmSystemTools::GetCMakeRoot() + "/Modules")
42   , TopSource(this->FileAPI.GetCMakeInstance()->GetHomeDirectory())
43   , TopBuild(this->FileAPI.GetCMakeInstance()->GetHomeOutputDirectory())
44   , OutOfSource(this->TopBuild != this->TopSource)
45 {
46   static_cast<void>(this->Version);
47 }
48
49 Json::Value CMakeFiles::Dump()
50 {
51   Json::Value cmakeFiles = Json::objectValue;
52   cmakeFiles["paths"] = this->DumpPaths();
53   cmakeFiles["inputs"] = this->DumpInputs();
54   return cmakeFiles;
55 }
56
57 Json::Value CMakeFiles::DumpPaths()
58 {
59   Json::Value paths = Json::objectValue;
60   paths["source"] = this->TopSource;
61   paths["build"] = this->TopBuild;
62   return paths;
63 }
64
65 Json::Value CMakeFiles::DumpInputs()
66 {
67   Json::Value inputs = Json::arrayValue;
68
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));
75     }
76   }
77
78   return inputs;
79 }
80
81 Json::Value CMakeFiles::DumpInput(std::string const& file)
82 {
83   Json::Value input = Json::objectValue;
84
85   bool const isCMake = cmSystemTools::IsSubDirectory(file, this->CMakeModules);
86   if (isCMake) {
87     input["isCMake"] = true;
88   }
89
90   if (!cmSystemTools::IsSubDirectory(file, this->TopSource) &&
91       !cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
92     input["isExternal"] = true;
93   }
94
95   if (this->OutOfSource &&
96       cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
97     input["isGenerated"] = true;
98   }
99
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);
104   }
105   input["path"] = path;
106
107   return input;
108 }
109 }
110
111 Json::Value cmFileAPICMakeFilesDump(cmFileAPI& fileAPI, unsigned long version)
112 {
113   CMakeFiles cmakeFiles(fileAPI, version);
114   return cmakeFiles.Dump();
115 }