[Cmake-commits] [cmake-commits] king committed cmComputeLinkInformation.cxx 1.40 1.41 cmOrderDirectories.cxx 1.6 1.7 cmOrderDirectories.h 1.2 1.3

cmake-commits at cmake.org cmake-commits at cmake.org
Tue Jul 29 14:57:03 EDT 2008


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

Modified Files:
	cmComputeLinkInformation.cxx cmOrderDirectories.cxx 
	cmOrderDirectories.h 
Log Message:
ENH: Warn when system libraries may be hidden.

We never explicitly specify system library directories in linker or
runtime search paths.  Furthermore, libraries in these directories are
always linked by asking the linker to search for them.  We need to
generate a warning when explicitly specified search directories contain
files that may hide the system libraries during the search.


Index: cmComputeLinkInformation.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmComputeLinkInformation.cxx,v
retrieving revision 1.40
retrieving revision 1.41
diff -C 2 -d -r1.40 -r1.41
*** cmComputeLinkInformation.cxx	29 Jul 2008 18:01:04 -0000	1.40
--- cmComputeLinkInformation.cxx	29 Jul 2008 18:57:00 -0000	1.41
***************
*** 1132,1135 ****
--- 1132,1139 ----
    // library for the architecture at link time.
    this->AddUserItem(file, false);
+ 
+   // Make sure the link directory ordering will find the library.
+   this->OrderLinkerSearchPath->AddLinkLibrary(item);
+ 
    return true;
  }

Index: cmOrderDirectories.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmOrderDirectories.cxx,v
retrieving revision 1.6
retrieving revision 1.7
diff -C 2 -d -r1.6 -r1.7
*** cmOrderDirectories.cxx	29 Jul 2008 18:01:04 -0000	1.6
--- cmOrderDirectories.cxx	29 Jul 2008 18:57:00 -0000	1.7
***************
*** 70,73 ****
--- 70,96 ----
        }
      }
+ 
+   void FindImplicitConflicts(cmOStringStream& w)
+     {
+     bool first = true;
+     for(unsigned int i=0; i < this->OD->OriginalDirectories.size(); ++i)
+       {
+       // Check if this directory conflicts with the entry.
+       std::string const& dir = this->OD->OriginalDirectories[i];
+       if(dir != this->Directory && this->FindConflict(dir))
+         {
+         // The library will be found in this directory but it is
+         // supposed to be found in an implicit search directory.
+         if(first)
+           {
+           first = false;
+           w << "  ";
+           this->Report(w);
+           w << " in " << this->Directory << " may be hidden by files in:\n";
+           }
+         w << "    " << dir << "\n";
+         }
+       }
+     }
  protected:
    virtual bool FindConflict(std::string const& dir) = 0;
***************
*** 259,262 ****
--- 282,291 ----
      delete *i;
      }
+   for(std::vector<cmOrderDirectoriesConstraint*>::iterator
+         i = this->ImplicitDirEntries.begin();
+       i != this->ImplicitDirEntries.end(); ++i)
+     {
+     delete *i;
+     }
  }
  
***************
*** 281,285 ****
    if(this->EmmittedConstraintSOName.insert(fullPath).second)
      {
!     // Avoid dealing with implicit directories.
      if(!this->ImplicitDirectories.empty())
        {
--- 310,314 ----
    if(this->EmmittedConstraintSOName.insert(fullPath).second)
      {
!     // Implicit link directories need special handling.
      if(!this->ImplicitDirectories.empty())
        {
***************
*** 288,291 ****
--- 317,322 ----
           this->ImplicitDirectories.end())
          {
+         this->ImplicitDirEntries.push_back(
+           new cmOrderDirectoriesConstraintSOName(this, fullPath, soname));
          return;
          }
***************
*** 314,318 ****
    if(this->EmmittedConstraintLibrary.insert(fullPath).second)
      {
!     // Avoid dealing with implicit directories.
      if(!this->ImplicitDirectories.empty())
        {
--- 345,349 ----
    if(this->EmmittedConstraintLibrary.insert(fullPath).second)
      {
!     // Implicit link directories need special handling.
      if(!this->ImplicitDirectories.empty())
        {
***************
*** 321,324 ****
--- 352,357 ----
           this->ImplicitDirectories.end())
          {
+         this->ImplicitDirEntries.push_back(
+           new cmOrderDirectoriesConstraintLibrary(this, fullPath));
          return;
          }
***************
*** 368,372 ****
        di != this->UserDirectories.end(); ++di)
      {
!     // Avoid dealing with implicit directories.
      if(this->ImplicitDirectories.find(*di) !=
         this->ImplicitDirectories.end())
--- 401,405 ----
        di != this->UserDirectories.end(); ++di)
      {
!     // We never explicitly specify implicit link directories.
      if(this->ImplicitDirectories.find(*di) !=
         this->ImplicitDirectories.end())
***************
*** 451,454 ****
--- 484,520 ----
      i->erase(last, i->end());
      }
+ 
+   // Check items in implicit link directories.
+   this->FindImplicitConflicts();
+ }
+ 
+ //----------------------------------------------------------------------------
+ void cmOrderDirectories::FindImplicitConflicts()
+ {
+   // Check for items in implicit link directories that have conflicts
+   // in the explicit directories.
+   cmOStringStream conflicts;
+   for(unsigned int i=0; i < this->ImplicitDirEntries.size(); ++i)
+     {
+     this->ImplicitDirEntries[i]->FindImplicitConflicts(conflicts);
+     }
+ 
+   // Skip warning if there were no conflicts.
+   std::string text = conflicts.str();
+   if(text.empty())
+     {
+     return;
+     }
+ 
+   // Warn about the conflicts.
+   cmOStringStream w;
+   w << "Cannot generate a safe " << this->Purpose
+     << " for target " << this->Target->GetName()
+     << " because files in some directories may conflict with "
+     << " libraries in implicit directories:\n"
+     << text
+     << "Some of these libraries may not be found correctly.";
+   this->GlobalGenerator->GetCMakeInstance()
+     ->IssueMessage(cmake::WARNING, w.str(), this->Target->GetBacktrace());
  }
  

Index: cmOrderDirectories.h
===================================================================
RCS file: /cvsroot/CMake/CMake/Source/cmOrderDirectories.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -C 2 -d -r1.2 -r1.3
*** cmOrderDirectories.h	29 Jul 2008 18:01:04 -0000	1.2
--- cmOrderDirectories.h	29 Jul 2008 18:57:00 -0000	1.3
***************
*** 55,58 ****
--- 55,59 ----
    bool OrderedDirectoriesComputed;
    std::vector<cmOrderDirectoriesConstraint*> ConstraintEntries;
+   std::vector<cmOrderDirectoriesConstraint*> ImplicitDirEntries;
    std::vector<std::string> UserDirectories;
    cmsys::RegularExpression RemoveLibraryExtension;
***************
*** 67,70 ****
--- 68,72 ----
    int AddOriginalDirectory(std::string const& dir);
    void FindConflicts();
+   void FindImplicitConflicts();
    void OrderDirectories();
    void VisitDirectory(unsigned int i);



More information about the Cmake-commits mailing list