Browse Source

Genex: Report error if a target file is needed to evaluate link libraries.

Constructs such as

 target_link_libraries(foo $<$<STREQUAL:$<TARGET_FILE:foo>,foo.so>:bar>)

segfault before this patch.
Stephen Kelly 12 years ago
parent
commit
ff015ee11e

+ 8 - 1
Source/cmGeneratorExpressionEvaluator.cxx

@@ -1100,7 +1100,7 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
   std::string Evaluate(const std::vector<std::string> &parameters,
                        cmGeneratorExpressionContext *context,
                        const GeneratorExpressionContent *content,
-                       cmGeneratorExpressionDAGChecker *) const
+                       cmGeneratorExpressionDAGChecker *dagChecker) const
   {
     // Lookup the referenced target.
     std::string name = *parameters.begin();
@@ -1125,6 +1125,13 @@ struct TargetFilesystemArtifact : public cmGeneratorExpressionNode
                   "Target \"" + name + "\" is not an executable or library.");
       return std::string();
       }
+    if (dagChecker && dagChecker->EvaluatingLinkLibraries(name.c_str()))
+      {
+      ::reportError(context, content->GetOriginalExpression(),
+                    "Expressions which require the linker language may not "
+                    "be used while evaluating link libraries");
+      return std::string();
+      }
     context->DependTargets.insert(target);
     context->AllTargets.insert(target);
 

+ 2 - 0
Tests/RunCMake/Languages/RunCMakeTest.cmake

@@ -2,3 +2,5 @@ include(RunCMake)
 
 run_cmake(NoLangSHARED)
 run_cmake(LINK_LANGUAGE-genex)
+run_cmake(link-libraries-TARGET_FILE-genex)
+run_cmake(link-libraries-TARGET_FILE-genex-ok)

+ 1 - 0
Tests/RunCMake/Languages/link-libraries-TARGET_FILE-genex-ok-result.txt

@@ -0,0 +1 @@
+0

+ 6 - 0
Tests/RunCMake/Languages/link-libraries-TARGET_FILE-genex-ok.cmake

@@ -0,0 +1,6 @@
+
+enable_language(CXX)
+
+add_library(foo SHARED empty.cpp)
+add_library(bar SHARED empty.cpp)
+target_link_libraries(foo $<$<STREQUAL:$<TARGET_FILE:bar>,anything>:bar>)

+ 1 - 0
Tests/RunCMake/Languages/link-libraries-TARGET_FILE-genex-result.txt

@@ -0,0 +1 @@
+1

+ 7 - 0
Tests/RunCMake/Languages/link-libraries-TARGET_FILE-genex-stderr.txt

@@ -0,0 +1,7 @@
+CMake Error:
+  Error evaluating generator expression:
+
+    \$<TARGET_FILE:foo>
+
+  Expressions which require the linker language may not be used while
+  evaluating link libraries

+ 4 - 0
Tests/RunCMake/Languages/link-libraries-TARGET_FILE-genex.cmake

@@ -0,0 +1,4 @@
+
+add_library(foo SHARED empty.cpp)
+add_library(bar SHARED empty.cpp)
+target_link_libraries(foo $<$<STREQUAL:$<TARGET_FILE:foo>,anything>:bar>)