diff options
-rw-r--r-- | Source/cmComputeLinkInformation.cxx | 69 | ||||
-rw-r--r-- | Source/cmComputeLinkInformation.h | 3 | ||||
-rw-r--r-- | Source/cmOrderDirectories.cxx | 12 | ||||
-rw-r--r-- | Source/cmOrderDirectories.h | 2 |
4 files changed, 86 insertions, 0 deletions
diff --git a/Source/cmComputeLinkInformation.cxx b/Source/cmComputeLinkInformation.cxx index a824fe4..1dee2a2 100644 --- a/Source/cmComputeLinkInformation.cxx +++ b/Source/cmComputeLinkInformation.cxx @@ -552,6 +552,47 @@ bool cmComputeLinkInformation::Compute() return false; } + // Add implicit language runtime libraries and directories. + cmTarget::LinkClosure const* lc=this->Target->GetLinkClosure(this->Config); + for(std::vector<std::string>::const_iterator li = lc->Languages.begin(); + li != lc->Languages.end(); ++li) + { + // Skip those of the linker language. They are implicit. + if(*li != this->LinkLanguage) + { + // Add libraries for this language that are not implied by the + // linker language. + std::string libVar = "CMAKE_"; + libVar += *li; + libVar += "_IMPLICIT_LINK_LIBRARIES"; + if(const char* libs = this->Makefile->GetDefinition(libVar.c_str())) + { + std::vector<std::string> libsVec; + cmSystemTools::ExpandListArgument(libs, libsVec); + for(std::vector<std::string>::const_iterator i = libsVec.begin(); + i != libsVec.end(); ++i) + { + if(this->ImplicitLinkLibs.find(*i) == this->ImplicitLinkLibs.end()) + { + this->AddItem(i->c_str(), 0); + } + } + } + + // Add linker search paths for this language that are not + // implied by the linker language. + std::string dirVar = "CMAKE_"; + dirVar += *li; + dirVar += "_IMPLICIT_LINK_DIRECTORIES"; + if(const char* dirs = this->Makefile->GetDefinition(dirVar.c_str())) + { + std::vector<std::string> dirsVec; + cmSystemTools::ExpandListArgument(dirs, dirsVec); + this->OrderLinkerSearchPath->AddLanguageDirectories(dirsVec); + } + } + } + return true; } @@ -1551,12 +1592,40 @@ void cmComputeLinkInformation::LoadImplicitLinkInfo() cmSystemTools::ExpandListArgument(implicitLinks, implicitDirVec); } + // Get language-specific implicit directories. + std::string implicitDirVar = "CMAKE_"; + implicitDirVar += this->LinkLanguage; + implicitDirVar += "_IMPLICIT_LINK_DIRECTORIES"; + if(const char* implicitDirs = + this->Makefile->GetDefinition(implicitDirVar.c_str())) + { + cmSystemTools::ExpandListArgument(implicitDirs, implicitDirVec); + } + // Store implicit link directories. for(std::vector<std::string>::const_iterator i = implicitDirVec.begin(); i != implicitDirVec.end(); ++i) { this->ImplicitLinkDirs.insert(*i); } + + // Get language-specific implicit libraries. + std::vector<std::string> implicitLibVec; + std::string implicitLibVar = "CMAKE_"; + implicitLibVar += this->LinkLanguage; + implicitLibVar += "_IMPLICIT_LINK_LIBRARIES"; + if(const char* implicitLibs = + this->Makefile->GetDefinition(implicitLibVar.c_str())) + { + cmSystemTools::ExpandListArgument(implicitLibs, implicitLibVec); + } + + // Store implicit link libraries. + for(std::vector<std::string>::const_iterator i = implicitLibVec.begin(); + i != implicitLibVec.end(); ++i) + { + this->ImplicitLinkLibs.insert(*i); + } } //---------------------------------------------------------------------------- diff --git a/Source/cmComputeLinkInformation.h b/Source/cmComputeLinkInformation.h index d7821c6..1fafc13 100644 --- a/Source/cmComputeLinkInformation.h +++ b/Source/cmComputeLinkInformation.h @@ -160,8 +160,11 @@ private: cmOrderDirectories* OrderLinkerSearchPath; bool FinishLinkerSearchDirectories(); void PrintLinkPolicyDiagnosis(std::ostream&); + + // Implicit link libraries and directories for linker language. void LoadImplicitLinkInfo(); std::set<cmStdString> ImplicitLinkDirs; + std::set<cmStdString> ImplicitLinkLibs; // Linker search path compatibility mode. std::set<cmStdString> OldLinkDirMask; diff --git a/Source/cmOrderDirectories.cxx b/Source/cmOrderDirectories.cxx index f95c68a..fd5765d 100644 --- a/Source/cmOrderDirectories.cxx +++ b/Source/cmOrderDirectories.cxx @@ -372,6 +372,15 @@ cmOrderDirectories //---------------------------------------------------------------------------- void cmOrderDirectories +::AddLanguageDirectories(std::vector<std::string> const& dirs) +{ + this->LanguageDirectories.insert(this->LanguageDirectories.end(), + dirs.begin(), dirs.end()); +} + +//---------------------------------------------------------------------------- +void +cmOrderDirectories ::SetImplicitDirectories(std::set<cmStdString> const& implicitDirs) { this->ImplicitDirectories = implicitDirs; @@ -400,6 +409,9 @@ void cmOrderDirectories::CollectOriginalDirectories() { this->ConstraintEntries[i]->AddDirectory(); } + + // Add language runtime directories last. + this->AddOriginalDirectories(this->LanguageDirectories); } //---------------------------------------------------------------------------- diff --git a/Source/cmOrderDirectories.h b/Source/cmOrderDirectories.h index 6d05f93..8091a99 100644 --- a/Source/cmOrderDirectories.h +++ b/Source/cmOrderDirectories.h @@ -38,6 +38,7 @@ public: void AddRuntimeLibrary(std::string const& fullPath, const char* soname = 0); void AddLinkLibrary(std::string const& fullPath); void AddUserDirectories(std::vector<std::string> const& extra); + void AddLanguageDirectories(std::vector<std::string> const& dirs); void SetImplicitDirectories(std::set<cmStdString> const& implicitDirs); void SetLinkExtensionInfo(std::vector<std::string> const& linkExtensions, std::string const& removeExtRegex); @@ -56,6 +57,7 @@ private: std::vector<cmOrderDirectoriesConstraint*> ConstraintEntries; std::vector<cmOrderDirectoriesConstraint*> ImplicitDirEntries; std::vector<std::string> UserDirectories; + std::vector<std::string> LanguageDirectories; cmsys::RegularExpression RemoveLibraryExtension; std::vector<std::string> LinkExtensions; std::set<cmStdString> ImplicitDirectories; |