mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 10:47:59 +08:00

The file API code used unsigned long to hold the major version in most places, but not all. Some places used unsigned int, and an important one of those is the cmFileApi::BuildVersion() function. As a result, it has never been safe for a large value not representable by an unsigned int to be used in these variables. Convert all of the file API version number variables and function arguments to use unsigned int consistently. This avoids any size mismatch warnings when passing values around. They also don't need to be unsigned long, as we never expect version numbers to be anything even close to what an unsigned int cannot represent.
158 lines
4.1 KiB
C++
158 lines
4.1 KiB
C++
/* 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 int 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 int version);
|
|
Json::Value Dump();
|
|
};
|
|
|
|
CMakeFiles::CMakeFiles(cmFileAPI& fileAPI, unsigned int 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 int version)
|
|
{
|
|
CMakeFiles cmakeFiles(fileAPI, version);
|
|
return cmakeFiles.Dump();
|
|
}
|