From 83498d413530570f7ab9affee5b8301c888bf91e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 1 Jul 2013 22:55:25 +0200 Subject: [PATCH] Store system include directories in the cmTarget. Entries from the cmMakefile are processed and maintained similarly to other include directories. The include_directories(SYSTEM) signature affects all following targets, and all prior targets in the same makefile. --- Source/cmGeneratorTarget.cxx | 18 +++++++++++++++++- Source/cmMakefile.cxx | 22 ++++------------------ Source/cmMakefile.h | 3 +++ Source/cmTarget.cxx | 33 +++++++++++++++++++++++++++++++++ Source/cmTarget.h | 9 +++++++++ 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 61ff8d511..9167b25a3 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -51,7 +51,23 @@ const char *cmGeneratorTarget::GetProperty(const char *prop) bool cmGeneratorTarget::IsSystemIncludeDirectory(const char *dir, const char *config) { - return this->Makefile->IsSystemIncludeDirectory(dir, config); + for (std::set::const_iterator + it = this->Target->GetSystemIncludeDirectories().begin(); + it != this->Target->GetSystemIncludeDirectories().end(); ++it) + { + cmListFileBacktrace lfbt; + cmGeneratorExpression ge(lfbt); + + std::vector incs; + cmSystemTools::ExpandListArgument(ge.Parse(*it) + ->Evaluate(this->Makefile, + config, false), incs); + if (std::find(incs.begin(), incs.end(), dir) != incs.end()) + { + return true; + } + } + return false; } //---------------------------------------------------------------------------- diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index f3a66bab8..ecc094222 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1675,27 +1675,13 @@ cmMakefile::AddSystemIncludeDirectories(const std::set &incs) { this->SystemIncludeDirectories.insert(*li); } -} -//---------------------------------------------------------------------------- -bool cmMakefile::IsSystemIncludeDirectory(const char* dir, const char *config) -{ - for (std::set::const_iterator - it = this->SystemIncludeDirectories.begin(); - it != this->SystemIncludeDirectories.end(); ++it) + for (cmTargets::iterator l = this->Targets.begin(); + l != this->Targets.end(); ++l) { - cmListFileBacktrace lfbt; - cmGeneratorExpression ge(lfbt); - - std::vector incs; - cmSystemTools::ExpandListArgument(ge.Parse(*it) - ->Evaluate(this, config, false), incs); - if (std::find(incs.begin(), incs.end(), dir) != incs.end()) - { - return true; - } + cmTarget &t = l->second; + t.AddSystemIncludeDirectories(incs); } - return false; } void cmMakefile::AddDefinition(const char* name, const char* value) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 42971559e..082224026 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -875,6 +875,9 @@ public: bool IsGeneratingBuildSystem(){ return this->GeneratingBuildSystem; } void SetGeneratingBuildSystem(){ this->GeneratingBuildSystem = true; } + std::set const & GetSystemIncludeDirectories() const + { return this->SystemIncludeDirectories; } + protected: // add link libraries and directories to the target void AddGlobalLinkInformation(const char* name, cmTarget& target); diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index a90fa74cb..7ad42f826 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -1647,6 +1647,17 @@ void cmTarget::SetMakefile(cmMakefile* mf) { this->InsertInclude(*it); } + + const std::set parentSystemIncludes = + this->Makefile->GetSystemIncludeDirectories(); + + for (std::set::const_iterator it + = parentSystemIncludes.begin(); + it != parentSystemIncludes.end(); ++it) + { + this->SystemIncludeDirectories.insert(*it); + } + const std::vector parentOptions = this->Makefile->GetCompileOptionsEntries(); @@ -2522,6 +2533,28 @@ void cmTarget::AddLinkLibrary(cmMakefile& mf, } +//---------------------------------------------------------------------------- +void +cmTarget::AddSystemIncludeDirectories(const std::set &incs) +{ + for(std::set::const_iterator li = incs.begin(); + li != incs.end(); ++li) + { + this->SystemIncludeDirectories.insert(*li); + } +} + +//---------------------------------------------------------------------------- +void +cmTarget::AddSystemIncludeDirectories(const std::vector &incs) +{ + for(std::vector::const_iterator li = incs.begin(); + li != incs.end(); ++li) + { + this->SystemIncludeDirectories.insert(*li); + } +} + //---------------------------------------------------------------------------- void cmTarget::AnalyzeLibDependencies( const cmMakefile& mf ) diff --git a/Source/cmTarget.h b/Source/cmTarget.h index 3bc0ab2e2..ff6d9235d 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -533,7 +533,16 @@ public: std::string GetDebugGeneratorExpressions(const std::string &value, cmTarget::LinkLibraryType llt); + + void AddSystemIncludeDirectories(const std::set &incs); + void AddSystemIncludeDirectories(const std::vector &incs); + std::set const & GetSystemIncludeDirectories() const + { return this->SystemIncludeDirectories; } private: + // The set of include directories that are marked as system include + // directories. + std::set SystemIncludeDirectories; + /** * A list of direct dependencies. Use in conjunction with DependencyMap. */