[Cmake-commits] [cmake-commits] king committed cmComputeLinkInformation.cxx 1.51 1.52 cmComputeLinkInformation.h 1.23 1.24 cmOrderDirectories.cxx 1.9 1.10 cmOrderDirectories.h 1.4 1.5

cmake-commits at cmake.org cmake-commits at cmake.org
Mon Jul 27 12:43:19 EDT 2009


Update of /cvsroot/CMake/CMake/Source
In directory public:/mounts/ram/cvs-serv32332/Source

Modified Files:
	cmComputeLinkInformation.cxx cmComputeLinkInformation.h 
	cmOrderDirectories.cxx cmOrderDirectories.h 
Log Message:
ENH: Link runtime libraries of all languages

This adds implicit libraries and search directories for languages linked
into a target other than the linker language to its link line.  For
example, when linking an executable containing both C++ and Fortran code
the C++ linker is used but we need to add the Fortran libraries.

The variables

  CMAKE_<LANG>_IMPLICIT_LINK_LIBRARIES
  CMAKE_<LANG>_IMPLICIT_LINK_DIRECTORIES

contain the implicit libraries and directories for each language.
Entries for the linker language are known to be implicit in the
generated link line.  Entries for other languages that do not appear in
the known implicit set are listed explicitly at the end of the link
line.


Index: cmComputeLinkInformation.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmComputeLinkInformation.cxx,v
retrieving revision 1.51
retrieving revision 1.52
diff -C 2 -d -r1.51 -r1.52
*** cmComputeLinkInformation.cxx	14 Jul 2009 14:14:52 -0000	1.51
--- cmComputeLinkInformation.cxx	27 Jul 2009 16:43:16 -0000	1.52
***************
*** 553,556 ****
--- 553,597 ----
      }
  
+   // 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;
  }
***************
*** 1552,1555 ****
--- 1593,1606 ----
      }
  
+   // 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();
***************
*** 1558,1561 ****
--- 1609,1630 ----
      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);
+     }
  }
  

Index: cmComputeLinkInformation.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmComputeLinkInformation.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -C 2 -d -r1.23 -r1.24
*** cmComputeLinkInformation.h	14 Jul 2009 14:14:52 -0000	1.23
--- cmComputeLinkInformation.h	27 Jul 2009 16:43:16 -0000	1.24
***************
*** 161,166 ****
--- 161,169 ----
    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.

Index: cmOrderDirectories.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmOrderDirectories.cxx,v
retrieving revision 1.9
retrieving revision 1.10
diff -C 2 -d -r1.9 -r1.10
*** cmOrderDirectories.cxx	14 Jul 2009 14:14:41 -0000	1.9
--- cmOrderDirectories.cxx	27 Jul 2009 16:43:16 -0000	1.10
***************
*** 373,376 ****
--- 373,385 ----
  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)
  {
***************
*** 401,404 ****
--- 410,416 ----
      this->ConstraintEntries[i]->AddDirectory();
      }
+ 
+   // Add language runtime directories last.
+   this->AddOriginalDirectories(this->LanguageDirectories);
  }
  

Index: cmOrderDirectories.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmOrderDirectories.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -C 2 -d -r1.4 -r1.5
*** cmOrderDirectories.h	14 Jul 2009 14:14:41 -0000	1.4
--- cmOrderDirectories.h	27 Jul 2009 16:43:17 -0000	1.5
***************
*** 39,42 ****
--- 39,43 ----
    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,
***************
*** 57,60 ****
--- 58,62 ----
    std::vector<cmOrderDirectoriesConstraint*> ImplicitDirEntries;
    std::vector<std::string> UserDirectories;
+   std::vector<std::string> LanguageDirectories;
    cmsys::RegularExpression RemoveLibraryExtension;
    std::vector<std::string> LinkExtensions;



More information about the Cmake-commits mailing list