From 8bb5c96bf8bc363afa5da09ce1979614565d31ba Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Sep 2020 15:38:25 -0400 Subject: cmLocalVisualStudio7Generator: Adopt SourcesVisited lookup table Move it up the hierarchy from `cmLocalVisualStudio10Generator`. Propagate contents from a target's dependencies as part of the main target iteration logic instead of as part of the generator-specific target generation. --- Source/cmLocalVisualStudio10Generator.cxx | 7 ------- Source/cmLocalVisualStudio10Generator.h | 9 --------- Source/cmLocalVisualStudio7Generator.cxx | 9 +++++++++ Source/cmLocalVisualStudio7Generator.h | 9 +++++++++ 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Source/cmLocalVisualStudio10Generator.cxx b/Source/cmLocalVisualStudio10Generator.cxx index 98e9db9..3ed49a0 100644 --- a/Source/cmLocalVisualStudio10Generator.cxx +++ b/Source/cmLocalVisualStudio10Generator.cxx @@ -68,13 +68,6 @@ cmLocalVisualStudio10Generator::~cmLocalVisualStudio10Generator() void cmLocalVisualStudio10Generator::GenerateTarget(cmGeneratorTarget* target) { - auto& targetVisited = this->GetSourcesVisited(target); - auto& deps = this->GlobalGenerator->GetTargetDirectDepends(target); - for (auto& d : deps) { - // Take the union of visited source files of custom commands - auto depVisited = this->GetSourcesVisited(d); - targetVisited.insert(depVisited.begin(), depVisited.end()); - } if (static_cast(this->GlobalGenerator) ->TargetIsFortranOnly(target)) { this->cmLocalVisualStudio7Generator::GenerateTarget(target); diff --git a/Source/cmLocalVisualStudio10Generator.h b/Source/cmLocalVisualStudio10Generator.h index 631132e..45ee082 100644 --- a/Source/cmLocalVisualStudio10Generator.h +++ b/Source/cmLocalVisualStudio10Generator.h @@ -28,19 +28,10 @@ public: void ReadAndStoreExternalGUID(const std::string& name, const char* path) override; - std::set& GetSourcesVisited( - cmGeneratorTarget const* target) - { - return SourcesVisited[target]; - }; - protected: const char* ReportErrorLabel() const override; bool CustomCommandUseLocal() const override { return true; } private: void GenerateTarget(cmGeneratorTarget* target) override; - - std::map> - SourcesVisited; }; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 1ebd5da..362c3e7 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -86,6 +86,15 @@ void cmLocalVisualStudio7Generator::Generate() if (!gt->IsInBuildSystem() || gt->GetProperty("EXTERNAL_MSPROJECT")) { continue; } + + auto& gtVisited = this->GetSourcesVisited(gt); + auto& deps = this->GlobalGenerator->GetTargetDirectDepends(gt); + for (auto& d : deps) { + // Take the union of visited source files of custom commands + auto depVisited = this->GetSourcesVisited(d); + gtVisited.insert(depVisited.begin(), depVisited.end()); + } + this->GenerateTarget(gt); } diff --git a/Source/cmLocalVisualStudio7Generator.h b/Source/cmLocalVisualStudio7Generator.h index 9ccd1a1..6e06c09 100644 --- a/Source/cmLocalVisualStudio7Generator.h +++ b/Source/cmLocalVisualStudio7Generator.h @@ -83,6 +83,12 @@ public: virtual void ReadAndStoreExternalGUID(const std::string& name, const char* path); + std::set& GetSourcesVisited( + cmGeneratorTarget const* target) + { + return this->SourcesVisited[target]; + }; + protected: virtual void GenerateTarget(cmGeneratorTarget* target); @@ -148,4 +154,7 @@ private: bool FortranProject; bool WindowsCEProject; std::unique_ptr Internal; + + std::map> + SourcesVisited; }; -- cgit v0.12 From 066f4d0f0a324f0db810cde38904996bb16592cb Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 3 Sep 2020 15:44:07 -0400 Subject: VS: Avoid unnecessary duplication of custom commands across targets in VS 9 Do not attach a custom command to a target if it is already attached to one of the target's dependencies. The command's output will be available by the time the target needs it because the dependency containing the command will have already been built. The same change was already made by commit f59c33a763 (VS: Generate a custom command only in the least dependent target, 2018-03-23, v3.12.0-rc1~171^2) for VS 10+. --- Source/cmLocalVisualStudio7Generator.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 362c3e7..7795654 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -1624,6 +1624,8 @@ bool cmLocalVisualStudio7Generator::WriteGroup( this->WriteVCProjBeginGroup(fout, name.c_str(), ""); } + auto& sourcesVisited = this->GetSourcesVisited(target); + // Loop through each source in the source group. for (const cmSourceFile* sf : sourceFiles) { std::string source = sf->GetFullPath(); @@ -1647,7 +1649,10 @@ bool cmLocalVisualStudio7Generator::WriteGroup( // build it, then it will. fout << "\t\t\t\tRelativePath=\"" << d << "\">\n"; if (cmCustomCommand const* command = sf->GetCustomCommand()) { - this->WriteCustomRule(fout, configs, source.c_str(), *command, fcinfo); + if (sourcesVisited.insert(sf).second) { + this->WriteCustomRule(fout, configs, source.c_str(), *command, + fcinfo); + } } else if (!fcinfo.FileConfigMap.empty()) { const char* aCompilerTool = "VCCLCompilerTool"; std::string ppLang = "CXX"; -- cgit v0.12