ソースを参照

ENH: FindLibrary can now use the makefile to add some compiler-specific lib search path (depending on the generator).

Sebastien Barre 23 年 前
コミット
ab9c677232
3 ファイル変更49 行追加3 行削除
  1. 2 1
      Source/cmFindLibraryCommand.cxx
  2. 43 1
      Source/cmSystemTools.cxx
  3. 4 1
      Source/cmSystemTools.h

+ 2 - 1
Source/cmFindLibraryCommand.cxx

@@ -127,7 +127,8 @@ bool cmFindLibraryCommand::InitialPass(std::vector<std::string> const& argsIn)
       i != names.end() ; ++i)
     {
     library = cmSystemTools::FindLibrary(i->c_str(),
-                                         path);
+                                         path,
+                                         m_Makefile);
     if(library != "")
       {  
       m_Makefile->AddCacheDefinition(args[0].c_str(),

+ 43 - 1
Source/cmSystemTools.cxx

@@ -21,6 +21,7 @@
 #include "cmRegularExpression.h"
 #include <ctype.h>
 #include "cmDirectory.h"
+#include "cmMakefile.h"
 
 // support for realpath call
 #ifndef _WIN32
@@ -1547,7 +1548,8 @@ std::string cmSystemTools::FindProgram(const char* name,
  * found.  Otherwise, the empty string is returned.
  */
 std::string cmSystemTools::FindLibrary(const char* name,
-				       const std::vector<std::string>& userPaths)
+                                       const std::vector<std::string>& userPaths,
+                                       const cmMakefile *makefile)
 {
   // See if the executable exists as written.
   if(cmSystemTools::FileExists(name))
@@ -1558,6 +1560,46 @@ std::string cmSystemTools::FindLibrary(const char* name,
   // Add the system search path to our path.
   std::vector<std::string> path = userPaths;
   cmSystemTools::GetPath(path);
+
+  // Add some lib directories specific to compilers, depending on the
+  // current generator, so that library that might have been stored here
+  // can be found too.
+  // i.e. Microsoft Visual Studio or .Net: path to compiler/../Lib
+  //      Borland: path to compiler/../Lib
+  if (makefile)
+    {
+    const char* genName = makefile->GetDefinition("CMAKE_GENERATOR");
+    if (genName)
+      {
+      if (!strcmp(genName, "NMake Makefiles") ||
+          !strncmp(genName, "Visual Studio ", 14))
+        {
+        const char* compiler = makefile->GetDefinition("CMAKE_CXX_COMPILER");
+        if (compiler)
+          {
+          std::string compiler_path = cmSystemTools::FindProgram(compiler);
+          if (compiler_path.size())
+            {
+            std::string lib_path = 
+              cmSystemTools::GetFilenamePath(
+                cmSystemTools::GetFilenamePath(compiler_path)) + "/Lib";
+            path.push_back(lib_path);
+            }
+          }
+        }
+      else if (!strcmp(genName, "Borland Makefiles"))
+        {
+        const char* bcb_bin_path = makefile->GetDefinition("BCB_BIN_PATH");
+        if (bcb_bin_path)
+          {
+          std::string lib_path = 
+            cmSystemTools::GetFilenamePath(bcb_bin_path) + "/Lib";
+          path.push_back(lib_path);
+          }
+        }
+      }
+    }
+  
   std::string tryPath;
   for(std::vector<std::string>::const_iterator p = path.begin();
       p != path.end(); ++p)

+ 4 - 1
Source/cmSystemTools.h

@@ -19,6 +19,8 @@
 
 #include "cmStandardIncludes.h"
 
+class cmMakefile;
+
 /** \class cmSystemTools
  * \brief A collection of useful functions for CMake.
  *
@@ -225,7 +227,8 @@ public:
 
   ///! Find a library in the system PATH, with optional extra paths.
   static std::string FindLibrary(const char* name,
-				 const std::vector<std::string>& path);
+                                 const std::vector<std::string>& path,
+                                 const cmMakefile *makefile = 0);
 
   ///! return true if the file is a directory.
   static bool FileIsDirectory(const char* name);