diff options
author | Brad King <brad.king@kitware.com> | 2018-11-13 14:34:10 (GMT) |
---|---|---|
committer | Kyle Edwards <kyle.edwards@kitware.com> | 2018-12-12 20:12:26 (GMT) |
commit | 4b6b2a571c39439f3b07d56f36e6a927ed6d1dd8 (patch) | |
tree | c0ee27f9e86aea592e750d4004c46f96b44d9df4 /Source/cmFileAPICodemodel.cxx | |
parent | eb8c7676a4723a44245e47630f12d4868e8e182c (diff) | |
download | CMake-4b6b2a571c39439f3b07d56f36e6a927ed6d1dd8.zip CMake-4b6b2a571c39439f3b07d56f36e6a927ed6d1dd8.tar.gz CMake-4b6b2a571c39439f3b07d56f36e6a927ed6d1dd8.tar.bz2 |
fileapi: extend codemodel v2 with directory details
Issue: #18398
Co-Author: Kyle Edwards <kyle.edwards@kitware.com>
Diffstat (limited to 'Source/cmFileAPICodemodel.cxx')
-rw-r--r-- | Source/cmFileAPICodemodel.cxx | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/Source/cmFileAPICodemodel.cxx b/Source/cmFileAPICodemodel.cxx index d432c1e..078d1d5 100644 --- a/Source/cmFileAPICodemodel.cxx +++ b/Source/cmFileAPICodemodel.cxx @@ -8,6 +8,7 @@ #include "cmGeneratorTarget.h" #include "cmGlobalGenerator.h" #include "cmInstallGenerator.h" +#include "cmInstallSubdirectoryGenerator.h" #include "cmInstallTargetGenerator.h" #include "cmLinkLineComputer.h" #include "cmListFileCache.h" @@ -62,8 +63,10 @@ class CodemodelConfig struct Directory { cmStateSnapshot Snapshot; + cmLocalGenerator const* LocalGenerator = nullptr; Json::Value TargetIndexes = Json::arrayValue; Json::ArrayIndex ProjectIndex; + bool HasInstallRule = false; }; std::map<cmStateSnapshot, Json::ArrayIndex, cmStateSnapshot::StrictWeakOrder> DirectoryMap; @@ -99,6 +102,8 @@ class CodemodelConfig Json::Value DumpProjects(); Json::Value DumpProject(Project& p); + Json::Value DumpMinimumCMakeVersion(cmStateSnapshot s); + public: CodemodelConfig(cmFileAPI& fileAPI, unsigned long version, std::string const& config); @@ -396,11 +401,36 @@ void CodemodelConfig::ProcessDirectories() this->Directories.emplace_back(); Directory& d = this->Directories[directoryIndex]; d.Snapshot = lg->GetStateSnapshot().GetBuildsystemDirectory(); + d.LocalGenerator = lg; this->DirectoryMap[d.Snapshot] = directoryIndex; d.ProjectIndex = this->AddProject(d.Snapshot); this->Projects[d.ProjectIndex].DirectoryIndexes.append(directoryIndex); } + + // Update directories in reverse order to process children before parents. + for (auto di = this->Directories.rbegin(); di != this->Directories.rend(); + ++di) { + Directory& d = *di; + + // Accumulate the presence of install rules on the way up. + for (auto gen : d.LocalGenerator->GetMakefile()->GetInstallGenerators()) { + if (!dynamic_cast<cmInstallSubdirectoryGenerator*>(gen)) { + d.HasInstallRule = true; + break; + } + } + if (!d.HasInstallRule) { + for (cmStateSnapshot const& child : d.Snapshot.GetChildren()) { + cmStateSnapshot childDir = child.GetBuildsystemDirectory(); + Json::ArrayIndex const childIndex = this->GetDirectoryIndex(childDir); + if (this->Directories[childIndex].HasInstallRule) { + d.HasInstallRule = true; + break; + } + } + } + } } Json::ArrayIndex CodemodelConfig::GetDirectoryIndex(cmLocalGenerator const* lg) @@ -531,6 +561,15 @@ Json::Value CodemodelConfig::DumpDirectory(Directory& d) directory["targetIndexes"] = std::move(d.TargetIndexes); } + Json::Value minimumCMakeVersion = this->DumpMinimumCMakeVersion(d.Snapshot); + if (!minimumCMakeVersion.isNull()) { + directory["minimumCMakeVersion"] = std::move(minimumCMakeVersion); + } + + if (d.HasInstallRule) { + directory["hasInstallRule"] = true; + } + return directory; } @@ -566,6 +605,17 @@ Json::Value CodemodelConfig::DumpProject(Project& p) return project; } +Json::Value CodemodelConfig::DumpMinimumCMakeVersion(cmStateSnapshot s) +{ + Json::Value minimumCMakeVersion; + if (std::string const* def = + s.GetDefinition("CMAKE_MINIMUM_REQUIRED_VERSION")) { + minimumCMakeVersion = Json::objectValue; + minimumCMakeVersion["string"] = *def; + } + return minimumCMakeVersion; +} + Target::Target(cmGeneratorTarget* gt, std::string const& config) : GT(gt) , Config(config) |