summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/cmDocumentGeneratorExpressions.h8
-rw-r--r--Source/cmExportFileGenerator.cxx73
-rw-r--r--Source/cmExportFileGenerator.h4
-rw-r--r--Source/cmFindPackageCommand.cxx20
-rw-r--r--Source/cmGeneratorExpressionDAGChecker.cxx3
-rw-r--r--Source/cmGeneratorExpressionEvaluator.cxx171
-rw-r--r--Source/cmListFileCache.h9
-rw-r--r--Source/cmMakefile.cxx12
-rw-r--r--Source/cmMakefile.h7
-rw-r--r--Source/cmMakefileIncludeDirectoriesEntry.h28
-rw-r--r--Source/cmTarget.cxx203
-rw-r--r--Source/cmTarget.h5
-rw-r--r--Source/cmTargetCompileDefinitionsCommand.cxx2
-rw-r--r--Source/cmTargetIncludeDirectoriesCommand.cxx4
-rw-r--r--Source/cmTargetLinkLibrariesCommand.cxx52
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> &parameters,
- 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();