Browse Source

cmTarget: Fix diagnostic of target_link_libraries in wrong directory (#15626)

Since commit v3.3.0-rc1~62^2~5 (cmTarget: Store only cmListFileContext
for CMP0023 handling, 2015-05-18) a call to target_link_libraries on a
target that was defined in another (non-ancestor) directory crashes
because no execution context is left active.  Fix this by getting the
execution context from the actual cmMakefile where the current
target_link_libraries call takes place.  Test this by verifying that
such calls correctly produce an error diagnostic instead of crashing.
Brad King 10 years ago
parent
commit
30c2e1dd16

+ 2 - 2
Source/cmTarget.cxx

@@ -1231,7 +1231,8 @@ static std::string targetNameGenex(const std::string& lib)
 }
 
 //----------------------------------------------------------------------------
-bool cmTarget::PushTLLCommandTrace(TLLSignature signature)
+bool cmTarget::PushTLLCommandTrace(TLLSignature signature,
+                                   cmListFileContext const& lfc)
 {
   bool ret = true;
   if (!this->TLLCommands.empty())
@@ -1241,7 +1242,6 @@ bool cmTarget::PushTLLCommandTrace(TLLSignature signature)
       ret = false;
       }
     }
-  cmListFileContext lfc = this->Makefile->GetExecutionContext();
   if (this->TLLCommands.empty() || this->TLLCommands.back().second != lfc)
     {
     this->TLLCommands.push_back(std::make_pair(signature, lfc));

+ 2 - 1
Source/cmTarget.h

@@ -207,7 +207,8 @@ public:
     KeywordTLLSignature,
     PlainTLLSignature
   };
-  bool PushTLLCommandTrace(TLLSignature signature);
+  bool PushTLLCommandTrace(TLLSignature signature,
+                           cmListFileContext const& lfc);
   void GetTllSignatureTraces(std::ostringstream &s, TLLSignature sig) const;
 
   void MergeLinkLibraries( cmMakefile& mf, const std::string& selfname,

+ 2 - 1
Source/cmTargetLinkLibrariesCommand.cxx

@@ -368,7 +368,8 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const std::string& lib,
       || this->CurrentProcessingState == ProcessingKeywordPublicInterface
       || this->CurrentProcessingState == ProcessingKeywordLinkInterface)
         ? cmTarget::KeywordTLLSignature : cmTarget::PlainTLLSignature;
-  if (!this->Target->PushTLLCommandTrace(sig))
+  if (!this->Target->PushTLLCommandTrace(
+        sig, this->Makefile->GetExecutionContext()))
     {
     std::ostringstream e;
     const char *modal = 0;

+ 1 - 0
Tests/RunCMake/target_link_libraries/RunCMakeTest.cmake

@@ -6,3 +6,4 @@ run_cmake(CMP0023-WARN-2)
 run_cmake(CMP0023-NEW-2)
 run_cmake(MixedSignature)
 run_cmake(Separate-PRIVATE-LINK_PRIVATE-uses)
+run_cmake(SubDirTarget)

+ 1 - 0
Tests/RunCMake/target_link_libraries/SubDirTarget-result.txt

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

+ 5 - 0
Tests/RunCMake/target_link_libraries/SubDirTarget-stderr.txt

@@ -0,0 +1,5 @@
+^CMake Error at SubDirTarget.cmake:[0-9]+ \(target_link_libraries\):
+  Attempt to add link library "m" to target "subexe" which is not built in
+  this directory.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$

+ 3 - 0
Tests/RunCMake/target_link_libraries/SubDirTarget.cmake

@@ -0,0 +1,3 @@
+enable_language(C)
+add_subdirectory(SubDirTarget)
+target_link_libraries(subexe m)

+ 1 - 0
Tests/RunCMake/target_link_libraries/SubDirTarget/CMakeLists.txt

@@ -0,0 +1 @@
+add_executable(subexe ../empty.c)

+ 0 - 0
Tests/RunCMake/target_link_libraries/empty.c