[Cmake-commits] CMake branch, next, updated. v2.8.10.1-988-gd23cc6e
Stephen Kelly
steveire at gmail.com
Fri Nov 23 03:38:09 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 d23cc6ee8bc2dd156b1ae69b7e988eb6017d2b7a (commit)
via 8ba3eceb1da712072b2a143748218d291ab79f6a (commit)
via 79c8f0fdb928d537ce2b83dd4d334488016dd646 (commit)
via 2ea664282d32cb7ea8aed4798f14d5c8a81d1454 (commit)
via bc216733a6d02284407a4380c855008dd3f6237f (commit)
via 45ffd458313f92b646fc729d4e873c9189af7079 (commit)
from 196ba440fdd13ee73a2e27fab016d728ac4e405c (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=d23cc6ee8bc2dd156b1ae69b7e988eb6017d2b7a
commit d23cc6ee8bc2dd156b1ae69b7e988eb6017d2b7a
Merge: 196ba44 8ba3ece
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Fri Nov 23 03:38:01 2012 -0500
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Fri Nov 23 03:38:01 2012 -0500
Merge topic 'tll-set-include-and-defines-requirements' into next
8ba3ece Add includes and compile definitions with target_link_libraries.
79c8f0f Add the TARGET_DEFINED generator expression
2ea6642 Handle INTERFACE properties transitively for includes and defines.
bc21673 Keep track of INCLUDE_DIRECTORIES as a vector of structs.
45ffd45 Use cmsys::auto_ptr to manage cmCompiledGeneratorExpressions
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8ba3eceb1da712072b2a143748218d291ab79f6a
commit 8ba3eceb1da712072b2a143748218d291ab79f6a
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Mon Nov 5 12:43:28 2012 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Fri Nov 23 09:31:28 2012 +0100
Add includes and compile definitions with target_link_libraries.
The compile-related properties are required for linking so it makes
sense to add the interface includes for dependencies.
This requires adding a policy to handle the change in behavior of
code such as:
add_executable(foo ...)
target_link_libraries(foo bar bat)
include_directories(${bat_INCLUDE_DIRS} ${bar_INCLUDE_DIRS})
which will change order of generated includes after this patch if
bar or bat are TARGETS with an INTERFACE_INCLUDE_DIRECTORIES
property.
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 8498d72..5fa10f2 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1665,8 +1665,14 @@ void cmMakefile::AddIncludeDirectory(const char* inc, bool before)
l != this->Targets.end(); ++l)
{
cmTarget &t = l->second;
- prop = t.GetProperties().GetOrCreateProperty("INCLUDE_DIRECTORIES");
- AddStringToProperty(prop, "INCLUDE_DIRECTORIES", inc, before);
+ if (before)
+ {
+ t.PrependTLLIncludeDirectories(inc);
+ }
+ else
+ {
+ t.AppendTLLIncludeDirectories(inc);
+ }
}
}
diff --git a/Source/cmPolicies.cxx b/Source/cmPolicies.cxx
index 4c89dd6..13e36c8 100644
--- a/Source/cmPolicies.cxx
+++ b/Source/cmPolicies.cxx
@@ -511,6 +511,23 @@ cmPolicies::cmPolicies()
"the value of the (IMPORTED_)?LINK_INTERFACE_LIBRARIES(_<CONFIG>)? target "
"property",
2,8,11,0, cmPolicies::WARN);
+
+ this->DefinePolicy(
+ CMP0020, "CMP0020",
+ "Use INCLUDE_DIRECTORIES order implied by target_link_libraries.",
+ "CMake 2.8.11 introduced a feature where using target_link_libraries "
+ "can read the INTERFACE_INCLUDE_DIRECTORIES property of a target and "
+ "use the value as include directories when compiling. Because the "
+ "target_link_libraries call might occur before the include_directories "
+ "call, this could change the order of includes in the compile step."
+ "\n"
+ "The OLD behavior for this policy is to let the include_directories call "
+ "determine the order of includes."
+ "\n"
+ "The NEW behavior for this policy is to use the order of includes "
+ "determined by the order of all calls to target_link_libraries and "
+ "include_directories",
+ 2,8,11,0, cmPolicies::WARN);
}
cmPolicies::~cmPolicies()
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index b6b8e39..94154ee 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -69,6 +69,7 @@ public:
/// POSITION_INDEPENDENT_CODE property and *_COMPILE_OPTIONS_PI{E,C}
/// instead.
CMP0019, ///< Use new-style INTERFACE_LINK_LIBRARIES
+ CMP0020, ///< Use INCLUDE_DIRECTORIES order from target_link_libraries
/** \brief Always the last entry.
*
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 451b84b..717ebbb 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -121,10 +121,13 @@ public:
SourceEntriesType SourceEntries;
struct IncludeDirectoriesEntry {
- IncludeDirectoriesEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge)
- : ge(cge)
+ IncludeDirectoriesEntry(
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge,
+ bool tllEntry = false)
+ : ge(cge), ImpliedByTargetLinkLibraries(tllEntry)
{}
const cmsys::auto_ptr<cmCompiledGeneratorExpression> ge;
+ const bool ImpliedByTargetLinkLibraries;
};
std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries;
std::string IncludeDirectoriesString;
@@ -2522,6 +2525,29 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
}
//----------------------------------------------------------------------------
+void cmTarget::AppendTLLIncludeDirectories(const std::string &includes)
+{
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+ this->Internal->IncludeDirectoriesEntries.push_back(
+ new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(includes),
+ true)
+ );
+}
+
+//----------------------------------------------------------------------------
+void cmTarget::PrependTLLIncludeDirectories(const std::string &includes)
+{
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+ this->Internal->IncludeDirectoriesEntries.insert(
+ this->Internal->IncludeDirectoriesEntries.begin(),
+ new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(includes),
+ true)
+ );
+}
+
+//----------------------------------------------------------------------------
std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
{
std::set<std::string> fromTll;
@@ -2554,8 +2580,44 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
cmSystemTools::ConvertToUnixSlashes(inc);
}
+ if (!(*it)->ImpliedByTargetLinkLibraries)
+ {
+ if (fromTll.find(*li) != fromTll.end())
+ {
+ switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0020))
+ {
+ case cmPolicies::WARN:
+ {
+ cmOStringStream e;
+ e << "The include directory " << *li << " was specified "
+ "implicitly by an earlier call to target_link_libraries. "
+ "Preserving the order of includes as if the earlier use of "
+ "target_link_libraries had not added it."
+ << this->Makefile->GetPolicies()->GetPolicyWarning(
+ cmPolicies::CMP0020);
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING, e.str());
+ }
+ // Fall through to OLD behavior
+ case cmPolicies::OLD:
+ includes.erase(std::remove(includes.begin(),
+ includes.end(), *li),
+ includes.end());
+ fromTll.erase(*li);
+ includes.push_back(*li);
+ break;
+ case cmPolicies::REQUIRED_ALWAYS:
+ case cmPolicies::REQUIRED_IF_USED:
+ case cmPolicies::NEW:
+ break;
+ }
+ }
+ }
if(uniqueIncludes.insert(inc).second)
{
+ if ((*it)->ImpliedByTargetLinkLibraries)
+ {
+ fromTll.insert(*li);
+ }
includes.push_back(*li);
}
}
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 60a105e..a6090e5 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -478,6 +478,9 @@ public:
/** @return the Mac framework directory without the base. */
std::string GetFrameworkDirectory(const char* config = 0);
+ void AppendTLLIncludeDirectories(const std::string &includes);
+ void PrependTLLIncludeDirectories(const std::string &includes);
+
std::vector<std::string> GetIncludeDirectories(const char *config);
private:
diff --git a/Source/cmTargetLinkLibrariesCommand.cxx b/Source/cmTargetLinkLibrariesCommand.cxx
index d7a1443..2ccdc01 100644
--- a/Source/cmTargetLinkLibrariesCommand.cxx
+++ b/Source/cmTargetLinkLibrariesCommand.cxx
@@ -273,10 +273,52 @@ static std::string generatorIface(const std::string &value,
}
//----------------------------------------------------------------------------
+static std::string compileProperty(const std::string &lib,
+ const std::string &property,
+ cmTarget::LinkLibraryType llt)
+{
+ return generatorIface(std::string("$<$<TARGET_DEFINED:" + lib + ">"
+ ":$<TARGET_PROPERTY:")
+ + lib
+ + ",INTERFACE_" + property + ">>", llt);
+}
+
+//----------------------------------------------------------------------------
+static bool isGeneratorExpression(const std::string &lib)
+{
+ const std::string::size_type openpos = lib.find("$<");
+ return (openpos != std::string::npos)
+ && (lib.find(">", openpos) != std::string::npos);
+}
+
+//----------------------------------------------------------------------------
+static bool isList(const char *lib)
+{
+ std::vector<std::string> result;
+ cmSystemTools::ExpandListArgument(lib, result);
+ return result.size() > 1;
+}
+
+//----------------------------------------------------------------------------
void
cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
cmTarget::LinkLibraryType llt)
{
+ cmTarget *tgt = this->Makefile->FindTargetToUse(lib);
+ const bool isNonImportedTarget = tgt && !tgt->IsImported();
+ const bool isGenex = isGeneratorExpression(lib);
+ const std::string nsLib =
+ std::string(isNonImportedTarget && !isList(lib)
+ ? "$<EXPORT_NAMESPACE>" : "") + lib;
+ if (tgt || isGenex)
+ {
+ this->Target->AppendTLLIncludeDirectories(compileProperty(nsLib,
+ "INCLUDE_DIRECTORIES", llt));
+ this->Target->AppendProperty("COMPILE_DEFINITIONS",
+ compileProperty(nsLib,
+ "COMPILE_DEFINITIONS", llt).c_str());
+ }
+
// Handle normal case first.
if(this->CurrentProcessingState != ProcessingLinkInterface)
{
@@ -290,7 +332,13 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
}
this->Target->AppendProperty("INTERFACE_LINK_LIBRARIES",
- generatorIface(lib, llt).c_str());
+ generatorIface(nsLib, llt).c_str());
+ this->Target->AppendProperty("INTERFACE_COMPILE_DEFINITIONS",
+ compileProperty(nsLib,
+ "COMPILE_DEFINITIONS", llt).c_str());
+ this->Target->AppendProperty("INTERFACE_INCLUDE_DIRECTORIES",
+ compileProperty(nsLib,
+ "INCLUDE_DIRECTORIES", llt).c_str());
// Get the list of configurations considered to be DEBUG.
std::vector<std::string> const& debugConfigs =
diff --git a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
index 95cfd15..92c9338 100644
--- a/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
+++ b/Tests/CMakeCommands/target_link_libraries/CMakeLists.txt
@@ -74,3 +74,27 @@ add_executable(targetB targetB.cpp)
target_link_libraries(targetB depD depE)
# cmake_policy(POP)
+
+
+macro(create_header _name)
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${_name}")
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${_name}/${_name}.h" "//${_name}.h\n")
+endmacro()
+
+create_header(foo)
+create_header(bar)
+
+add_library(depF SHARED depF.cpp)
+generate_export_header(depF)
+set_property(TARGET depF PROPERTY
+ INTERFACE_INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_BINARY_DIR}/foo
+ ${CMAKE_CURRENT_BINARY_DIR}/bar
+)
+set_property(TARGET depF PROPERTY
+ INTERFACE_COMPILE_DEFINITIONS
+ TEST_DEF
+)
+
+add_library(targetC targetC.cpp)
+target_link_libraries(targetC depF)
diff --git a/Tests/CMakeCommands/target_link_libraries/depF.cpp b/Tests/CMakeCommands/target_link_libraries/depF.cpp
new file mode 100644
index 0000000..1fd29c4
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depF.cpp
@@ -0,0 +1,7 @@
+
+#include "depF.h"
+
+int DepF::foo()
+{
+ return 0;
+}
diff --git a/Tests/CMakeCommands/target_link_libraries/depF.h b/Tests/CMakeCommands/target_link_libraries/depF.h
new file mode 100644
index 0000000..95d6b14
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/depF.h
@@ -0,0 +1,7 @@
+
+#include "depf_export.h"
+
+struct DEPF_EXPORT DepF
+{
+ int foo();
+};
diff --git a/Tests/CMakeCommands/target_link_libraries/targetC.cpp b/Tests/CMakeCommands/target_link_libraries/targetC.cpp
new file mode 100644
index 0000000..ac33c67
--- /dev/null
+++ b/Tests/CMakeCommands/target_link_libraries/targetC.cpp
@@ -0,0 +1,16 @@
+
+#include "depF.h"
+
+#include "foo.h"
+#include "bar.h"
+
+#ifndef TEST_DEF
+#error Expected TEST_DEF definition
+#endif
+
+int main(int argc, char **argv)
+{
+ DepF f;
+
+ return f.foo();
+}
diff --git a/Tests/RunCMake/PolicyCMP0019/PolicyWarn1-stderr.txt b/Tests/RunCMake/PolicyCMP0019/PolicyWarn1-stderr.txt
index f2e8f90..fd6684f 100644
--- a/Tests/RunCMake/PolicyCMP0019/PolicyWarn1-stderr.txt
+++ b/Tests/RunCMake/PolicyCMP0019/PolicyWarn1-stderr.txt
@@ -2,7 +2,7 @@ CMake Warning \(dev\) in CMakeLists.txt:
The INTERFACE_LINK_LIBRARIES and LINK_INTERFACE_LIBRARIES are not the same
for target \"bar\".
- NEW content is \"foo\"
+ NEW content is \"\$<EXPORT_NAMESPACE>foo\"
OLD content is \"foo;blub\"
diff --git a/Tests/RunCMake/PolicyCMP0019/PolicyWarn2-stderr.txt b/Tests/RunCMake/PolicyCMP0019/PolicyWarn2-stderr.txt
index 6367016..fe02015 100644
--- a/Tests/RunCMake/PolicyCMP0019/PolicyWarn2-stderr.txt
+++ b/Tests/RunCMake/PolicyCMP0019/PolicyWarn2-stderr.txt
@@ -2,7 +2,7 @@ CMake Warning \(dev\) in CMakeLists.txt:
The INTERFACE_LINK_LIBRARIES and LINK_INTERFACE_LIBRARIES are not the same
for target \"bar\".
- NEW content is \"foo;\$<0:blub>\"
+ NEW content is \"\$<EXPORT_NAMESPACE>foo;\$<0:blub>\"
OLD content is \"foo;blub\"
diff --git a/Tests/RunCMake/PolicyCMP0019/PolicyWarn3-stderr.txt b/Tests/RunCMake/PolicyCMP0019/PolicyWarn3-stderr.txt
index 4f5c1cb..366a452 100644
--- a/Tests/RunCMake/PolicyCMP0019/PolicyWarn3-stderr.txt
+++ b/Tests/RunCMake/PolicyCMP0019/PolicyWarn3-stderr.txt
@@ -2,7 +2,7 @@ CMake Warning \(dev\) in CMakeLists.txt:
The INTERFACE_LINK_LIBRARIES and LINK_INTERFACE_LIBRARIES are not the same
for target \"bar\".
- NEW content is \"foo;blub\"
+ NEW content is \"\$<EXPORT_NAMESPACE>foo;blub\"
OLD content is \"foo\"
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=79c8f0fdb928d537ce2b83dd4d334488016dd646
commit 79c8f0fdb928d537ce2b83dd4d334488016dd646
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Mon Nov 19 23:56:12 2012 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 22 18:06:59 2012 +0100
Add the TARGET_DEFINED generator expression
This tests whether the parameter is a usable target.
diff --git a/Source/cmDocumentGeneratorExpressions.h b/Source/cmDocumentGeneratorExpressions.h
index 445fd0e..4866f0d 100644
--- a/Source/cmDocumentGeneratorExpressions.h
+++ b/Source/cmDocumentGeneratorExpressions.h
@@ -27,6 +27,7 @@
" $<COMMA> = A literal ','. Used to compare " \
"strings which contain a ',' for example.\n" \
" $<TARGET_FILE:tgt> = main file (.exe, .so.1.2, .a)\n" \
+ " $<TARGET_DEFINED:tgt> = '1' if tgt is a target, else '0'\n" \
" $<TARGET_LINKER_FILE:tgt> = file used to link (.a, .lib, .so)\n" \
" $<TARGET_SONAME_FILE:tgt> = file with soname (.so.3)\n" \
"where \"tgt\" is the name of a target. " \
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 57d75e0..9c6ea23 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -286,6 +286,23 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode
} configurationTestNode;
//----------------------------------------------------------------------------
+static const struct TargetTestNode : public cmGeneratorExpressionNode
+{
+ TargetTestNode() {}
+
+ virtual int NumExpectedParameters() const { return 1; }
+
+ std::string Evaluate(const std::vector<std::string> ¶meters,
+ cmGeneratorExpressionContext *context,
+ const GeneratorExpressionContent *,
+ cmGeneratorExpressionDAGChecker *) const
+ {
+ return context->Makefile->FindTargetToUse(parameters.front().c_str())
+ ? "1" : "0";
+ }
+} targetTestNode;
+
+//----------------------------------------------------------------------------
static const char* targetPropertyTransitiveWhitelist[] = {
"INTERFACE_INCLUDE_DIRECTORIES"
, "INTERFACE_COMPILE_DEFINITIONS"
@@ -648,6 +665,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
return &installInterfaceNode;
else if (identifier == "EXPORT_NAMESPACE")
return &nullNode;
+ else if (identifier == "TARGET_DEFINED")
+ return &targetTestNode;
return 0;
}
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=2ea664282d32cb7ea8aed4798f14d5c8a81d1454
commit 2ea664282d32cb7ea8aed4798f14d5c8a81d1454
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Sun Sep 23 13:45:17 2012 +0200
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 22 18:06:59 2012 +0100
Handle INTERFACE properties transitively for includes and defines.
Contextually, the behavior is as if the properties content from another
target is included in the string and then the result is evaluated.
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx
index f8f412a..f943584 100644
--- a/Source/cmExportBuildFileGenerator.cxx
+++ b/Source/cmExportBuildFileGenerator.cxx
@@ -51,6 +51,12 @@ bool cmExportBuildFileGenerator::GenerateMainFile(std::ostream& os)
{
ImportPropertyMap properties;
+ this->PopulateInterfaceProperty("INTERFACE_INCLUDE_DIRECTORIES", te,
+ cmGeneratorExpression::BuildInterface,
+ properties);
+ this->PopulateInterfaceProperty("INTERFACE_COMPILE_DEFINITIONS", te,
+ cmGeneratorExpression::BuildInterface,
+ properties);
this->PopulateInterfaceProperty("INTERFACE_LINK_LIBRARIES", te,
cmGeneratorExpression::BuildInterface,
properties);
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 4d99866..40606be 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -68,6 +68,14 @@ bool cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
{
ImportPropertyMap properties;
+ this->PopulateInterfaceProperty("INTERFACE_INCLUDE_DIRECTORIES",
+ te->Target,
+ cmGeneratorExpression::InstallInterface,
+ properties);
+ this->PopulateInterfaceProperty("INTERFACE_COMPILE_DEFINITIONS",
+ te->Target,
+ cmGeneratorExpression::InstallInterface,
+ properties);
this->PopulateInterfaceProperty("INTERFACE_LINK_LIBRARIES",
te->Target,
cmGeneratorExpression::InstallInterface,
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 07f46be..57d75e0 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -286,6 +286,12 @@ static const struct ConfigurationTestNode : public cmGeneratorExpressionNode
} configurationTestNode;
//----------------------------------------------------------------------------
+static const char* targetPropertyTransitiveWhitelist[] = {
+ "INTERFACE_INCLUDE_DIRECTORIES"
+ , "INTERFACE_COMPILE_DEFINITIONS"
+};
+
+//----------------------------------------------------------------------------
static const struct TargetPropertyNode : public cmGeneratorExpressionNode
{
TargetPropertyNode() {}
@@ -387,7 +393,27 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
}
const char *prop = target->GetProperty(propertyName.c_str());
- return prop ? prop : "";
+ if (!prop)
+ {
+ return std::string();
+ }
+
+ for (size_t i = 0;
+ i < (sizeof(targetPropertyTransitiveWhitelist) /
+ sizeof(*targetPropertyTransitiveWhitelist));
+ ++i)
+ {
+ if (targetPropertyTransitiveWhitelist[i] == propertyName)
+ {
+ cmGeneratorExpression ge(context->Backtrace);
+ return ge.Parse(prop)->Evaluate(context->Makefile,
+ context->Config,
+ context->Quiet,
+ context->Target,
+ &dagChecker);
+ }
+ }
+ return prop;
}
} targetPropertyNode;
diff --git a/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt b/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt
index 7cb1b42..4e79d1f 100644
--- a/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt
+++ b/Tests/IncludeDirectories/TargetIncludeDirectories/CMakeLists.txt
@@ -45,3 +45,23 @@ set_property(TARGET TargetIncludeDirectories
APPEND PROPERTY INCLUDE_DIRECTORIES
"$<TARGET_PROPERTY:somelib::withcolons,INTERFACE_INCLUDE_DIRECTORIES>"
)
+
+create_header(fee)
+create_header(fiy)
+create_header(foh)
+create_header(fum)
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp" "#include \"fee.h\"")
+add_library(lib1 "${CMAKE_CURRENT_BINARY_DIR}/lib1.cpp")
+set_property(TARGET lib1 APPEND PROPERTY INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fee")
+set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fiy")
+set_property(TARGET lib1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:${CMAKE_CURRENT_BINARY_DIR}/foh>")
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp" "#include \"fiy.h\"")
+add_library(lib2 "${CMAKE_CURRENT_BINARY_DIR}/lib2.cpp")
+set_property(TARGET lib2 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/fum;$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>")
+set_property(TARGET lib2 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES>")
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main3.cpp" "#include \"fiy.h\"\n#include \"foh.h\"\n#include \"fum.h\"\nint main(int,char**) { return 0; }\n")
+add_executable(exe3 "${CMAKE_CURRENT_BINARY_DIR}/main3.cpp")
+set_property(TARGET exe3 APPEND PROPERTY INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:lib2,INTERFACE_INCLUDE_DIRECTORIES>")
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=bc216733a6d02284407a4380c855008dd3f6237f
commit bc216733a6d02284407a4380c855008dd3f6237f
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Mon Nov 19 22:47:30 2012 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 22 18:06:59 2012 +0100
Keep track of INCLUDE_DIRECTORIES as a vector of structs.
The struct can keep track of where the include came from, which gives
us proper backtraces, and will allow us to implement a policy later
relating to order of include directories.
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index 55507dd..62ee26a 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -252,45 +252,7 @@ const char* cmGeneratorTarget::GetCreateRuleVariable()
std::vector<std::string> cmGeneratorTarget::GetIncludeDirectories(
const char *config)
{
- std::vector<std::string> includes;
- const char *prop = this->Target->GetProperty("INCLUDE_DIRECTORIES");
- if(!prop)
- {
- return includes;
- }
-
- cmListFileBacktrace lfbt;
- cmGeneratorExpression ge(lfbt);
-
- cmGeneratorExpressionDAGChecker dagChecker(lfbt,
- this->GetName(),
- "INCLUDE_DIRECTORIES", 0, 0);
-
- cmSystemTools::ExpandListArgument(ge.Parse(prop)
- ->Evaluate(this->Makefile,
- config,
- false,
- this->Target,
- &dagChecker),
- includes);
-
- std::set<std::string> uniqueIncludes;
- std::vector<std::string> orderedAndUniqueIncludes;
- for(std::vector<std::string>::const_iterator
- li = includes.begin(); li != includes.end(); ++li)
- {
- std::string inc = *li;
- if (!cmSystemTools::IsOff(inc.c_str()))
- {
- cmSystemTools::ConvertToUnixSlashes(inc);
- }
- if(uniqueIncludes.insert(inc).second)
- {
- orderedAndUniqueIncludes.push_back(inc);
- }
- }
-
- return orderedAndUniqueIncludes;
+ return this->Target->GetIncludeDirectories(config);
}
//----------------------------------------------------------------------------
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 0e83878..451b84b 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -119,6 +119,15 @@ public:
struct SourceEntry { std::vector<cmSourceFile*> Depends; };
typedef std::map<cmSourceFile*, SourceEntry> SourceEntriesType;
SourceEntriesType SourceEntries;
+
+ struct IncludeDirectoriesEntry {
+ IncludeDirectoriesEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge)
+ : ge(cge)
+ {}
+ const cmsys::auto_ptr<cmCompiledGeneratorExpression> ge;
+ };
+ std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries;
+ std::string IncludeDirectoriesString;
};
//----------------------------------------------------------------------------
@@ -2478,6 +2487,16 @@ void cmTarget::SetProperty(const char* prop, const char* value)
return;
}
+ if(strcmp(prop,"INCLUDE_DIRECTORIES") == 0)
+ {
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+ this->Internal->IncludeDirectoriesEntries.clear();
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(value);
+ this->Internal->IncludeDirectoriesEntries.push_back(
+ new cmTargetInternals::IncludeDirectoriesEntry(cge));
+ return;
+ }
this->Properties.SetProperty(prop, value, cmProperty::TARGET);
this->MaybeInvalidatePropertyCache(prop);
}
@@ -2490,11 +2509,61 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
{
return;
}
+ if(strcmp(prop,"INCLUDE_DIRECTORIES") == 0)
+ {
+ cmListFileBacktrace lfbt;
+ cmGeneratorExpression ge(lfbt);
+ this->Internal->IncludeDirectoriesEntries.push_back(
+ new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value)));
+ return;
+ }
this->Properties.AppendProperty(prop, value, cmProperty::TARGET, asString);
this->MaybeInvalidatePropertyCache(prop);
}
//----------------------------------------------------------------------------
+std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
+{
+ std::set<std::string> fromTll;
+ std::vector<std::string> includes;
+ std::set<std::string> uniqueIncludes;
+ cmListFileBacktrace lfbt;
+
+ cmGeneratorExpressionDAGChecker dagChecker(lfbt,
+ this->GetName(),
+ "INCLUDE_DIRECTORIES", 0, 0);
+
+ for (std::vector<cmTargetInternals::IncludeDirectoriesEntry*>::const_iterator
+ it = this->Internal->IncludeDirectoriesEntries.begin(),
+ end = this->Internal->IncludeDirectoriesEntries.end();
+ it != end; ++it)
+ {
+ std::vector<std::string> entryIncludes;
+ cmSystemTools::ExpandListArgument((*it)->ge->Evaluate(this->Makefile,
+ config,
+ false,
+ this,
+ &dagChecker),
+ entryIncludes);
+ for(std::vector<std::string>::const_iterator
+ li = entryIncludes.begin(); li != entryIncludes.end(); ++li)
+ {
+ std::string inc = *li;
+ if (!cmSystemTools::IsOff(inc.c_str()))
+ {
+ cmSystemTools::ConvertToUnixSlashes(inc);
+ }
+
+ if(uniqueIncludes.insert(inc).second)
+ {
+ includes.push_back(*li);
+ }
+ }
+ }
+ return includes;
+}
+
+//----------------------------------------------------------------------------
void cmTarget::MaybeInvalidatePropertyCache(const char* prop)
{
// Wipe out maps caching information affected by this property.
@@ -2820,6 +2889,23 @@ const char *cmTarget::GetProperty(const char* prop,
}
}
}
+ if(strcmp(prop,"INCLUDE_DIRECTORIES") == 0)
+ {
+ this->Internal->IncludeDirectoriesString = "";
+ std::string sep;
+ typedef cmTargetInternals::IncludeDirectoriesEntry
+ IncludeDirectoriesEntry;
+ for (std::vector<IncludeDirectoriesEntry*>::const_iterator
+ it = this->Internal->IncludeDirectoriesEntries.begin(),
+ end = this->Internal->IncludeDirectoriesEntries.end();
+ it != end; ++it)
+ {
+ this->Internal->IncludeDirectoriesString += sep;
+ this->Internal->IncludeDirectoriesString += (*it)->ge->GetInput();
+ sep = ";";
+ }
+ return this->Internal->IncludeDirectoriesString.c_str();
+ }
}
if (strcmp(prop,"IMPORTED") == 0)
@@ -5086,6 +5172,13 @@ cmTargetInternalPointer
//----------------------------------------------------------------------------
cmTargetInternalPointer::~cmTargetInternalPointer()
{
+ for (std::vector<cmTargetInternals::IncludeDirectoriesEntry*>::const_iterator
+ it = this->Pointer->IncludeDirectoriesEntries.begin(),
+ end = this->Pointer->IncludeDirectoriesEntries.end();
+ it != end; ++it)
+ {
+ delete *it;
+ }
delete this->Pointer;
}
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 7c55933..60a105e 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -478,6 +478,8 @@ public:
/** @return the Mac framework directory without the base. */
std::string GetFrameworkDirectory(const char* config = 0);
+ std::vector<std::string> GetIncludeDirectories(const char *config);
+
private:
/**
* A list of direct dependencies. Use in conjunction with DependencyMap.
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=45ffd458313f92b646fc729d4e873c9189af7079
commit 45ffd458313f92b646fc729d4e873c9189af7079
Author: Stephen Kelly <steveire at gmail.com>
AuthorDate: Mon Nov 19 19:30:56 2012 +0100
Commit: Stephen Kelly <steveire at gmail.com>
CommitDate: Thu Nov 22 18:06:58 2012 +0100
Use cmsys::auto_ptr to manage cmCompiledGeneratorExpressions
The compiled generator expressions need to outlive the creating
type. For the same reason, store the input string in a std::string.
diff --git a/Source/cmCustomCommandGenerator.cxx b/Source/cmCustomCommandGenerator.cxx
index 07df7d5..f2f77ee 100644
--- a/Source/cmCustomCommandGenerator.cxx
+++ b/Source/cmCustomCommandGenerator.cxx
@@ -47,7 +47,7 @@ std::string cmCustomCommandGenerator::GetCommand(unsigned int c) const
{
return target->GetLocation(this->Config);
}
- return this->GE->Parse(argv0).Evaluate(this->Makefile, this->Config);
+ return this->GE->Parse(argv0)->Evaluate(this->Makefile, this->Config);
}
//----------------------------------------------------------------------------
@@ -58,7 +58,7 @@ cmCustomCommandGenerator
cmCustomCommandLine const& commandLine = this->CC.GetCommandLines()[c];
for(unsigned int j=1;j < commandLine.size(); ++j)
{
- std::string arg = this->GE->Parse(commandLine[j]).Evaluate(this->Makefile,
+ std::string arg = this->GE->Parse(commandLine[j])->Evaluate(this->Makefile,
this->Config);
cmd += " ";
if(this->OldStyle)
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
index 2bcced1..97a0581 100644
--- a/Source/cmGeneratorExpression.cxx
+++ b/Source/cmGeneratorExpression.cxx
@@ -25,44 +25,29 @@
//----------------------------------------------------------------------------
cmGeneratorExpression::cmGeneratorExpression(
cmListFileBacktrace const& backtrace):
- Backtrace(backtrace), CompiledExpression(0)
+ Backtrace(backtrace)
{
}
//----------------------------------------------------------------------------
-const cmCompiledGeneratorExpression &
+cmsys::auto_ptr<cmCompiledGeneratorExpression>
cmGeneratorExpression::Parse(std::string const& input)
{
return this->Parse(input.c_str());
}
//----------------------------------------------------------------------------
-const cmCompiledGeneratorExpression &
+cmsys::auto_ptr<cmCompiledGeneratorExpression>
cmGeneratorExpression::Parse(const char* input)
{
- cmGeneratorExpressionLexer l;
- std::vector<cmGeneratorExpressionToken> tokens = l.Tokenize(input);
- bool needsParsing = l.GetSawGeneratorExpression();
- std::vector<cmGeneratorExpressionEvaluator*> evaluators;
-
- if (needsParsing)
- {
- cmGeneratorExpressionParser p(tokens);
- p.Parse(evaluators);
- }
-
- delete this->CompiledExpression;
- this->CompiledExpression = new cmCompiledGeneratorExpression(
- this->Backtrace,
- evaluators,
- input,
- needsParsing);
- return *this->CompiledExpression;
+ return cmsys::auto_ptr<cmCompiledGeneratorExpression>(
+ new cmCompiledGeneratorExpression(
+ this->Backtrace,
+ input));
}
cmGeneratorExpression::~cmGeneratorExpression()
{
- delete this->CompiledExpression;
}
//----------------------------------------------------------------------------
@@ -73,7 +58,7 @@ const char *cmCompiledGeneratorExpression::Evaluate(
{
if (!this->NeedsParsing)
{
- return this->Input;
+ return this->Input.c_str();
}
this->Output = "";
@@ -108,12 +93,19 @@ const char *cmCompiledGeneratorExpression::Evaluate(
cmCompiledGeneratorExpression::cmCompiledGeneratorExpression(
cmListFileBacktrace const& backtrace,
- const std::vector<cmGeneratorExpressionEvaluator*> &evaluators,
- const char *input, bool needsParsing)
- : Backtrace(backtrace), Evaluators(evaluators), Input(input),
- NeedsParsing(needsParsing)
+ const char *input)
+ : Backtrace(backtrace), Input(input ? input : "")
{
+ cmGeneratorExpressionLexer l;
+ std::vector<cmGeneratorExpressionToken> tokens =
+ l.Tokenize(this->Input.c_str());
+ this->NeedsParsing = l.GetSawGeneratorExpression();
+ if (this->NeedsParsing)
+ {
+ cmGeneratorExpressionParser p(tokens);
+ p.Parse(this->Evaluators);
+ }
}
diff --git a/Source/cmGeneratorExpression.h b/Source/cmGeneratorExpression.h
index 5e3352b..c3daf84 100644
--- a/Source/cmGeneratorExpression.h
+++ b/Source/cmGeneratorExpression.h
@@ -14,10 +14,12 @@
#define cmGeneratorExpression_h
#include "cmStandardIncludes.h"
+#include "cmListFileCache.h"
#include <stack>
#include <cmsys/RegularExpression.hxx>
+#include <cmsys/auto_ptr.hxx>
class cmTarget;
class cmMakefile;
@@ -44,8 +46,9 @@ public:
cmGeneratorExpression(cmListFileBacktrace const& backtrace);
~cmGeneratorExpression();
- const cmCompiledGeneratorExpression& Parse(std::string const& input);
- const cmCompiledGeneratorExpression& Parse(const char* input);
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> Parse(
+ std::string const& input);
+ cmsys::auto_ptr<cmCompiledGeneratorExpression> Parse(const char* input);
enum PreprocessContext {
StripAllGeneratorExpressions,
@@ -62,7 +65,6 @@ private:
void operator=(const cmGeneratorExpression &);
cmListFileBacktrace const& Backtrace;
- cmCompiledGeneratorExpression *CompiledExpression;
};
class cmCompiledGeneratorExpression
@@ -79,20 +81,24 @@ public:
~cmCompiledGeneratorExpression();
+ std::string GetInput() const
+ {
+ return this->Input;
+ }
+
private:
cmCompiledGeneratorExpression(cmListFileBacktrace const& backtrace,
- const std::vector<cmGeneratorExpressionEvaluator*> &evaluators,
- const char *input, bool needsParsing);
+ const char *input);
friend class cmGeneratorExpression;
cmCompiledGeneratorExpression(const cmCompiledGeneratorExpression &);
void operator=(const cmCompiledGeneratorExpression &);
- cmListFileBacktrace const& Backtrace;
- const std::vector<cmGeneratorExpressionEvaluator*> Evaluators;
- const char* const Input;
- const bool NeedsParsing;
+ cmListFileBacktrace Backtrace;
+ std::vector<cmGeneratorExpressionEvaluator*> Evaluators;
+ const std::string Input;
+ bool NeedsParsing;
mutable std::set<cmTarget*> Targets;
mutable std::string Output;
diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx
index de8b5e3..55507dd 100644
--- a/Source/cmGeneratorTarget.cxx
+++ b/Source/cmGeneratorTarget.cxx
@@ -267,7 +267,7 @@ std::vector<std::string> cmGeneratorTarget::GetIncludeDirectories(
"INCLUDE_DIRECTORIES", 0, 0);
cmSystemTools::ExpandListArgument(ge.Parse(prop)
- .Evaluate(this->Makefile,
+ ->Evaluate(this->Makefile,
config,
false,
this->Target,
@@ -315,7 +315,7 @@ std::string cmGeneratorTarget::GetCompileDefinitions(const char *config)
cmGeneratorExpressionDAGChecker dagChecker(lfbt,
this->GetName(),
defPropName, 0, 0);
- return ge.Parse(prop).Evaluate(this->Makefile,
+ return ge.Parse(prop)->Evaluate(this->Makefile,
config,
false,
this->Target,
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 59b8f0a..0e83878 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -1732,9 +1732,10 @@ cmTargetTraceDependencies
for(cmCustomCommandLine::const_iterator cli = cit->begin();
cli != cit->end(); ++cli)
{
- const cmCompiledGeneratorExpression &cge = ge.Parse(*cli);
- cge.Evaluate(this->Makefile, 0, true);
- std::set<cmTarget*> geTargets = cge.GetTargets();
+ const cmsys::auto_ptr<cmCompiledGeneratorExpression> cge
+ = ge.Parse(*cli);
+ cge->Evaluate(this->Makefile, 0, true);
+ std::set<cmTarget*> geTargets = cge->GetTargets();
for(std::set<cmTarget*>::const_iterator it = geTargets.begin();
it != geTargets.end(); ++it)
{
@@ -4478,7 +4479,7 @@ void cmTarget::ComputeImportInfo(std::string const& desired_config,
this->GetName(),
"INTERFACE_LINK_LIBRARIES", 0, 0);
cmSystemTools::ExpandListArgument(ge.Parse(newStyleLibsProp)
- .Evaluate(this->Makefile,
+ ->Evaluate(this->Makefile,
desired_config.c_str(),
false,
this,
@@ -4666,7 +4667,7 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface)
this->GetName(),
"INTERFACE_LINK_LIBRARIES", 0, 0);
- cmSystemTools::ExpandListArgument(ge.Parse(newLibrariesProp).Evaluate(
+ cmSystemTools::ExpandListArgument(ge.Parse(newLibrariesProp)->Evaluate(
this->Makefile,
config,
false,
diff --git a/Source/cmTestGenerator.cxx b/Source/cmTestGenerator.cxx
index 2f650e7..42f511e 100644
--- a/Source/cmTestGenerator.cxx
+++ b/Source/cmTestGenerator.cxx
@@ -112,7 +112,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
else
{
// Use the command name given.
- exe = ge.Parse(exe.c_str()).Evaluate(mf, config);
+ exe = ge.Parse(exe.c_str())->Evaluate(mf, config);
cmSystemTools::ConvertToUnixSlashes(exe);
}
@@ -122,7 +122,7 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
for(std::vector<std::string>::const_iterator ci = command.begin()+1;
ci != command.end(); ++ci)
{
- os << " " << lg->EscapeForCMake(ge.Parse(*ci).Evaluate(mf, config));
+ os << " " << lg->EscapeForCMake(ge.Parse(*ci)->Evaluate(mf, config));
}
// Finish the test command.
-----------------------------------------------------------------------
Summary of changes:
Source/cmCustomCommandGenerator.cxx | 4 +-
Source/cmDocumentGeneratorExpressions.h | 1 +
Source/cmExportBuildFileGenerator.cxx | 6 +
Source/cmExportInstallFileGenerator.cxx | 8 +
Source/cmGeneratorExpression.cxx | 46 +++---
Source/cmGeneratorExpression.h | 24 ++-
Source/cmGeneratorExpressionEvaluator.cxx | 47 ++++++-
Source/cmGeneratorTarget.cxx | 42 +-----
Source/cmMakefile.cxx | 10 +-
Source/cmPolicies.cxx | 17 ++
Source/cmPolicies.h | 1 +
Source/cmTarget.cxx | 166 +++++++++++++++++++-
Source/cmTarget.h | 5 +
Source/cmTargetLinkLibrariesCommand.cxx | 50 ++++++-
Source/cmTestGenerator.cxx | 4 +-
.../target_link_libraries/CMakeLists.txt | 24 +++
Tests/CMakeCommands/target_link_libraries/depF.cpp | 7 +
Tests/CMakeCommands/target_link_libraries/depF.h | 7 +
.../target_link_libraries/targetC.cpp | 16 ++
.../TargetIncludeDirectories/CMakeLists.txt | 20 +++
.../RunCMake/PolicyCMP0019/PolicyWarn1-stderr.txt | 2 +-
.../RunCMake/PolicyCMP0019/PolicyWarn2-stderr.txt | 2 +-
.../RunCMake/PolicyCMP0019/PolicyWarn3-stderr.txt | 2 +-
23 files changed, 419 insertions(+), 92 deletions(-)
create mode 100644 Tests/CMakeCommands/target_link_libraries/depF.cpp
create mode 100644 Tests/CMakeCommands/target_link_libraries/depF.h
create mode 100644 Tests/CMakeCommands/target_link_libraries/targetC.cpp
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list