1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmFileAPICMakeFiles.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include <cm3p/json/value.h>
#include "cmFileAPI.h"
#include "cmGlobCacheEntry.h"
#include "cmGlobalGenerator.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmSystemTools.h"
#include "cmake.h"
namespace {
class CMakeFiles
{
cmFileAPI& FileAPI;
unsigned long Version;
std::string CMakeModules;
std::string const& TopSource;
std::string const& TopBuild;
bool OutOfSource;
Json::Value DumpPaths();
Json::Value DumpInputs();
Json::Value DumpInput(std::string const& file);
Json::Value DumpGlobsDependent();
Json::Value DumpGlobDependent(cmGlobCacheEntry const& entry);
public:
CMakeFiles(cmFileAPI& fileAPI, unsigned long version);
Json::Value Dump();
};
CMakeFiles::CMakeFiles(cmFileAPI& fileAPI, unsigned long version)
: FileAPI(fileAPI)
, Version(version)
, CMakeModules(cmSystemTools::GetCMakeRoot() + "/Modules")
, TopSource(this->FileAPI.GetCMakeInstance()->GetHomeDirectory())
, TopBuild(this->FileAPI.GetCMakeInstance()->GetHomeOutputDirectory())
, OutOfSource(this->TopBuild != this->TopSource)
{
static_cast<void>(this->Version);
}
Json::Value CMakeFiles::Dump()
{
Json::Value cmakeFiles = Json::objectValue;
cmakeFiles["paths"] = this->DumpPaths();
cmakeFiles["inputs"] = this->DumpInputs();
Json::Value globsDependent = this->DumpGlobsDependent();
if (!globsDependent.empty()) {
cmakeFiles["globsDependent"] = std::move(globsDependent);
}
return cmakeFiles;
}
Json::Value CMakeFiles::DumpPaths()
{
Json::Value paths = Json::objectValue;
paths["source"] = this->TopSource;
paths["build"] = this->TopBuild;
return paths;
}
Json::Value CMakeFiles::DumpInputs()
{
Json::Value inputs = Json::arrayValue;
cmGlobalGenerator* gg =
this->FileAPI.GetCMakeInstance()->GetGlobalGenerator();
for (auto const& lg : gg->GetLocalGenerators()) {
cmMakefile const* mf = lg->GetMakefile();
for (std::string const& file : mf->GetListFiles()) {
inputs.append(this->DumpInput(file));
}
}
return inputs;
}
Json::Value CMakeFiles::DumpInput(std::string const& file)
{
Json::Value input = Json::objectValue;
bool const isCMake = cmSystemTools::IsSubDirectory(file, this->CMakeModules);
if (isCMake) {
input["isCMake"] = true;
}
if (!cmSystemTools::IsSubDirectory(file, this->TopSource) &&
!cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
input["isExternal"] = true;
}
if (this->OutOfSource &&
cmSystemTools::IsSubDirectory(file, this->TopBuild)) {
input["isGenerated"] = true;
}
std::string path = file;
if (!isCMake && cmSystemTools::IsSubDirectory(path, this->TopSource)) {
// Use a relative path within the source directory.
path = cmSystemTools::RelativePath(this->TopSource, path);
}
input["path"] = path;
return input;
}
Json::Value CMakeFiles::DumpGlobsDependent()
{
Json::Value globsDependent = Json::arrayValue;
for (cmGlobCacheEntry const& entry :
this->FileAPI.GetCMakeInstance()->GetGlobCacheEntries()) {
globsDependent.append(this->DumpGlobDependent(entry));
}
return globsDependent;
}
Json::Value CMakeFiles::DumpGlobDependent(cmGlobCacheEntry const& entry)
{
Json::Value globDependent = Json::objectValue;
globDependent["expression"] = entry.Expression;
if (entry.Recurse) {
globDependent["recurse"] = true;
}
if (entry.ListDirectories) {
globDependent["listDirectories"] = true;
}
if (entry.FollowSymlinks) {
globDependent["followSymlinks"] = true;
}
if (!entry.Relative.empty()) {
globDependent["relative"] = entry.Relative;
}
Json::Value paths = Json::arrayValue;
for (std::string const& file : entry.Files) {
paths.append(file);
}
globDependent["paths"] = std::move(paths);
return globDependent;
}
}
Json::Value cmFileAPICMakeFilesDump(cmFileAPI& fileAPI, unsigned long version)
{
CMakeFiles cmakeFiles(fileAPI, version);
return cmakeFiles.Dump();
}
|