158 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
 | |
|    file Copyright.txt 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 (const auto& 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();
 | |
| }
 |