diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmDocumentGeneratorExpressions.h | 8 | ||||
-rw-r--r-- | Source/cmExportFileGenerator.cxx | 73 | ||||
-rw-r--r-- | Source/cmExportFileGenerator.h | 4 | ||||
-rw-r--r-- | Source/cmFindPackageCommand.cxx | 20 | ||||
-rw-r--r-- | Source/cmGeneratorExpressionDAGChecker.cxx | 3 | ||||
-rw-r--r-- | Source/cmGeneratorExpressionEvaluator.cxx | 171 | ||||
-rw-r--r-- | Source/cmListFileCache.h | 9 | ||||
-rw-r--r-- | Source/cmMakefile.cxx | 12 | ||||
-rw-r--r-- | Source/cmMakefile.h | 7 | ||||
-rw-r--r-- | Source/cmMakefileIncludeDirectoriesEntry.h | 28 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 203 | ||||
-rw-r--r-- | Source/cmTarget.h | 5 | ||||
-rw-r--r-- | Source/cmTargetCompileDefinitionsCommand.cxx | 2 | ||||
-rw-r--r-- | Source/cmTargetIncludeDirectoriesCommand.cxx | 4 | ||||
-rw-r--r-- | Source/cmTargetLinkLibrariesCommand.cxx | 52 |
15 files changed, 254 insertions, 347 deletions
diff --git a/Source/cmDocumentGeneratorExpressions.h b/Source/cmDocumentGeneratorExpressions.h index 3993f7d..8b80a8a 100644 --- a/Source/cmDocumentGeneratorExpressions.h +++ b/Source/cmDocumentGeneratorExpressions.h @@ -51,14 +51,6 @@ "on the target tgt.\n" \ "Note that tgt is not added as a dependency of the target this " \ "expression is evaluated on.\n" \ - " $<LINKED:item> = An empty string if item is not a " \ - "target. If item is a target then the " \ - "INTERFACE_INCLUDE_DIRECTORIES or INTERFACE_COMPILE_DEFINITIONS " \ - "content is read from the target. " \ - "This generator expression can only be used in evaluation of the " \ - "INCLUDE_DIRECTORIES or COMPILE_DEFINITIONS property. Note that " \ - "this expression is for internal use and may be changed or removed " \ - "in the future.\n" \ " $<TARGET_POLICY:pol> = '1' if the policy was NEW when " \ "the 'head' target was created, else '0'. If the policy was not " \ "set, the warning message for the policy will be emitted. This " \ diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index fbed95a..ef4ea38 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -25,8 +25,6 @@ #include <cmsys/auto_ptr.hxx> -#include "assert.h" - //---------------------------------------------------------------------------- cmExportFileGenerator::cmExportFileGenerator() { @@ -162,7 +160,7 @@ void cmExportFileGenerator::PopulateInterfaceProperty(const char *propName, preprocessRule); if (!prepro.empty()) { - this->ResolveTargetsInGeneratorExpressions(prepro, target, propName, + this->ResolveTargetsInGeneratorExpressions(prepro, target, missingTargets); properties[outputName] = prepro; } @@ -266,16 +264,15 @@ void cmExportFileGenerator::GenerateInterfaceProperties(cmTarget *target, { if (!properties.empty()) { - os << "if(NOT ${CMAKE_FIND_PACKAGE_NAME}_NO_INTERFACES)\n"; std::string targetName = this->Namespace; targetName += target->GetName(); - os << " set_target_properties(" << targetName << " PROPERTIES\n"; + os << "set_target_properties(" << targetName << " PROPERTIES\n"; for(ImportPropertyMap::const_iterator pi = properties.begin(); pi != properties.end(); ++pi) { - os << " " << pi->first << " \"" << pi->second << "\"\n"; + os << " " << pi->first << " \"" << pi->second << "\"\n"; } - os << " )\nendif()\n\n"; + os << ")\n\n"; } } @@ -318,14 +315,13 @@ cmExportFileGenerator::AddTargetNamespace(std::string &input, void cmExportFileGenerator::ResolveTargetsInGeneratorExpressions( std::string &input, - cmTarget* target, const char *propName, + cmTarget* target, std::vector<std::string> &missingTargets, FreeTargetsReplace replace) { if (replace == NoReplaceFreeTargets) { - this->ResolveTargetsInGeneratorExpression(input, target, propName, - missingTargets); + this->ResolveTargetsInGeneratorExpression(input, target, missingTargets); return; } std::vector<std::string> parts; @@ -344,7 +340,7 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpressions( { this->ResolveTargetsInGeneratorExpression( *li, - target, propName, + target, missingTargets); } input += sep + *li; @@ -356,7 +352,7 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpressions( void cmExportFileGenerator::ResolveTargetsInGeneratorExpression( std::string &input, - cmTarget* target, const char *propName, + cmTarget* target, std::vector<std::string> &missingTargets) { std::string::size_type pos = 0; @@ -393,57 +389,6 @@ cmExportFileGenerator::ResolveTargetsInGeneratorExpression( std::string errorString; pos = 0; lastPos = pos; - while((pos = input.find("$<LINKED:", lastPos)) != input.npos) - { - std::string::size_type nameStartPos = pos + sizeof("$<LINKED:") - 1; - std::string::size_type endPos = input.find(">", nameStartPos); - if (endPos == input.npos) - { - errorString = "$<LINKED:...> expression incomplete"; - break; - } - std::string targetName = input.substr(nameStartPos, - endPos - nameStartPos); - if(targetName.find("$<") != input.npos) - { - errorString = "$<LINKED:...> requires its parameter to be a " - "literal."; - break; - } - if (this->AddTargetNamespace(targetName, target, missingTargets)) - { - assert(propName); // The link libraries strings will - // never contain $<LINKED> - std::string replacement = "$<TARGET_PROPERTY:" - + targetName + "," + propName; - input.replace(pos, endPos - pos, replacement); - lastPos = pos + replacement.size() + 1; - } - else - { - if (pos != 0) - { - if (input[pos - 1] == ';') - { - --pos; - } - } - else if (input[endPos + 1] == ';') - { - ++endPos; - } - input.replace(pos, endPos - pos + 1, ""); - lastPos = pos; - } - } - if (!errorString.empty()) - { - mf->IssueMessage(cmake::FATAL_ERROR, errorString); - return; - } - - pos = 0; - lastPos = pos; while((pos = input.find("$<TARGET_NAME:", lastPos)) != input.npos) { std::string::size_type nameStartPos = pos + sizeof("$<TARGET_NAME:") - 1; @@ -537,7 +482,7 @@ cmExportFileGenerator preprocessRule); if (!prepro.empty()) { - this->ResolveTargetsInGeneratorExpressions(prepro, target, 0, + this->ResolveTargetsInGeneratorExpressions(prepro, target, missingTargets, ReplaceFreeTargets); properties["IMPORTED_LINK_INTERFACE_LIBRARIES" + suffix] = prepro; diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h index 5ad27bf..776be61 100644 --- a/Source/cmExportFileGenerator.h +++ b/Source/cmExportFileGenerator.h @@ -119,7 +119,7 @@ protected: }; void ResolveTargetsInGeneratorExpressions(std::string &input, - cmTarget* target, const char *propName, + cmTarget* target, std::vector<std::string> &missingTargets, FreeTargetsReplace replace = NoReplaceFreeTargets); @@ -150,7 +150,7 @@ private: std::vector<std::string> &missingTargets); void ResolveTargetsInGeneratorExpression(std::string &input, - cmTarget* target, const char *propName, + cmTarget* target, std::vector<std::string> &missingTargets); virtual void ReplaceInstallPrefix(std::string &input); diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 6e78bd7..470ceca 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -376,26 +376,6 @@ void cmFindPackageCommand::GenerateDocumentation() "The package configuration file may set <package>_FOUND to false " "to tell find_package that component requirements are not satisfied." "\n" - "A package configuration file may include() a <package>Targets.cmake " - "file, created by install(EXPORT) in the upstream source, to import " - "targets into the downstream consumer. " - "When a new version of the upstream adds INTERFACE properties not " - "present in a previous version it can change behavior for existing " - "downstreams. " - "In order to remain source compatible the upstream package configuration " - "file may set <package>_NO_INTERFACES to disable INTERFACE properties. " - "For example, code of the form:\n" - " if(<package>_FIND_VERSION VERSION_LESS <new-version>\n" - " AND NOT <package>_INTERFACES)\n" - " set(<package>_NO_INTERFACES 1)\n" - " endif()\n" - " include(\"${CMAKE_CURRENT_LIST_DIR}/<package>Targets.cmake\")\n" - "tells <package>Targets.cmake not to provide the INTERFACE properties " - "unless the downstream requests at least <new-version> or sets " - "<package>_INTERFACES to explicitly request them. " - "This allows consumers to decide when to enable the new interfaces when " - "upgrading." - "\n" "See the cmake_policy() command documentation for discussion of the " "NO_POLICY_SCOPE option." ; diff --git a/Source/cmGeneratorExpressionDAGChecker.cxx b/Source/cmGeneratorExpressionDAGChecker.cxx index 0ac1a48..57e7358 100644 --- a/Source/cmGeneratorExpressionDAGChecker.cxx +++ b/Source/cmGeneratorExpressionDAGChecker.cxx @@ -165,5 +165,6 @@ bool cmGeneratorExpressionDAGChecker::EvaluatingCompileDefinitions() { const char *prop = this->Property.c_str(); return (strcmp(prop, "COMPILE_DEFINITIONS") == 0 - || strcmp(prop, "INTERFACE_COMPILE_DEFINITIONS") == 0 ); + || strcmp(prop, "INTERFACE_COMPILE_DEFINITIONS") == 0 + || strncmp(prop, "COMPILE_DEFINITIONS_", 20) == 0); } diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx index 98e0ada..cd6a40b 100644 --- a/Source/cmGeneratorExpressionEvaluator.cxx +++ b/Source/cmGeneratorExpressionEvaluator.cxx @@ -451,15 +451,68 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode } const char *prop = target->GetProperty(propertyName.c_str()); - if (!prop) + + std::string linkedTargetsContent; + + if (dagCheckerParent) { - if (target->IsImported()) + if (dagCheckerParent->EvaluatingLinkLibraries()) { - return std::string(); + if(!prop) + { + return std::string(); + } } - if (dagCheckerParent && dagCheckerParent->EvaluatingLinkLibraries()) + else { - return std::string(); + assert(dagCheckerParent->EvaluatingIncludeDirectories() + || dagCheckerParent->EvaluatingCompileDefinitions()); + + if (propertyName == "INTERFACE_INCLUDE_DIRECTORIES" + || propertyName == "INTERFACE_COMPILE_DEFINITIONS") + { + const cmTarget::LinkInterface *iface = target->GetLinkInterface( + context->Config, + context->HeadTarget); + if(iface) + { + cmGeneratorExpression ge(context->Backtrace); + + std::string sep; + std::string depString; + for (std::vector<std::string>::const_iterator + it = iface->Libraries.begin(); + it != iface->Libraries.end(); ++it) + { + if (context->Makefile->FindTargetToUse(it->c_str())) + { + depString += + sep + "$<TARGET_PROPERTY:" + *it + "," + propertyName + ">"; + sep = ";"; + } + } + cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = + ge.Parse(depString); + linkedTargetsContent = cge->Evaluate(context->Makefile, + context->Config, + context->Quiet, + context->HeadTarget, + target, + &dagChecker); + if (cge->GetHadContextSensitiveCondition()) + { + context->HadContextSensitiveCondition = true; + } + } + } + } + } + + if (!prop) + { + if (target->IsImported()) + { + return linkedTargetsContent; } if (target->IsLinkInterfaceDependentBoolProperty(propertyName, context->Config)) @@ -480,7 +533,7 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode return propContent ? propContent : ""; } - return std::string(); + return linkedTargetsContent; } for (size_t i = 0; @@ -503,6 +556,10 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode { context->HadContextSensitiveCondition = true; } + if (!linkedTargetsContent.empty()) + { + result += (result.empty() ? "" : ";") + linkedTargetsContent; + } return result; } } @@ -656,106 +713,6 @@ static const struct InstallPrefixNode : public cmGeneratorExpressionNode } installPrefixNode; //---------------------------------------------------------------------------- -static const struct LinkedNode : public cmGeneratorExpressionNode -{ - LinkedNode() {} - - virtual bool GeneratesContent() const { return true; } - virtual int NumExpectedParameters() const { return 1; } - virtual bool RequiresLiteralInput() const { return true; } - - std::string Evaluate(const std::vector<std::string> ¶meters, - cmGeneratorExpressionContext *context, - const GeneratorExpressionContent *content, - cmGeneratorExpressionDAGChecker *dagChecker) const - { - if (dagChecker->EvaluatingIncludeDirectories()) - { - return this->GetInterfaceProperty(parameters.front(), - "INCLUDE_DIRECTORIES", - context, content, dagChecker); - } - if (dagChecker->EvaluatingCompileDefinitions()) - { - return this->GetInterfaceProperty(parameters.front(), - "COMPILE_DEFINITIONS", - context, content, dagChecker); - } - - reportError(context, content->GetOriginalExpression(), - "$<LINKED:...> may only be used in INCLUDE_DIRECTORIES and " - "COMPILE_DEFINITIONS properties."); - - return std::string(); - } - -private: - std::string GetInterfaceProperty(const std::string &item, - const std::string &prop, - cmGeneratorExpressionContext *context, - const GeneratorExpressionContent *content, - cmGeneratorExpressionDAGChecker *dagCheckerParent) const - { - cmTarget *target = context->CurrentTarget - ->GetMakefile()->FindTargetToUse(item.c_str()); - if (!target) - { - return std::string(); - } - if(target->GetType() >= cmTarget::UTILITY && - target->GetType() != cmTarget::UNKNOWN_LIBRARY) - { - ::reportError(context, content->GetOriginalExpression(), - "Target \"" + item - + "\" is not an executable or library."); - return std::string(); - } - std::string propertyName = "INTERFACE_" + prop; - const char *propContent = target->GetProperty(propertyName.c_str()); - if (!propContent) - { - return std::string(); - } - - cmGeneratorExpressionDAGChecker dagChecker(context->Backtrace, - target->GetName(), - propertyName, - content, - dagCheckerParent); - - switch (dagChecker.check()) - { - case cmGeneratorExpressionDAGChecker::SELF_REFERENCE: - dagChecker.reportError(context, content->GetOriginalExpression()); - return std::string(); - case cmGeneratorExpressionDAGChecker::CYCLIC_REFERENCE: - // No error. We just skip cyclic references. - return std::string(); - case cmGeneratorExpressionDAGChecker::ALREADY_SEEN: - // No error. We're not going to find anything new here. - return std::string(); - case cmGeneratorExpressionDAGChecker::DAG: - break; - } - - cmGeneratorExpression ge(context->Backtrace); - cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(propContent); - std::string result = cge->Evaluate(context->Makefile, - context->Config, - context->Quiet, - context->HeadTarget, - target, - &dagChecker); - if (cge->GetHadContextSensitiveCondition()) - { - context->HadContextSensitiveCondition = true; - } - return result; - } - -} linkedNode; - -//---------------------------------------------------------------------------- template<bool linker, bool soname> struct TargetFilesystemArtifactResultCreator { @@ -989,8 +946,6 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier) return &targetDefinedNode; else if (identifier == "INSTALL_PREFIX") return &installPrefixNode; - else if (identifier == "LINKED") - return &linkedNode; return 0; } diff --git a/Source/cmListFileCache.h b/Source/cmListFileCache.h index c057754..fec3d07 100644 --- a/Source/cmListFileCache.h +++ b/Source/cmListFileCache.h @@ -76,4 +76,13 @@ struct cmListFile std::vector<cmListFileFunction> Functions; }; +struct cmValueWithOrigin { + cmValueWithOrigin(const std::string &value, + const cmListFileBacktrace &bt) + : Value(value), Backtrace(bt) + {} + std::string Value; + cmListFileBacktrace Backtrace; +}; + #endif diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 299e564..25ccbc7 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1487,7 +1487,7 @@ void cmMakefile::InitializeFromParent() // Initialize definitions with the closure of the parent scope. this->Internal->VarStack.top() = parent->Internal->VarStack.top().Closure(); - const std::vector<IncludeDirectoriesEntry> parentIncludes = + const std::vector<cmValueWithOrigin> parentIncludes = parent->GetIncludeDirectoriesEntries(); this->IncludeDirectoriesEntries.insert(this->IncludeDirectoriesEntries.end(), parentIncludes.begin(), @@ -1636,13 +1636,13 @@ void cmMakefile::AddIncludeDirectories(const std::vector<std::string> &incs, sep = ";"; } - std::vector<IncludeDirectoriesEntry>::iterator position = + std::vector<cmValueWithOrigin>::iterator position = before ? this->IncludeDirectoriesEntries.begin() : this->IncludeDirectoriesEntries.end(); cmListFileBacktrace lfbt; this->GetBacktrace(lfbt); - IncludeDirectoriesEntry entry(incString, lfbt); + cmValueWithOrigin entry(incString, lfbt); this->IncludeDirectoriesEntries.insert(position, entry); // Property on each target: @@ -3461,7 +3461,7 @@ void cmMakefile::SetProperty(const char* prop, const char* value) cmListFileBacktrace lfbt; this->GetBacktrace(lfbt); this->IncludeDirectoriesEntries.push_back( - IncludeDirectoriesEntry(value, lfbt)); + cmValueWithOrigin(value, lfbt)); return; } @@ -3500,7 +3500,7 @@ void cmMakefile::AppendProperty(const char* prop, const char* value, cmListFileBacktrace lfbt; this->GetBacktrace(lfbt); this->IncludeDirectoriesEntries.push_back( - IncludeDirectoriesEntry(value, lfbt)); + cmValueWithOrigin(value, lfbt)); return; } if ( propname == "LINK_DIRECTORIES" ) @@ -3617,7 +3617,7 @@ const char *cmMakefile::GetProperty(const char* prop, else if (!strcmp("INCLUDE_DIRECTORIES",prop)) { std::string sep; - for (std::vector<IncludeDirectoriesEntry>::const_iterator + for (std::vector<cmValueWithOrigin>::const_iterator it = this->IncludeDirectoriesEntries.begin(), end = this->IncludeDirectoriesEntries.end(); it != end; ++it) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index c0020bf..74a731d 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -22,7 +22,6 @@ #include "cmNewLineStyle.h" #include "cmGeneratorTarget.h" #include "cmake.h" -#include "cmMakefileIncludeDirectoriesEntry.h" #if defined(CMAKE_BUILD_WITH_CMAKE) #include "cmSourceGroup.h" @@ -863,9 +862,7 @@ public: /** Set whether or not to report a CMP0000 violation. */ void SetCheckCMP0000(bool b) { this->CheckCMP0000 = b; } - typedef cmMakefileIncludeDirectoriesEntry IncludeDirectoriesEntry; - - std::vector<IncludeDirectoriesEntry> GetIncludeDirectoriesEntries() const + std::vector<cmValueWithOrigin> GetIncludeDirectoriesEntries() const { return this->IncludeDirectoriesEntries; } @@ -921,7 +918,7 @@ protected: std::vector<std::string> HeaderFileExtensions; std::string DefineFlags; - std::vector<IncludeDirectoriesEntry> IncludeDirectoriesEntries; + std::vector<cmValueWithOrigin> IncludeDirectoriesEntries; // Track the value of the computed DEFINITIONS property. void AddDefineFlag(const char*, std::string&); diff --git a/Source/cmMakefileIncludeDirectoriesEntry.h b/Source/cmMakefileIncludeDirectoriesEntry.h deleted file mode 100644 index f35642d..0000000 --- a/Source/cmMakefileIncludeDirectoriesEntry.h +++ /dev/null @@ -1,28 +0,0 @@ -/*============================================================================ - CMake - Cross Platform Makefile Generator - Copyright 2012 Stephen Kelly <steveire@gmail.com> - - Distributed under the OSI-approved BSD License (the "License"); - see accompanying file Copyright.txt for details. - - This software is distributed WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the License for more information. -============================================================================*/ - -#ifndef cmMakefileIncludeDirectoriesEntry_h -#define cmMakefileIncludeDirectoriesEntry_h - -#include <string> -#include "cmListFileCache.h" - -struct cmMakefileIncludeDirectoriesEntry { - cmMakefileIncludeDirectoriesEntry(const std::string &value, - const cmListFileBacktrace &bt) - : Value(value), Backtrace(bt) - {} - std::string Value; - cmListFileBacktrace Backtrace; -}; - -#endif diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index bf918d5..003f3d8 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -137,6 +137,7 @@ public: std::vector<std::string> CachedIncludes; }; std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries; + std::vector<cmValueWithOrigin> LinkInterfaceIncludeDirectoriesEntries; }; //---------------------------------------------------------------------------- @@ -1496,10 +1497,10 @@ void cmTarget::SetMakefile(cmMakefile* mf) // Initialize the INCLUDE_DIRECTORIES property based on the current value // of the same directory property: - const std::vector<cmMakefileIncludeDirectoriesEntry> parentIncludes = + const std::vector<cmValueWithOrigin> parentIncludes = this->Makefile->GetIncludeDirectoriesEntries(); - for (std::vector<cmMakefileIncludeDirectoriesEntry>::const_iterator it + for (std::vector<cmValueWithOrigin>::const_iterator it = parentIncludes.begin(); it != parentIncludes.end(); ++it) { this->InsertInclude(*it); @@ -2743,7 +2744,13 @@ void cmTarget::AppendBuildInterfaceIncludes() } //---------------------------------------------------------------------------- -void cmTarget::InsertInclude(const cmMakefileIncludeDirectoriesEntry &entry, +void cmTarget::AppendTllInclude(const cmValueWithOrigin &entry) +{ + this->Internal->LinkInterfaceIncludeDirectoriesEntries.push_back(entry); +} + +//---------------------------------------------------------------------------- +void cmTarget::InsertInclude(const cmValueWithOrigin &entry, bool before) { cmGeneratorExpression ge(entry.Backtrace); @@ -2757,43 +2764,18 @@ void cmTarget::InsertInclude(const cmMakefileIncludeDirectoriesEntry &entry, } //---------------------------------------------------------------------------- -std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config) +static void processIncludeDirectories(cmTarget *tgt, + const std::vector<cmTargetInternals::IncludeDirectoriesEntry*> &entries, + std::vector<std::string> &includes, + std::set<std::string> &uniqueIncludes, + cmGeneratorExpressionDAGChecker *dagChecker, + const char *config, bool debugIncludes) { - std::vector<std::string> includes; - std::set<std::string> uniqueIncludes; - cmListFileBacktrace lfbt; - - cmGeneratorExpressionDAGChecker dagChecker(lfbt, - this->GetName(), - "INCLUDE_DIRECTORIES", 0, 0); - - this->AppendBuildInterfaceIncludes(); - - std::vector<std::string> debugProperties; - const char *debugProp = - this->Makefile->GetDefinition("CMAKE_DEBUG_TARGET_PROPERTIES"); - if (debugProp) - { - cmSystemTools::ExpandListArgument(debugProp, debugProperties); - } - - bool debugIncludes = !this->DebugIncludesDone - && std::find(debugProperties.begin(), - debugProperties.end(), - "INCLUDE_DIRECTORIES") - != debugProperties.end(); - - if (this->Makefile->IsGeneratingBuildSystem()) - { - this->DebugIncludesDone = true; - } + cmMakefile *mf = tgt->GetMakefile(); for (std::vector<cmTargetInternals::IncludeDirectoriesEntry*>::const_iterator - it = this->Internal->IncludeDirectoriesEntries.begin(), - end = this->Internal->IncludeDirectoriesEntries.end(); - it != end; ++it) + it = entries.begin(), end = entries.end(); it != end; ++it) { - bool testIsOff = true; bool cacheIncludes = false; std::vector<std::string> entryIncludes = (*it)->CachedIncludes; @@ -2803,13 +2785,13 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config) } else { - cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(this->Makefile, + cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(mf, config, false, - this, - &dagChecker), + tgt, + dagChecker), entryIncludes); - if (this->Makefile->IsGeneratingBuildSystem() + if (mf->IsGeneratingBuildSystem() && !(*it)->ge->GetHadContextSensitiveCondition()) { cacheIncludes = true; @@ -2840,11 +2822,90 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config) } if (!usedIncludes.empty()) { - this->Makefile->GetCMakeInstance()->IssueMessage(cmake::LOG, - "Used includes for target " + this->Name + ":\n" + mf->GetCMakeInstance()->IssueMessage(cmake::LOG, + std::string("Used includes for target ") + + tgt->GetName() + ":\n" + usedIncludes, (*it)->ge->GetBacktrace()); } } +} + +//---------------------------------------------------------------------------- +std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config) +{ + std::vector<std::string> includes; + std::set<std::string> uniqueIncludes; + cmListFileBacktrace lfbt; + + cmGeneratorExpressionDAGChecker dagChecker(lfbt, + this->GetName(), + "INCLUDE_DIRECTORIES", 0, 0); + + this->AppendBuildInterfaceIncludes(); + + std::vector<std::string> debugProperties; + const char *debugProp = + this->Makefile->GetDefinition("CMAKE_DEBUG_TARGET_PROPERTIES"); + if (debugProp) + { + cmSystemTools::ExpandListArgument(debugProp, debugProperties); + } + + bool debugIncludes = !this->DebugIncludesDone + && std::find(debugProperties.begin(), + debugProperties.end(), + "INCLUDE_DIRECTORIES") + != debugProperties.end(); + + if (this->Makefile->IsGeneratingBuildSystem()) + { + this->DebugIncludesDone = true; + } + + processIncludeDirectories(this, + this->Internal->IncludeDirectoriesEntries, + includes, + uniqueIncludes, + &dagChecker, + config, + debugIncludes); + + std::vector<cmTargetInternals::IncludeDirectoriesEntry*> + linkInterfaceIncludeDirectoriesEntries; + + for (std::vector<cmValueWithOrigin>::const_iterator + it = this->Internal->LinkInterfaceIncludeDirectoriesEntries.begin(), + end = this->Internal->LinkInterfaceIncludeDirectoriesEntries.end(); + it != end; ++it) + { + { + cmGeneratorExpression ge(lfbt); + cmsys::auto_ptr<cmCompiledGeneratorExpression> 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<cmCompiledGeneratorExpression> cge = ge.Parse( + "$<TARGET_PROPERTY:" + it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>"); + + linkInterfaceIncludeDirectoriesEntries.push_back( + new cmTargetInternals::IncludeDirectoriesEntry(cge)); + } + + processIncludeDirectories(this, + linkInterfaceIncludeDirectoriesEntries, + includes, + uniqueIncludes, + &dagChecker, + config, + debugIncludes); + + deleteAndClear(linkInterfaceIncludeDirectoriesEntries); + return includes; } @@ -2858,23 +2919,57 @@ std::string cmTarget::GetCompileDefinitions(const char *config) } const char *prop = this->GetProperty(defPropName.c_str()); + cmListFileBacktrace lfbt; + cmGeneratorExpressionDAGChecker dagChecker(lfbt, + this->GetName(), + defPropName, 0, 0); - if (!prop) + std::string result; + if (prop) { - return ""; + cmGeneratorExpression ge(lfbt); + + result = ge.Parse(prop)->Evaluate(this->Makefile, + config, + false, + this, + &dagChecker); } - cmListFileBacktrace lfbt; - cmGeneratorExpression ge(lfbt); + std::vector<std::string> libs; + this->GetDirectLinkLibraries(config, libs, this); - cmGeneratorExpressionDAGChecker dagChecker(lfbt, - this->GetName(), - defPropName, 0, 0); - return ge.Parse(prop)->Evaluate(this->Makefile, - config, - false, - this, - &dagChecker); + if (libs.empty()) + { + return result; + } + + std::string sep; + std::string depString; + for (std::vector<std::string>::const_iterator it = libs.begin(); + it != libs.end(); ++it) + { + if (this->Makefile->FindTargetToUse(it->c_str())) + { + depString += sep + "$<TARGET_PROPERTY:" + + *it + ",INTERFACE_COMPILE_DEFINITIONS>"; + sep = ";"; + } + } + + cmGeneratorExpression ge2(lfbt); + cmsys::auto_ptr<cmCompiledGeneratorExpression> cge2 = ge2.Parse(depString); + std::string depResult = cge2->Evaluate(this->Makefile, + config, + false, + this, + &dagChecker); + if (!depResult.empty()) + { + result += (result.empty() ? "" : ";") + depResult; + } + + return result; } //---------------------------------------------------------------------------- diff --git a/Source/cmTarget.h b/Source/cmTarget.h index fb1496f..e659baf 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -15,7 +15,7 @@ #include "cmCustomCommand.h" #include "cmPropertyMap.h" #include "cmPolicies.h" -#include "cmMakefileIncludeDirectoriesEntry.h" +#include "cmListFileCache.h" #include <cmsys/auto_ptr.hxx> @@ -493,8 +493,9 @@ public: std::string GetFrameworkDirectory(const char* config = 0); std::vector<std::string> GetIncludeDirectories(const char *config); - void InsertInclude(const cmMakefileIncludeDirectoriesEntry &entry, + void InsertInclude(const cmValueWithOrigin &entry, bool before = false); + void AppendTllInclude(const cmValueWithOrigin &entry); void AppendBuildInterfaceIncludes(); diff --git a/Source/cmTargetCompileDefinitionsCommand.cxx b/Source/cmTargetCompileDefinitionsCommand.cxx index 7645833..ba0ad59 100644 --- a/Source/cmTargetCompileDefinitionsCommand.cxx +++ b/Source/cmTargetCompileDefinitionsCommand.cxx @@ -11,8 +11,6 @@ ============================================================================*/ #include "cmTargetCompileDefinitionsCommand.h" -#include "cmMakefileIncludeDirectoriesEntry.h" - bool cmTargetCompileDefinitionsCommand ::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) { diff --git a/Source/cmTargetIncludeDirectoriesCommand.cxx b/Source/cmTargetIncludeDirectoriesCommand.cxx index 808806a..12d0a51 100644 --- a/Source/cmTargetIncludeDirectoriesCommand.cxx +++ b/Source/cmTargetIncludeDirectoriesCommand.cxx @@ -11,8 +11,6 @@ ============================================================================*/ #include "cmTargetIncludeDirectoriesCommand.h" -#include "cmMakefileIncludeDirectoriesEntry.h" - //---------------------------------------------------------------------------- bool cmTargetIncludeDirectoriesCommand ::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) @@ -71,6 +69,6 @@ void cmTargetIncludeDirectoriesCommand { cmListFileBacktrace lfbt; this->Makefile->GetBacktrace(lfbt); - cmMakefileIncludeDirectoriesEntry entry(this->Join(content), lfbt); + cmValueWithOrigin entry(this->Join(content), lfbt); tgt->InsertInclude(entry, prepend); } diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx index 9dd0e5b..3f652c9 100644 --- a/Source/cmTargetLinkLibrariesCommand.cxx +++ b/Source/cmTargetLinkLibrariesCommand.cxx @@ -252,45 +252,21 @@ cmTargetLinkLibrariesCommand } //---------------------------------------------------------------------------- -static std::string compileProperty(cmTarget *tgt, const std::string &lib, - bool isGenex, - const std::string &property, - cmTarget::LinkLibraryType llt) -{ - std::string value = !isGenex ? "$<LINKED:" + lib + ">" - : "$<$<TARGET_DEFINED:" + lib + ">:" + - "$<TARGET_PROPERTY:" + lib + - ",INTERFACE_" + property + ">" - ">"; - - return tgt->GetDebugGeneratorExpressions(value, llt); -} - -//---------------------------------------------------------------------------- void cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib, cmTarget::LinkLibraryType llt) { - const bool isGenex = cmGeneratorExpression::Find(lib) != std::string::npos; - - const bool potentialTargetName - = cmGeneratorExpression::IsValidTargetName(lib); - - if (potentialTargetName || isGenex) - { - this->Target->AppendProperty("INCLUDE_DIRECTORIES", - compileProperty(this->Target, lib, - isGenex, - "INCLUDE_DIRECTORIES", llt).c_str()); - this->Target->AppendProperty("COMPILE_DEFINITIONS", - compileProperty(this->Target, lib, - isGenex, - "COMPILE_DEFINITIONS", llt).c_str()); - } - // Handle normal case first. if(this->CurrentProcessingState != ProcessingLinkInterface) { + { + cmListFileBacktrace lfbt; + this->Makefile->GetBacktrace(lfbt); + cmValueWithOrigin entry(this->Target->GetDebugGeneratorExpressions(lib, + llt), + lfbt); + this->Target->AppendTllInclude(entry); + } this->Makefile ->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt); if (this->CurrentProcessingState != ProcessingPublicInterface) @@ -300,18 +276,6 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib, } } - if (potentialTargetName || isGenex) - { - this->Target->AppendProperty("INTERFACE_COMPILE_DEFINITIONS", - compileProperty(this->Target, lib, - isGenex, - "COMPILE_DEFINITIONS", llt).c_str()); - this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES", - compileProperty(this->Target, lib, - isGenex, - "INCLUDE_DIRECTORIES", llt).c_str()); - } - // Get the list of configurations considered to be DEBUG. std::vector<std::string> const& debugConfigs = this->Makefile->GetCMakeInstance()->GetDebugConfigs(); |