From 3652a8e913eab6befcbdc74cbd985763ed27db33 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 31 Mar 2008 12:47:31 -0400 Subject: [PATCH] BUG: Fix bug 6605 more completely - CMake 2.4 added link directories for targets linked in the optimized configuration even when building debug - Old behavior for policy CMP0003 must account for this --- Source/cmComputeLinkDepends.cxx | 37 +++++++++++++++++++++++++++++ Source/cmComputeLinkDepends.h | 9 +++++++ Source/cmComputeLinkInformation.cxx | 20 ++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/Source/cmComputeLinkDepends.cxx b/Source/cmComputeLinkDepends.cxx index 5005e962c..e232525a2 100644 --- a/Source/cmComputeLinkDepends.cxx +++ b/Source/cmComputeLinkDepends.cxx @@ -169,6 +169,9 @@ cmComputeLinkDepends // Enable debug mode if requested. this->DebugMode = this->Makefile->IsOn("CMAKE_LINK_DEPENDS_DEBUG_MODE"); + + // Assume no compatibility until set. + this->OldLinkDirMode = false; } //---------------------------------------------------------------------------- @@ -182,6 +185,12 @@ cmComputeLinkDepends::~cmComputeLinkDepends() } } +//---------------------------------------------------------------------------- +void cmComputeLinkDepends::SetOldLinkDirMode(bool b) +{ + this->OldLinkDirMode = b; +} + //---------------------------------------------------------------------------- std::vector const& cmComputeLinkDepends::Compute() @@ -460,6 +469,10 @@ void cmComputeLinkDepends::AddVarLinkEntries(int depender_index, { actual_libs.push_back(*di); } + else if(this->OldLinkDirMode) + { + this->CheckWrongConfigItem(*di); + } // Reset the link type until another explicit type is given. llt = cmTarget::GENERAL; @@ -492,6 +505,10 @@ cmComputeLinkDepends::AddTargetLinkEntries(int depender_index, { actual_libs.push_back(li->first); } + else if(this->OldLinkDirMode) + { + this->CheckWrongConfigItem(li->first); + } } // Add these entries. @@ -809,3 +826,23 @@ void cmComputeLinkDepends::DisplayFinalEntries() } fprintf(stderr, "\n"); } + +//---------------------------------------------------------------------------- +void cmComputeLinkDepends::CheckWrongConfigItem(std::string const& item) +{ + if(!this->OldLinkDirMode) + { + return; + } + + // For CMake 2.4 bug-compatibility we need to consider the output + // directories of targets linked in another configuration as link + // directories. + if(cmTarget* tgt = this->Makefile->FindTargetToUse(item.c_str())) + { + if(!tgt->IsImported()) + { + this->OldWrongConfigItems.insert(tgt); + } + } +} diff --git a/Source/cmComputeLinkDepends.h b/Source/cmComputeLinkDepends.h index de85fa0ff..49e8d6b4b 100644 --- a/Source/cmComputeLinkDepends.h +++ b/Source/cmComputeLinkDepends.h @@ -54,6 +54,10 @@ public: typedef std::vector EntryVector; EntryVector const& Compute(); + void SetOldLinkDirMode(bool b); + std::set const& GetOldWrongConfigItems() const + { return this->OldWrongConfigItems; } + private: // Context information. @@ -128,6 +132,11 @@ private: void VisitComponent(cmComputeComponentGraph const& ccg, unsigned int i); void EmitComponent(NodeList const& nl); void DisplayFinalEntries(); + + // Compatibility help. + bool OldLinkDirMode; + void CheckWrongConfigItem(std::string const& item); + std::set OldWrongConfigItems; }; #endif diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index 82db1d3e2..fc9bf4743 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -510,6 +510,7 @@ bool cmComputeLinkInformation::Compute() // Compute the ordered link line items. cmComputeLinkDepends cld(this->Target, this->Config); + cld.SetOldLinkDirMode(this->OldLinkDirMode); cmComputeLinkDepends::EntryVector const& linkEntries = cld.Compute(); // Add the link line items. @@ -539,6 +540,25 @@ bool cmComputeLinkInformation::Compute() this->SetCurrentLinkType(this->StartLinkType); } + // Finish listing compatibility paths. + if(this->OldLinkDirMode) + { + // For CMake 2.4 bug-compatibility we need to consider the output + // directories of targets linked in another configuration as link + // directories. + std::set const& wrongItems = cld.GetOldWrongConfigItems(); + for(std::set::const_iterator i = wrongItems.begin(); + i != wrongItems.end(); ++i) + { + cmTarget* tgt = *i; + bool implib = + (this->UseImportLibrary && + (tgt->GetType() == cmTarget::SHARED_LIBRARY)); + std::string lib = tgt->GetFullPath(this->Config , implib, true); + this->OldLinkDirItems.push_back(lib); + } + } + // Finish setting up linker search directories. if(!this->FinishLinkerSearchDirectories()) {