From 42ebb1886f7500c2f7a34fee99e2e9fa749f5a93 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 22 Feb 2013 13:03:35 +0100 Subject: [PATCH] Memoize includes and defines from interface libraries. This is similar in spirit to commit e48d8420 (Cache context-independent includes on evaluation., 2013-02-03), but it is needed since commit a1c4905f (Use the link information as a source of compile definitions and includes., 2013-02-12), which changed how includes and defines are determined. As they are now determined through the link interface, we need to cache the result of evaluating them through that. In the case of the includes, the result was already being cached and then immediately disposed. Store the result as a member variable instead to make use of the caching. --- Source/cmTarget.cxx | 132 +++++++++++++++++++++++++++++--------------- 1 file changed, 88 insertions(+), 44 deletions(-) diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 003f3d830..717cfc852 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -92,6 +92,7 @@ public: // Others not copied here are result caches. this->SourceEntries = r.SourceEntries; } + ~cmTargetInternals(); typedef cmTarget::SourceFileFlags SourceFileFlags; std::map SourceFlagsMap; bool SourceFileFlagsConstructed; @@ -138,8 +139,35 @@ public: }; std::vector IncludeDirectoriesEntries; std::vector LinkInterfaceIncludeDirectoriesEntries; + + std::vector + CachedLinkInterfaceIncludeDirectoriesEntries; + std::map CachedLinkInterfaceCompileDefinitions; + + std::map CacheLinkInterfaceIncludeDirectoriesDone; + std::map CacheLinkInterfaceCompileDefinitionsDone; }; +//---------------------------------------------------------------------------- +void deleteAndClear( + std::vector &entries) +{ + for (std::vector::const_iterator + it = entries.begin(), + end = entries.end(); + it != end; ++it) + { + delete *it; + } + entries.clear(); +} + +//---------------------------------------------------------------------------- +cmTargetInternals::~cmTargetInternals() +{ + deleteAndClear(CachedLinkInterfaceIncludeDirectoriesEntries); +} + //---------------------------------------------------------------------------- cmTarget::cmTarget() { @@ -2654,20 +2682,6 @@ void cmTarget::GatherDependencies( const cmMakefile& mf, } } -//---------------------------------------------------------------------------- -void deleteAndClear( - std::vector &entries) -{ - for (std::vector::const_iterator - it = entries.begin(), - end = entries.end(); - it != end; ++it) - { - delete *it; - } - entries.clear(); -} - //---------------------------------------------------------------------------- void cmTarget::SetProperty(const char* prop, const char* value) { @@ -2870,41 +2884,53 @@ std::vector cmTarget::GetIncludeDirectories(const char *config) config, debugIncludes); - std::vector - linkInterfaceIncludeDirectoriesEntries; - - for (std::vector::const_iterator - it = this->Internal->LinkInterfaceIncludeDirectoriesEntries.begin(), - end = this->Internal->LinkInterfaceIncludeDirectoriesEntries.end(); - it != end; ++it) + std::string configString = config ? config : ""; + if (!this->Internal->CacheLinkInterfaceIncludeDirectoriesDone[configString]) { - { - cmGeneratorExpression ge(lfbt); - cmsys::auto_ptr cge = ge.Parse(it->Value); - std::string result = cge->Evaluate(this->Makefile, config, - false, this, 0, 0); - if (!this->Makefile->FindTargetToUse(result.c_str())) + for (std::vector::const_iterator + it = this->Internal->LinkInterfaceIncludeDirectoriesEntries.begin(), + end = this->Internal->LinkInterfaceIncludeDirectoriesEntries.end(); + it != end; ++it) { - continue; + { + cmGeneratorExpression ge(lfbt); + cmsys::auto_ptr cge = + ge.Parse(it->Value); + std::string result = cge->Evaluate(this->Makefile, config, + false, this, 0, 0); + if (!this->Makefile->FindTargetToUse(result.c_str())) + { + continue; + } } - } - cmGeneratorExpression ge(it->Backtrace); - cmsys::auto_ptr cge = ge.Parse( - "$Value + ",INTERFACE_INCLUDE_DIRECTORIES>"); + cmGeneratorExpression ge(it->Backtrace); + cmsys::auto_ptr cge = ge.Parse( + "$Value + ",INTERFACE_INCLUDE_DIRECTORIES>"); - linkInterfaceIncludeDirectoriesEntries.push_back( + this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries.push_back( new cmTargetInternals::IncludeDirectoriesEntry(cge)); + } } processIncludeDirectories(this, - linkInterfaceIncludeDirectoriesEntries, + this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries, includes, uniqueIncludes, &dagChecker, config, debugIncludes); - deleteAndClear(linkInterfaceIncludeDirectoriesEntries); + if (!this->Makefile->IsGeneratingBuildSystem()) + { + deleteAndClear( + this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries); + } + else + { + this->Internal->CacheLinkInterfaceIncludeDirectoriesDone[configString] + = true; + } return includes; } @@ -2957,16 +2983,34 @@ std::string cmTarget::GetCompileDefinitions(const char *config) } } - cmGeneratorExpression ge2(lfbt); - cmsys::auto_ptr cge2 = ge2.Parse(depString); - std::string depResult = cge2->Evaluate(this->Makefile, - config, - false, - this, - &dagChecker); - if (!depResult.empty()) + std::string configString = config ? config : ""; + if (!this->Internal->CacheLinkInterfaceCompileDefinitionsDone[configString]) { - result += (result.empty() ? "" : ";") + depResult; + cmGeneratorExpression ge2(lfbt); + cmsys::auto_ptr cge2 = + ge2.Parse(depString); + this->Internal->CachedLinkInterfaceCompileDefinitions[configString] = + cge2->Evaluate(this->Makefile, + config, + false, + this, + &dagChecker); + } + if (!this->Internal->CachedLinkInterfaceCompileDefinitions[configString] + .empty()) + { + result += (result.empty() ? "" : ";") + + this->Internal->CachedLinkInterfaceCompileDefinitions[configString]; + } + + if (!this->Makefile->IsGeneratingBuildSystem()) + { + this->Internal->CachedLinkInterfaceCompileDefinitions[configString] = ""; + } + else + { + this->Internal->CacheLinkInterfaceCompileDefinitionsDone[configString] + = true; } return result;