From ab9c677232902ff966294672ab252a119265638c Mon Sep 17 00:00:00 2001 From: Sebastien Barre Date: Fri, 14 Jun 2002 10:37:59 -0400 Subject: [PATCH] ENH: FindLibrary can now use the makefile to add some compiler-specific lib search path (depending on the generator). --- Source/cmFindLibraryCommand.cxx | 3 ++- Source/cmSystemTools.cxx | 44 ++++++++++++++++++++++++++++++++- Source/cmSystemTools.h | 5 +++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/Source/cmFindLibraryCommand.cxx b/Source/cmFindLibraryCommand.cxx index 5bd68de60..0643ac683 100644 --- a/Source/cmFindLibraryCommand.cxx +++ b/Source/cmFindLibraryCommand.cxx @@ -127,7 +127,8 @@ bool cmFindLibraryCommand::InitialPass(std::vector 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(), diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 6db6e7a54..4b6959761 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -21,6 +21,7 @@ #include "cmRegularExpression.h" #include #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& userPaths) + const std::vector& 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 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::const_iterator p = path.begin(); p != path.end(); ++p) diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 8024617b8..623a6ed78 100644 --- a/Source/cmSystemTools.h +++ b/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& path); + const std::vector& path, + const cmMakefile *makefile = 0); ///! return true if the file is a directory. static bool FileIsDirectory(const char* name);