[Cmake-commits] CMake branch, next, updated. v2.8.10.2-1163-g48ad17b
Stephen Kelly
steveire at gmail.com
Fri Nov 30 11:07:29 EST 2012
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via 48ad17b8523a4a4355c05baaa24e0bcdcabb51b2 (commit)
via c33e002d1789c2ca0f8b9f81077b41943c359d2b (commit)
via a5cf51cc6bacce103aedf220eb3d3b19704ce4c4 (commit)
from 562c100569f79374040aa9a04ad998b25aae20e9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=48ad17b8523a4a4355c05baaa24e0bcdcabb51b2
commit 48ad17b8523a4a4355c05baaa24e0bcdcabb51b2
Merge: 562c100 c33e002
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Nov 30 11:07:27 2012 -0500
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Nov 30 11:07:27 2012 -0500
Merge topic 'add-INTERFACE_LINK_LIBRARIES-property' into next
c33e002 Genex: Add INTERFACE_LINK_LIBRARIES property
a5cf51c Add expressions for separating build-location from install-location.
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c33e002d1789c2ca0f8b9f81077b41943c359d2b
commit c33e002d1789c2ca0f8b9f81077b41943c359d2b
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Thu Nov 1 00:32:10 2012 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Fri Nov 30 17:02:54 2012 +0100
Genex: Add INTERFACE_LINK_LIBRARIES property
This new property is a replacement for
the (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? properties as
it can contain generator expressions. It is also part of the generated
IMPORTED targets generated by the export() and install(EXPORT) commands.
User code may already populate
the (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? properties, so
policy CMP0019 is added to handle that.
If the policy is NEW, the old properties are ignored and
the INTERFACE_LINK_LIBRARIES property is used.
Otherwise if the policy is OLD the old properties are used and the
new INTERFACE_LINK_LIBRARIES is ignored.
The policy emits a warning if the old-style property and new-style
property differ in their content.
The policy also affects the IMPORTED targets generated by export()
and install(EXPORT). If the policy is NEW, that means that the user
has bumped their cmake requirement to 2.8.11. As we'll therefore be
generating INTERFACE_LINK_LIBRARIES properties in the IMPORTED
targets, we need to ensure that consumers can use the new property,
so 2.8.11 will be required for the consumers too.
diff --git a/Source/cmDocumentGeneratorExpressions.h b/Source/cmDocumentGeneratorExpressions.h
index 445fd0e..2899e05 100644
--- a/Source/cmDocumentGeneratorExpressions.h
+++ b/Source/cmDocumentGeneratorExpressions.h
@@ -26,6 +26,15 @@
"strings which contain a '>' for example.\n" \
" $<COMMA> = A literal ','. Used to compare " \
"strings which contain a ',' for example.\n" \
+ " $<INSTALL_INTERFACE:...> = content of \"...\" when the property " \
+ "is exported using install(EXPORT), and empty otherwise.\n" \
+ " $<BUILD_INTERFACE:...> = content of \"...\" when the property " \
+ "is exported using export(), or when the target is used by another " \
+ "target in the same buildsystem. Expands to the empty string " \
+ "otherwise.\n" \
+ " $<EXPORT_NAMESPACE> = The namespace used in an invokation " \
+ "of export() or install(EXPORT). Expands to empty in other " \
+ "contexts.\n" \
" $<TARGET_FILE:tgt> = main file (.exe, .so.1.2, .a)\n" \
" $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)\n" \
" $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)\n" \
diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx
index 55d70f8..2502b92 100644
--- a/Source/cmDocumentVariables.cxx
+++ b/Source/cmDocumentVariables.cxx
@@ -1397,6 +1397,14 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
false,
"Variables that Control the Build");
cm->DefineProperty
+ ("CMAKE_INTERFACE_LINK_LIBRARIES", cmProperty::VARIABLE,
+ "Default value for INTERFACE_LINK_LIBRARIES of targets.",
+ "This variable is used to initialize the "
+ "INTERFACE_LINK_LIBRARIES property on all the targets. "
+ "See that target property for additional information.",
+ false,
+ "Variables that Control the Build");
+ cm->DefineProperty
("CMAKE_WIN32_EXECUTABLE", cmProperty::VARIABLE,
"Default value for WIN32_EXECUTABLE of targets.",
"This variable is used to initialize the "
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index fb3f39f..a86f8c4 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -12,6 +12,7 @@
#include "cmExportBuildFileGenerator.h"
#include "cmExportCommand.h"
+#include "cmGeneratorExpression.h"
//----------------------------------------------------------------------------
cmExportBuildFileGenerator::cmExportBuildFileGenerator()
@@ -31,6 +32,17 @@ bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
if(this->ExportedTargets.insert(te).second)
{
this->GenerateImportTargetCode(os, te);
+
+ ImportPropertyMap properties;
+
+ if ((*tei)->GetPolicyStatusCMP0019() == cmPolicies::NEW)
+ {
+ this->PopulateInterfaceProperty("INTERFACE_LINK_LIBRARIES", te,
+ cmGeneratorExpression::BuildInterface,
+ properties);
+ }
+
+ this->GenerateInterfaceProperties(te, os, properties);
}
else
{
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 8dffae4..a67c3ee 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -125,6 +125,50 @@ void cmExportFileGenerator::GenerateImportConfig(std::ostream& os,
}
//----------------------------------------------------------------------------
+void cmExportFileGenerator::PopulateInterfaceProperty(const char *propName,
+ cmTarget *target,
+ cmGeneratorExpression::PreprocessContext preprocessRule,
+ ImportPropertyMap &properties)
+{
+ const char *input = target->GetProperty(propName);
+ if (input)
+ {
+ if (!*input)
+ {
+ // Set to empty
+ properties[propName] = "";
+ return;
+ }
+ std::string prepro = cmGeneratorExpression::Preprocess(input,
+ preprocessRule,
+ this->Namespace.c_str());
+ if (!prepro.empty())
+ {
+ properties[propName] = prepro;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+void cmExportFileGenerator::GenerateInterfaceProperties(cmTarget *target,
+ std::ostream& os,
+ const ImportPropertyMap &properties)
+{
+ if (!properties.empty())
+ {
+ std::string targetName = this->Namespace;
+ targetName += target->GetName();
+ 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 << ")\n\n";
+ }
+}
+
+//----------------------------------------------------------------------------
void
cmExportFileGenerator
::SetImportDetailProperties(const char* config, std::string const& suffix,
diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h
index 70bc65d..3aee1b8 100644
--- a/Source/cmExportFileGenerator.h
+++ b/Source/cmExportFileGenerator.h
@@ -13,6 +13,7 @@
#define cmExportFileGenerator_h
#include "cmCommand.h"
+#include "cmGeneratorExpression.h"
/** \class cmExportFileGenerator
* \brief Generate a file exporting targets from a build or install tree.
@@ -91,6 +92,12 @@ protected:
cmMakefile* mf,
cmTarget* depender,
cmTarget* dependee) = 0;
+ void PopulateInterfaceProperty(const char *,
+ cmTarget *target,
+ cmGeneratorExpression::PreprocessContext,
+ ImportPropertyMap &properties);
+ void GenerateInterfaceProperties(cmTarget *target, std::ostream& os,
+ const ImportPropertyMap &properties);
// The namespace in which the exports are placed in the generated file.
std::string Namespace;
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 7841731..4fef08e 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -19,6 +19,7 @@
#include "cmInstallExportGenerator.h"
#include "cmInstallTargetGenerator.h"
#include "cmTargetExport.h"
+#include "cmGeneratorExpression.h"
//----------------------------------------------------------------------------
cmExportInstallFileGenerator
@@ -48,6 +49,18 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
if(this->ExportedTargets.insert(te->Target).second)
{
this->GenerateImportTargetCode(os, te->Target);
+
+ ImportPropertyMap properties;
+
+ if ((*tei)->Target->GetPolicyStatusCMP0019() == cmPolicies::NEW)
+ {
+ this->PopulateInterfaceProperty("INTERFACE_LINK_LIBRARIES",
+ te->Target,
+ cmGeneratorExpression::InstallInterface,
+ properties);
+ }
+
+ this->GenerateInterfaceProperties(te->Target, os, properties);
}
else
{
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx
index 6aef502..d9bd803 100644
--- a/Source/cmPolicies.cxx
+++ b/Source/cmPolicies.cxx
@@ -491,6 +491,30 @@ cmPolicies::cmPolicies()
"CMAKE_SHARED_LIBRARY_<Lang>_FLAGS whether it is modified or not and "
"honor the POSITION_INDEPENDENT_CODE target property.",
2,8,9,0, cmPolicies::WARN);
+
+ this->DefinePolicy(
+ CMP0019, "CMP0019",
+ "Use INTERFACE_LINK_LIBRARIES instead of "
+ "LINK_INTERFACE_LIBRARIES_<CONFIG>.",
+ "CMake 2.8.10 used properties matching "
+ "(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? "
+ "to determine the link interface. CMake 2.8.11 and higher "
+ "prefer instead to use the INTERFACE_LINK_LIBRARIES target property to "
+ "determine the link interface, while ignoring properties matching"
+ "(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? completely. The new "
+ "INTERFACE_LINK_LIBRARIES target property can use generator expressions "
+ "to specify config-specific link libraries."
+ "\n"
+ "The OLD behavior for this policy is to ignore the "
+ "INTERFACE_LINK_LIBRARIES property for all targets and use the "
+ "value of the appropriate property matching "
+ "(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? instead."
+ "\n"
+ "The NEW behavior for this policy is to ignore "
+ "the value of the property matching "
+ "(IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? and use "
+ "INTERFACE_LINK_LIBRARIES instead.",
+ 2,8,11,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 6932565..b6b8e39 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -68,6 +68,7 @@ public:
CMP0018, ///< Ignore language flags for shared libs, and adhere to
/// POSITION_INDEPENDENT_CODE property and *_COMPILE_OPTIONS_PI{E,C}
/// instead.
+ CMP0019, ///< Use new-style INTERFACE_LINK_LIBRARIES
/** \brief Always the last entry.
*
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index be20464..50f74b9 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -21,6 +21,7 @@
#include "cmDocumentLocationUndefined.h"
#include "cmListFileCache.h"
#include "cmGeneratorExpression.h"
+#include "cmGeneratorExpressionDAGChecker.h"
#include <cmsys/RegularExpression.hxx>
#include <map>
#include <set>
@@ -127,6 +128,7 @@ cmTarget::cmTarget()
this->PolicyStatusCMP0003 = cmPolicies::WARN;
this->PolicyStatusCMP0004 = cmPolicies::WARN;
this->PolicyStatusCMP0008 = cmPolicies::WARN;
+ this->PolicyStatusCMP0019 = cmPolicies::WARN;
this->LinkLibrariesAnalyzed = false;
this->HaveInstallRule = false;
this->DLLPlatform = false;
@@ -371,7 +373,7 @@ void cmTarget::DefineProperties(cmake *cm)
"imported library. "
"The list "
"should be disjoint from the list of interface libraries in the "
- "IMPORTED_LINK_INTERFACE_LIBRARIES property. On platforms requiring "
+ "INTERFACE_LINK_LIBRARIES property. On platforms requiring "
"dependent shared libraries to be found at link time CMake uses this "
"list to add appropriate files or paths to the link command line. "
"Ignored for non-imported targets.");
@@ -392,7 +394,9 @@ void cmTarget::DefineProperties(cmake *cm)
"The libraries will be included on the link line for the target. "
"Unlike the LINK_INTERFACE_LIBRARIES property, this property applies "
"to all imported target types, including STATIC libraries. "
- "This property is ignored for non-imported targets.");
+ "This property is ignored for non-imported targets.\n"
+ "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead."
+ );
cm->DefineProperty
("IMPORTED_LINK_INTERFACE_LIBRARIES_<CONFIG>", cmProperty::TARGET,
@@ -400,7 +404,8 @@ void cmTarget::DefineProperties(cmake *cm)
"Configuration names correspond to those provided by the project "
"from which the target is imported. "
"If set, this property completely overrides the generic property "
- "for the named configuration.");
+ "for the named configuration."
+ "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead.");
cm->DefineProperty
("IMPORTED_LINK_INTERFACE_LANGUAGES", cmProperty::TARGET,
@@ -700,7 +705,8 @@ void cmTarget::DefineProperties(cmake *cm)
"This property is initialized by the value of the variable "
"CMAKE_LINK_INTERFACE_LIBRARIES if it is set when a target is "
"created. "
- "This property is ignored for STATIC libraries.");
+ "This property is ignored for STATIC libraries."
+ "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead.");
cm->DefineProperty
("LINK_INTERFACE_LIBRARIES_<CONFIG>", cmProperty::TARGET,
@@ -708,7 +714,29 @@ void cmTarget::DefineProperties(cmake *cm)
"This is the configuration-specific version of "
"LINK_INTERFACE_LIBRARIES. "
"If set, this property completely overrides the generic property "
- "for the named configuration.");
+ "for the named configuration."
+ "This property is deprecated. Use INTERFACE_LINK_LIBRARIES instead.");
+
+ cm->DefineProperty
+ ("INTERFACE_LINK_LIBRARIES", cmProperty::TARGET,
+ "List public interface libraries for a shared library or executable.",
+ "By default linking to a shared library target transitively "
+ "links to targets with which the library itself was linked. "
+ "For an executable with exports (see the ENABLE_EXPORTS property) "
+ "no default transitive link dependencies are used. "
+ "This property replaces the default transitive link dependencies with "
+ "an explicit list. "
+ "When the target is linked into another target the libraries "
+ "listed (and recursively their link interface libraries) will be "
+ "provided to the other target also. "
+ "If the list is empty then no transitive link dependencies will be "
+ "incorporated when this target is linked into another target even if "
+ "the default set is non-empty. "
+ "This property is initialized by the value of the variable "
+ "CMAKE_INTERFACE_LINK_LIBRARIES if it is set when a target is "
+ "created. "
+ "This property is ignored for STATIC libraries."
+ CM_DOCUMENT_COMMAND_GENERATOR_EXPRESSIONS);
cm->DefineProperty
("LINK_INTERFACE_MULTIPLICITY", cmProperty::TARGET,
@@ -1348,6 +1376,7 @@ void cmTarget::SetMakefile(cmMakefile* mf)
this->SetPropertyDefault("AUTOMOC_MOC_OPTIONS", 0);
this->SetPropertyDefault("LINK_DEPENDS_NO_SHARED", 0);
this->SetPropertyDefault("LINK_INTERFACE_LIBRARIES", 0);
+ this->SetPropertyDefault("INTERFACE_LINK_LIBRARIES", 0);
this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
this->SetPropertyDefault("MACOSX_BUNDLE", 0);
@@ -1409,6 +1438,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
this->Makefile->GetPolicyStatus(cmPolicies::CMP0004);
this->PolicyStatusCMP0008 =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0008);
+ this->PolicyStatusCMP0019 =
+ this->Makefile->GetPolicyStatus(cmPolicies::CMP0019);
}
//----------------------------------------------------------------------------
@@ -4238,6 +4269,28 @@ cmTarget::GetImportInfo(const char* config)
return &i->second;
}
+
+bool handleCMP0019(const std::vector<std::string> &newLinkLibraries,
+ const std::vector<std::string> &oldLinkLibraries)
+{
+ if (newLinkLibraries.size() != oldLinkLibraries.size())
+ {
+ return false;
+ }
+ for(std::vector<std::string>::const_iterator
+ oll = oldLinkLibraries.begin(), nll = newLinkLibraries.begin();
+ oll != oldLinkLibraries.end() && nll != newLinkLibraries.end();
+ ++oll, ++nll)
+ {
+ if (*oll != *nll)
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+
//----------------------------------------------------------------------------
void cmTarget::ComputeImportInfo(std::string const& desired_config,
ImportInfo& info)
@@ -4441,21 +4494,49 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config,
// Get the link interface.
{
- std::string linkProp = "IMPORTED_LINK_INTERFACE_LIBRARIES";
- linkProp += suffix;
- if(const char* config_libs = this->GetProperty(linkProp.c_str()))
- {
- cmSystemTools::ExpandListArgument(config_libs,
- info.LinkInterface.Libraries);
+ std::vector<std::string> usedLinkLibraries;
+
+ const char* newStyleLibsProp = this->GetProperty(
+ "INTERFACE_LINK_LIBRARIES");
+ if(newStyleLibsProp)
+ {
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+
+ cmGeneratorExpressionDAGChecker dagChecker(lfbt,
+ this->GetName(),
+ "INTERFACE_LINK_LIBRARIES", 0, 0);
+ cmSystemTools::ExpandListArgument(ge.Parse(newStyleLibsProp)
+ .Evaluate(this->Makefile,
+ desired_config.c_str(),
+ false,
+ this,
+ &dagChecker),
+ usedLinkLibraries);
}
- else if(const char* libs =
- this->GetProperty("IMPORTED_LINK_INTERFACE_LIBRARIES"))
+ else
{
- cmSystemTools::ExpandListArgument(libs,
- info.LinkInterface.Libraries);
+ std::string linkProp = "IMPORTED_LINK_INTERFACE_LIBRARIES";
+ const char *oldProp = this->GetProperty((linkProp + suffix).c_str());
+ if(oldProp)
+ {
+ linkProp += suffix;
+ cmSystemTools::ExpandListArgument(oldProp, usedLinkLibraries);
+ }
+ else
+ {
+ oldProp = this->GetProperty("IMPORTED_LINK_INTERFACE_LIBRARIES");
+ if(oldProp)
+ {
+ cmSystemTools::ExpandListArgument(oldProp, usedLinkLibraries);
+ }
+ }
}
+ info.LinkInterface.Libraries.insert(info.LinkInterface.Libraries.end(),
+ usedLinkLibraries.begin(), usedLinkLibraries.end());
}
+
// Get the link dependencies.
{
std::string linkProp = "IMPORTED_LINK_DEPENDENT_LIBRARIES";
@@ -4562,21 +4643,82 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface)
// An explicit list of interface libraries may be set for shared
// libraries and executables that export symbols.
- const char* explicitLibraries = 0;
+ bool explicitLibraries = false;
+ std::vector<std::string> usedLinkLibraries;
if(this->GetType() == cmTarget::SHARED_LIBRARY ||
this->IsExecutableWithExports())
{
+ const char *newLibrariesProp =
+ this->GetProperty("INTERFACE_LINK_LIBRARIES");
+
+ std::vector<std::string> newInterfaceLibs;
+ std::vector<std::string> oldInterfaceLibs;
+
+ if(newLibrariesProp)
+ {
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+
+ cmGeneratorExpressionDAGChecker dagChecker(lfbt,
+ this->GetName(),
+ "INTERFACE_LINK_LIBRARIES", 0, 0);
+
+ cmSystemTools::ExpandListArgument(ge.Parse(newLibrariesProp).Evaluate(
+ this->Makefile,
+ config,
+ false,
+ this,
+ &dagChecker), newInterfaceLibs);
+ }
// Lookup the per-configuration property.
std::string propName = "LINK_INTERFACE_LIBRARIES";
propName += suffix;
- explicitLibraries = this->GetProperty(propName.c_str());
+ const char *oldLibrariesProp = this->GetProperty(propName.c_str());
// If not set, try the generic property.
- if(!explicitLibraries)
+ if(!oldLibrariesProp)
+ {
+ oldLibrariesProp = this->GetProperty("LINK_INTERFACE_LIBRARIES");
+ }
+ if(oldLibrariesProp)
+ {
+ cmSystemTools::ExpandListArgument(oldLibrariesProp, oldInterfaceLibs);
+ }
+
+ {
+ switch (this->PolicyStatusCMP0019)
{
- explicitLibraries = this->GetProperty("LINK_INTERFACE_LIBRARIES");
+ case cmPolicies::WARN:
+ {
+ if (newLibrariesProp && oldLibrariesProp
+ && !handleCMP0019(newInterfaceLibs, oldInterfaceLibs))
+ {
+ cmOStringStream e;
+ e << "The INTERFACE_LINK_LIBRARIES and LINK_INTERFACE_LIBRARIES are "
+ "not the same for target \"" << this->GetName() << "\".\n"
+ "NEW content is \""
+ << (newLibrariesProp ? newLibrariesProp : "(unset)") << "\"\n"
+ "OLD content is \""
+ << (oldLibrariesProp ? oldLibrariesProp : "(unset)") << "\"\n"
+ << this->Makefile->GetPolicies()->GetPolicyWarning(
+ cmPolicies::CMP0019);
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, e.str());
+ }
+ // fall through to OLD behaviour
+ }
+ case cmPolicies::OLD:
+ explicitLibraries = oldLibrariesProp ? true : false;
+ usedLinkLibraries = oldInterfaceLibs;
+ break;
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::NEW:
+ default:
+ usedLinkLibraries = newInterfaceLibs;
+ explicitLibraries = newLibrariesProp ? true : false;
}
}
+ }
// There is no implicit link interface for executables or modules
// so if none was explicitly set then there is no link interface.
@@ -4592,7 +4734,8 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface)
if(explicitLibraries)
{
// The interface libraries have been explicitly set.
- cmSystemTools::ExpandListArgument(explicitLibraries, iface.Libraries);
+ iface.Libraries.insert(iface.Libraries.end(),
+ usedLinkLibraries.begin(), usedLinkLibraries.end());
if(this->GetType() == cmTarget::SHARED_LIBRARY)
{
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 9efd638..7c55933 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -99,6 +99,10 @@ public:
cmPolicies::PolicyStatus GetPolicyStatusCMP0008() const
{ return this->PolicyStatusCMP0008; }
+ /** Get the status of policy CMP0019 when the target was created. */
+ cmPolicies::PolicyStatus GetPolicyStatusCMP0019() const
+ { return this->PolicyStatusCMP0019; }
+
/**
* Get the list of the custom commands for this target
*/
@@ -618,6 +622,7 @@ private:
cmPolicies::PolicyStatus PolicyStatusCMP0003;
cmPolicies::PolicyStatus PolicyStatusCMP0004;
cmPolicies::PolicyStatus PolicyStatusCMP0008;
+ cmPolicies::PolicyStatus PolicyStatusCMP0019;
// Internal representation details.
friend class cmTargetInternals;
diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx
index f42b0f6..d7a1443 100644
--- a/Source/cmTargetLinkLibrariesCommand.cxx
+++ b/Source/cmTargetLinkLibrariesCommand.cxx
@@ -232,7 +232,11 @@ bool cmTargetLinkLibrariesCommand
{
this->Target->SetProperty("LINK_INTERFACE_LIBRARIES", "");
}
-
+ if(this->CurrentProcessingState != ProcessingLinkLibraries &&
+ !this->Target->GetProperty("INTERFACE_LINK_LIBRARIES"))
+ {
+ this->Target->SetProperty("INTERFACE_LINK_LIBRARIES", "");
+ }
return true;
}
@@ -250,6 +254,25 @@ cmTargetLinkLibrariesCommand
}
//----------------------------------------------------------------------------
+static std::string generatorIface(const std::string &value,
+ cmTarget::LinkLibraryType llt)
+{
+ if (llt == cmTarget::DEBUG)
+ {
+ return "$<$<CONFIG:Debug>:"
+ + value
+ + ">";
+ }
+ else if (llt == cmTarget::OPTIMIZED)
+ {
+ return "$<$<NOT:$<CONFIG:Debug>>:"
+ + value
+ + ">";
+ }
+ return value;
+}
+
+//----------------------------------------------------------------------------
void
cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
cmTarget::LinkLibraryType llt)
@@ -266,6 +289,9 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
}
}
+ this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES",
+ generatorIface(lib, llt).c_str());
+
// Get the list of configurations considered to be DEBUG.
std::vector<std::string> const& debugConfigs =
this->Makefile->GetCMakeInstance()->GetDebugConfigs();
diff --git a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
index 1faa888..95cfd15 100644
--- a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
@@ -56,3 +56,21 @@ assert_property(targetA LINK_INTERFACE_LIBRARIES "")
target_link_libraries(targetA depB depC)
assert_property(targetA LINK_INTERFACE_LIBRARIES "")
+
+# cmake_policy(PUSH)
+
+cmake_policy(SET CMP0019 NEW)
+
+add_library(depD SHARED depD.cpp)
+generate_export_header(depD)
+set_property(TARGET depD APPEND PROPERTY INTERFACE_LINK_LIBRARIES $<1:depA>)
+
+add_library(depE SHARED depE.cpp)
+generate_export_header(depE)
+target_link_libraries(depE LINK_PRIVATE depB)
+target_link_libraries(depE LINK_INTERFACE_LIBRARIES $<1:depB>)
+
+add_executable(targetB targetB.cpp)
+target_link_libraries(targetB depD depE)
+
+# cmake_policy(POP)
diff --git a/Tests/CMakeCommands/target_link_libraries/depD.cpp b/Tests/CMakeCommands/target_link_libraries/depD.cpp
new file mode 100644
index 0000000..b02c76c
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depD.cpp
@@ -0,0 +1,13 @@
+
+#include "depD.h"
+
+int DepD::foo()
+{
+ return 0;
+}
+
+DepA DepD::getA()
+{
+ DepA a;
+ return a;
+}
diff --git a/Tests/CMakeCommands/target_link_libraries/depD.h b/Tests/CMakeCommands/target_link_libraries/depD.h
new file mode 100644
index 0000000..d24ff5f
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depD.h
@@ -0,0 +1,11 @@
+
+#include "depd_export.h"
+
+#include "depA.h"
+
+struct DEPD_EXPORT DepD
+{
+ int foo();
+
+ DepA getA();
+};
diff --git a/Tests/CMakeCommands/target_link_libraries/depE.cpp b/Tests/CMakeCommands/target_link_libraries/depE.cpp
new file mode 100644
index 0000000..1a3da4a
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depE.cpp
@@ -0,0 +1,13 @@
+
+#include "depE.h"
+
+int DepE::foo()
+{
+ return 0;
+}
+
+DepB DepE::getB()
+{
+ DepB a;
+ return a;
+}
diff --git a/Tests/CMakeCommands/target_link_libraries/depE.h b/Tests/CMakeCommands/target_link_libraries/depE.h
new file mode 100644
index 0000000..2273e17
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depE.h
@@ -0,0 +1,11 @@
+
+#include "depe_export.h"
+
+#include "depB.h"
+
+struct DEPE_EXPORT DepE
+{
+ int foo();
+
+ DepB getB();
+};
diff --git a/Tests/CMakeCommands/target_link_libraries/targetB.cpp b/Tests/CMakeCommands/target_link_libraries/targetB.cpp
new file mode 100644
index 0000000..c6a1264
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/targetB.cpp
@@ -0,0 +1,14 @@
+
+#include "depD.h"
+#include "depE.h"
+
+int main(int argc, char **argv)
+{
+ DepD d;
+ DepA a = d.getA();
+
+ DepE e;
+ DepB b = e.getB();
+
+ return d.foo() + a.foo() + e.foo() + b.foo();
+}
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a5cf51cc6bacce103aedf220eb3d3b19704ce4c4
commit a5cf51cc6bacce103aedf220eb3d3b19704ce4c4
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sun Sep 23 13:16:44 2012 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Fri Nov 30 17:02:44 2012 +0100
Add expressions for separating build-location from install-location.
This is for specifying INCLUDE_DIRECTORIES relevant to the build-location
or the install location for example:
set_property(TARGET foo PROPERTY
INTERFACE_INCLUDE_DIRECTORIES
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>"
)
A 'bar' target can then use:
set_property(TARGET bar PROPERTY
INCLUDE_DIRECTORIES
"$<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES>"
)
and it will work whether foo is in the same project, or an imported target
from an installation location, or an imported target from a build location
generated by the export() command.
Because the generator expressions are only evaluated at build-time, these
new expressions are equivalent to the ZeroNode and OneNode.
Additionally, the EXPORT_NAMESPACE expression is added to expand to the
namespace used when using export() or install(EXPORT). A full example of
this would be:
set_property(TARGET bar PROPERTY
INCLUDE_DIRECTORIES
"$<TARGET_PROPERTY:$<EXPORT_NAMESPACE>foo,INTERFACE_INCLUDE_DIRECTORIES>"
)
The GeneratorExpression test is split into parts. Some shells can't run
the custom command as it is getting too long.
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
index 32bf941..2bcced1 100644
--- a/Source/cmGeneratorExpression.cxx
+++ b/Source/cmGeneratorExpression.cxx
@@ -131,15 +131,9 @@ cmCompiledGeneratorExpression::~cmCompiledGeneratorExpression()
}
}
-std::string cmGeneratorExpression::Preprocess(const std::string &input,
- PreprocessContext context)
+//----------------------------------------------------------------------------
+static std::string stripAllGeneratorExpressions(const std::string &input)
{
- if (context != StripAllGeneratorExpressions)
- {
- assert(!"cmGeneratorExpression::Preprocess called with invalid args");
- return std::string();
- }
-
std::string result;
std::string::size_type pos = 0;
std::string::size_type lastPos = pos;
@@ -178,3 +172,95 @@ std::string cmGeneratorExpression::Preprocess(const std::string &input,
result += input.substr(lastPos);
return result;
}
+
+//----------------------------------------------------------------------------
+static std::string stripExportInterface(const std::string &input,
+ cmGeneratorExpression::PreprocessContext context,
+ const char *ns)
+{
+ std::string result;
+ {
+ std::string::size_type pos = 0;
+ std::string::size_type lastPos = pos;
+ while((pos = input.find("$<BUILD_INTERFACE:", lastPos)) != input.npos
+ || (pos = input.find("$<INSTALL_INTERFACE:", lastPos)) != input.npos)
+ {
+ result += input.substr(lastPos, pos - lastPos);
+ const bool gotInstallInterface = input[pos + 2] == 'I';
+ pos += gotInstallInterface ? sizeof("$<INSTALL_INTERFACE:") - 1
+ : sizeof("$<BUILD_INTERFACE:") - 1;
+ int nestingLevel = 1;
+ const char *c = input.c_str() + pos;
+ const char * const cStart = c;
+ for ( ; *c; ++c)
+ {
+ if(c[0] == '$' && c[1] == '<')
+ {
+ ++nestingLevel;
+ ++c;
+ continue;
+ }
+ if(c[0] == '>')
+ {
+ --nestingLevel;
+ if (nestingLevel != 0)
+ {
+ continue;
+ }
+ if(context == cmGeneratorExpression::BuildInterface
+ && !gotInstallInterface)
+ {
+ result += input.substr(pos, c - cStart);
+ }
+ else if(context == cmGeneratorExpression::InstallInterface
+ && gotInstallInterface)
+ {
+ result += input.substr(pos, c - cStart);
+ }
+ break;
+ }
+ }
+ const std::string::size_type traversed = (c - cStart) + 1;
+ if (!*c)
+ {
+ result += std::string(gotInstallInterface ? "$<INSTALL_INTERFACE:"
+ : "$<BUILD_INTERFACE:")
+ + input.substr(pos, traversed);
+ }
+ pos += traversed;
+ lastPos = pos;
+ }
+ result += input.substr(lastPos);
+ }
+
+ {
+ std::string::size_type pos = 0;
+ std::string::size_type lastPos = pos;
+
+ std::string expNs = ns ? ns : "";
+ while((pos = result.find("$<EXPORT_NAMESPACE>", lastPos)) != input.npos)
+ {
+ result.replace(pos, sizeof("$<EXPORT_NAMESPACE>") - 1, expNs);
+ pos += sizeof("$<EXPORT_NAMESPACE>") - 1;
+ }
+ }
+ return result;
+}
+
+//----------------------------------------------------------------------------
+std::string cmGeneratorExpression::Preprocess(const std::string &input,
+ PreprocessContext context,
+ const char *ns)
+{
+ if (context == StripAllGeneratorExpressions)
+ {
+ return stripAllGeneratorExpressions(input);
+ }
+ else if (context == BuildInterface || context == InstallInterface)
+ {
+ return stripExportInterface(input, context, ns);
+ }
+
+ assert(!"cmGeneratorExpression::Preprocess called with invalid args");
+ return std::string();
+}
diff --git a/Source/cmGeneratorExpression.h b/Source/cmGeneratorExpression.h
index ea3e7d0..5e3352b 100644
--- a/Source/cmGeneratorExpression.h
+++ b/Source/cmGeneratorExpression.h
@@ -48,11 +48,14 @@ public:
const cmCompiledGeneratorExpression& Parse(const char* input);
enum PreprocessContext {
- StripAllGeneratorExpressions
+ StripAllGeneratorExpressions,
+ BuildInterface,
+ InstallInterface
};
static std::string Preprocess(const std::string &input,
- PreprocessContext context);
+ PreprocessContext context,
+ const char *ns = 0);
private:
cmGeneratorExpression(const cmGeneratorExpression &);
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 102927e..b8e7f76 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -96,6 +96,31 @@ static const struct OneNode : public cmGeneratorExpressionNode
} oneNode;
//----------------------------------------------------------------------------
+static const struct OneNode buildInterfaceNode;
+
+//----------------------------------------------------------------------------
+static const struct ZeroNode installInterfaceNode;
+
+//----------------------------------------------------------------------------
+static const struct NullNode : public cmGeneratorExpressionNode
+{
+ NullNode() {}
+
+ virtual bool GeneratesContent() const { return false; }
+
+ std::string Evaluate(const std::vector<std::string> &,
+ cmGeneratorExpressionContext *,
+ const GeneratorExpressionContent *,
+ cmGeneratorExpressionDAGChecker *) const
+ {
+ return std::string();
+ }
+
+ virtual int NumExpectedParameters() const { return 0; }
+
+} nullNode;
+
+//----------------------------------------------------------------------------
#define BOOLEAN_OP_NODE(OPNAME, OP, SUCCESS_VALUE, FAILURE_VALUE) \
static const struct OP ## Node : public cmGeneratorExpressionNode \
{ \
@@ -593,6 +618,12 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
return &commaNode;
else if (identifier == "TARGET_PROPERTY")
return &targetPropertyNode;
+ else if (identifier == "BUILD_INTERFACE")
+ return &buildInterfaceNode;
+ else if (identifier == "INSTALL_INTERFACE")
+ return &installInterfaceNode;
+ else if (identifier == "EXPORT_NAMESPACE")
+ return &nullNode;
return 0;
}
diff --git a/Tests/GeneratorExpression/CMakeLists.txt b/Tests/GeneratorExpression/CMakeLists.txt
index 3a92d81..66c190a 100644
--- a/Tests/GeneratorExpression/CMakeLists.txt
+++ b/Tests/GeneratorExpression/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required (VERSION 2.8.8)
project(GeneratorExpression NONE)
-add_custom_target(check ALL
+add_custom_target(check-part1 ALL
COMMAND ${CMAKE_COMMAND}
-Dtest_0=$<0:nothing>
-Dtest_0_with_comma=$<0:-Wl,--no-undefined>
@@ -57,6 +57,13 @@ add_custom_target(check ALL
-Dtest_colons_3=$<1:Qt5::Core>
-Dtest_colons_4=$<1:C:\\CMake>
-Dtest_colons_5=$<1:C:/CMake>
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part1.cmake
+ COMMAND ${CMAKE_COMMAND} -E echo "check done (part 1 of 2)"
+ VERBATIM
+ )
+
+add_custom_target(check-part2 ALL
+ COMMAND ${CMAKE_COMMAND}
-Dtest_incomplete_1=$<
-Dtest_incomplete_2=$<something
-Dtest_incomplete_3=$<something:
@@ -78,7 +85,10 @@ add_custom_target(check ALL
-Dtest_incomplete_19=$<1:some,thing$<ANGLE-R>
-Dtest_incomplete_20=$<CONFIGURATION$<ANGLE-R>
-Dtest_incomplete_21=$<BOOL:something$<ANGLE-R>
- -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
- COMMAND ${CMAKE_COMMAND} -E echo "check done"
+ -Dtest_build_interface=$<BUILD_INTERFACE:build>
+ -Dtest_install_interface=$<INSTALL_INTERFACE:install>
+ -Dtest_export_namespace=$<EXPORT_NAMESPACE>x
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/check-part2.cmake
+ COMMAND ${CMAKE_COMMAND} -E echo "check done (part 2 of 2)"
VERBATIM
)
diff --git a/Tests/GeneratorExpression/check-common.cmake b/Tests/GeneratorExpression/check-common.cmake
new file mode 100644
index 0000000..8ffebd7
--- /dev/null
+++ b/Tests/GeneratorExpression/check-common.cmake
@@ -0,0 +1,5 @@
+macro(check var val)
+ if(NOT "${${var}}" STREQUAL "${val}")
+ message(SEND_ERROR "${var} is \"${${var}}\", not \"${val}\"")
+ endif()
+endmacro()
diff --git a/Tests/GeneratorExpression/check-part1.cmake b/Tests/GeneratorExpression/check-part1.cmake
new file mode 100644
index 0000000..7abfa82
--- /dev/null
+++ b/Tests/GeneratorExpression/check-part1.cmake
@@ -0,0 +1,56 @@
+
+include(${CMAKE_CURRENT_LIST_DIR}/check-common.cmake)
+
+message(STATUS "config=[${config}]")
+check(test_0 "")
+check(test_0_with_comma "")
+check(test_1 "content")
+check(test_1_with_comma "-Wl,--no-undefined")
+check(test_and_0 "0")
+check(test_and_0_0 "0")
+check(test_and_0_1 "0")
+check(test_and_1 "1")
+check(test_and_1_0 "0")
+check(test_and_1_1 "1")
+check(test_and_0_invalidcontent "0")
+check(test_config_0 "0")
+check(test_config_1 "1")
+foreach(c debug release relwithdebinfo minsizerel)
+ if(NOT "${test_config_${c}}" MATCHES "^(0+|1+)$")
+ message(SEND_ERROR "test_config_${c} is \"${test_config_${c}}\", not all 0 or all 1")
+ endif()
+endforeach()
+check(test_not_0 "1")
+check(test_not_1 "0")
+check(test_or_0 "0")
+check(test_or_0_0 "0")
+check(test_or_0_1 "1")
+check(test_or_1 "1")
+check(test_or_1_0 "1")
+check(test_or_1_1 "1")
+check(test_or_1_invalidcontent "1")
+check(test_bool_notfound "0")
+check(test_bool_foo_notfound "0")
+check(test_bool_true "1")
+check(test_bool_false "0")
+check(test_bool_on "1")
+check(test_bool_off "0")
+check(test_bool_no "0")
+check(test_bool_n "0")
+check(test_bool_empty "0")
+check(test_strequal_yes_yes "1")
+check(test_strequal_yes_yes_cs "0")
+check(test_strequal_yes_no "0")
+check(test_strequal_no_yes "0")
+check(test_strequal_angle_r "1")
+check(test_strequal_comma "1")
+check(test_strequal_angle_r_comma "0")
+check(test_strequal_both_empty "1")
+check(test_strequal_one_empty "0")
+check(test_angle_r ">")
+check(test_comma ",")
+check(test_colons_1 ":")
+check(test_colons_2 "::")
+check(test_colons_3 "Qt5::Core")
+check(test_colons_4 "C:\\\\CMake")
+check(test_colons_5 "C:/CMake")
diff --git a/Tests/GeneratorExpression/check-part2.cmake b/Tests/GeneratorExpression/check-part2.cmake
new file mode 100644
index 0000000..4201345
--- /dev/null
+++ b/Tests/GeneratorExpression/check-part2.cmake
@@ -0,0 +1,27 @@
+
+include(${CMAKE_CURRENT_LIST_DIR}/check-common.cmake)
+
+check(test_incomplete_1 "$<")
+check(test_incomplete_2 "$<something")
+check(test_incomplete_3 "$<something:")
+check(test_incomplete_4 "$<something:,")
+check(test_incomplete_5 "$something:,>")
+check(test_incomplete_6 "<something:,>")
+check(test_incomplete_7 "$<something::")
+check(test_incomplete_8 "$<something:,")
+check(test_incomplete_9 "$<something:,,")
+check(test_incomplete_10 "$<something:,:")
+check(test_incomplete_11 "$<something,,")
+check(test_incomplete_12 "$<,,")
+check(test_incomplete_13 "$<somespecialthing")
+check(test_incomplete_14 "$<>")
+check(test_incomplete_15 "$<some$<thing")
+check(test_incomplete_16 "$<BOOL:something")
+check(test_incomplete_17 "some$thing")
+check(test_incomplete_18 "$<1:some,thing")
+check(test_incomplete_19 "$<1:some,thing>")
+check(test_incomplete_20 "$<CONFIGURATION>")
+check(test_incomplete_21 "$<BOOL:something>")
+check(test_build_interface "build")
+check(test_install_interface "")
+check(test_export_namespace "x")
diff --git a/Tests/GeneratorExpression/check.cmake b/Tests/GeneratorExpression/check.cmake
deleted file mode 100644
index af436de..0000000
--- a/Tests/GeneratorExpression/check.cmake
+++ /dev/null
@@ -1,80 +0,0 @@
-macro(check var val)
- if(NOT "${${var}}" STREQUAL "${val}")
- message(SEND_ERROR "${var} is \"${${var}}\", not \"${val}\"")
- endif()
-endmacro()
-
-message(STATUS "config=[${config}]")
-check(test_0 "")
-check(test_0_with_comma "")
-check(test_1 "content")
-check(test_1_with_comma "-Wl,--no-undefined")
-check(test_and_0 "0")
-check(test_and_0_0 "0")
-check(test_and_0_1 "0")
-check(test_and_1 "1")
-check(test_and_1_0 "0")
-check(test_and_1_1 "1")
-check(test_and_0_invalidcontent "0")
-check(test_config_0 "0")
-check(test_config_1 "1")
-foreach(c debug release relwithdebinfo minsizerel)
- if(NOT "${test_config_${c}}" MATCHES "^(0+|1+)$")
- message(SEND_ERROR "test_config_${c} is \"${test_config_${c}}\", not all 0 or all 1")
- endif()
-endforeach()
-check(test_not_0 "1")
-check(test_not_1 "0")
-check(test_or_0 "0")
-check(test_or_0_0 "0")
-check(test_or_0_1 "1")
-check(test_or_1 "1")
-check(test_or_1_0 "1")
-check(test_or_1_1 "1")
-check(test_or_1_invalidcontent "1")
-check(test_bool_notfound "0")
-check(test_bool_foo_notfound "0")
-check(test_bool_true "1")
-check(test_bool_false "0")
-check(test_bool_on "1")
-check(test_bool_off "0")
-check(test_bool_no "0")
-check(test_bool_n "0")
-check(test_bool_empty "0")
-check(test_strequal_yes_yes "1")
-check(test_strequal_yes_yes_cs "0")
-check(test_strequal_yes_no "0")
-check(test_strequal_no_yes "0")
-check(test_strequal_angle_r "1")
-check(test_strequal_comma "1")
-check(test_strequal_angle_r_comma "0")
-check(test_strequal_both_empty "1")
-check(test_strequal_one_empty "0")
-check(test_angle_r ">")
-check(test_comma ",")
-check(test_colons_1 ":")
-check(test_colons_2 "::")
-check(test_colons_3 "Qt5::Core")
-check(test_colons_4 "C:\\\\CMake")
-check(test_colons_5 "C:/CMake")
-check(test_incomplete_1 "$<")
-check(test_incomplete_2 "$<something")
-check(test_incomplete_3 "$<something:")
-check(test_incomplete_4 "$<something:,")
-check(test_incomplete_5 "$something:,>")
-check(test_incomplete_6 "<something:,>")
-check(test_incomplete_7 "$<something::")
-check(test_incomplete_8 "$<something:,")
-check(test_incomplete_9 "$<something:,,")
-check(test_incomplete_10 "$<something:,:")
-check(test_incomplete_11 "$<something,,")
-check(test_incomplete_12 "$<,,")
-check(test_incomplete_13 "$<somespecialthing")
-check(test_incomplete_14 "$<>")
-check(test_incomplete_15 "$<some$<thing")
-check(test_incomplete_16 "$<BOOL:something")
-check(test_incomplete_17 "some$thing")
-check(test_incomplete_18 "$<1:some,thing")
-check(test_incomplete_19 "$<1:some,thing>")
-check(test_incomplete_20 "$<CONFIGURATION>")
-check(test_incomplete_21 "$<BOOL:something>")
-----------------------------------------------------------------------
Summary of changes:
Source/cmDocumentGeneratorExpressions.h | 9 +
Source/cmDocumentVariables.cxx | 8 +
Source/cmExportBuildFileGenerator.cxx | 12 ++
Source/cmExportFileGenerator.cxx | 44 +++++
Source/cmExportFileGenerator.h | 7 +
Source/cmExportInstallFileGenerator.cxx | 13 ++
Source/cmGeneratorExpression.cxx | 102 ++++++++++-
Source/cmGeneratorExpression.h | 7 +-
Source/cmGeneratorExpressionEvaluator.cxx | 31 ++++
Source/cmPolicies.cxx | 24 +++
Source/cmPolicies.h | 1 +
Source/cmTarget.cxx | 183 +++++++++++++++++--
Source/cmTarget.h | 5 +
Source/cmTargetLinkLibrariesCommand.cxx | 28 +++-
.../target_link_libraries/CMakeLists.txt | 18 ++
Tests/CMakeCommands/target_link_libraries/depD.cpp | 13 ++
.../target_link_libraries/{depC.h => depD.h} | 5 +-
Tests/CMakeCommands/target_link_libraries/depE.cpp | 13 ++
Tests/CMakeCommands/target_link_libraries/depE.h | 11 ++
.../target_link_libraries/targetB.cpp | 14 ++
Tests/GeneratorExpression/CMakeLists.txt | 16 ++-
Tests/GeneratorExpression/check-common.cmake | 5 +
Tests/GeneratorExpression/check-part1.cmake | 56 ++++++
Tests/GeneratorExpression/check-part2.cmake | 27 +++
Tests/GeneratorExpression/check.cmake | 80 ---------
25 files changed, 615 insertions(+), 117 deletions(-)
create mode 100644 Tests/CMakeCommands/target_link_libraries/depD.cpp
copy Tests/CMakeCommands/target_link_libraries/{depC.h => depD.h} (52%)
create mode 100644 Tests/CMakeCommands/target_link_libraries/depE.cpp
create mode 100644 Tests/CMakeCommands/target_link_libraries/depE.h
create mode 100644 Tests/CMakeCommands/target_link_libraries/targetB.cpp
create mode 100644 Tests/GeneratorExpression/check-common.cmake
create mode 100644 Tests/GeneratorExpression/check-part1.cmake
create mode 100644 Tests/GeneratorExpression/check-part2.cmake
delete mode 100644 Tests/GeneratorExpression/check.cmake
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list