ENH: Improved support for user-configured search paths. Paths given in the CMAKE_LIBRARY_PATH cmake variable are searched first, then those in the CMAKE_LIBRARY_PATH environment variable, then those listed in the call to the FIND_LIBRARY command and finally those listed in the PATH environment variable. The support is similar for finding include files with FIND_PATH, but the variable is CMAKE_INCLUDE_PATH.
This commit is contained in:
parent
f4b306d5d4
commit
938890757a
|
@ -60,20 +60,18 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// if it is not in the cache, then search the system path
|
|
||||||
std::vector<std::string> path;
|
|
||||||
|
|
||||||
// add any user specified paths
|
// The location is not in the cache. Create a search path.
|
||||||
|
std::vector<std::string> path;
|
||||||
|
std::vector<std::string> callPaths;
|
||||||
for (unsigned int j = 2; j < args.size(); j++)
|
for (unsigned int j = 2; j < args.size(); j++)
|
||||||
{
|
{
|
||||||
// Glob the entry in case of wildcards.
|
// Glob the entry in case of wildcards.
|
||||||
cmSystemTools::GlobDirs(args[j].c_str(), path);
|
cmSystemTools::GlobDirs(args[j].c_str(), callPaths);
|
||||||
}
|
}
|
||||||
|
m_Makefile->GetLibrarySearchPath(callPaths, path);
|
||||||
|
|
||||||
cmSystemTools::GetPath(path, "CMAKE_LIBRARY_PATH");
|
// Use the search path to find the file.
|
||||||
|
|
||||||
// add the standard path
|
|
||||||
cmSystemTools::GetPath(path);
|
|
||||||
for(unsigned int k=0; k < path.size(); k++)
|
for(unsigned int k=0; k < path.size(); k++)
|
||||||
{
|
{
|
||||||
std::string tryPath = path[k];
|
std::string tryPath = path[k];
|
||||||
|
|
|
@ -72,8 +72,7 @@ public:
|
||||||
" [PATHS path1 path2 ...]\n"
|
" [PATHS path1 path2 ...]\n"
|
||||||
" [DOC \"docstring\"])\n"
|
" [DOC \"docstring\"])\n"
|
||||||
"Find a library named by one of the names given after the NAMES "
|
"Find a library named by one of the names given after the NAMES "
|
||||||
"argument. Paths specified after the PATHS argument are searched "
|
"argument. A cache entry named by <VAR> is created "
|
||||||
"in the order specified. A cache entry named by <VAR> is created "
|
|
||||||
"to store the result. If the library is not found, the result "
|
"to store the result. If the library is not found, the result "
|
||||||
"will be <VAR>-NOTFOUND. If DOC is specified then the next "
|
"will be <VAR>-NOTFOUND. If DOC is specified then the next "
|
||||||
"argument is treated as a documentation string for the cache "
|
"argument is treated as a documentation string for the cache "
|
||||||
|
@ -81,8 +80,12 @@ public:
|
||||||
" FIND_LIBRARY(VAR libraryName [path1 path2 ...])\n"
|
" FIND_LIBRARY(VAR libraryName [path1 path2 ...])\n"
|
||||||
"Find a library with the given name by searching in the specified "
|
"Find a library with the given name by searching in the specified "
|
||||||
"paths. This is a short-hand signature for the command that is "
|
"paths. This is a short-hand signature for the command that is "
|
||||||
"sufficient in many cases. The environment variable CMAKE_LIBRARY_PATH "
|
"sufficient in many cases. "
|
||||||
"is searched as well as the PATH variable.\n";
|
"The search proceeds first in paths listed in the CMAKE_LIBRARY_PATH "
|
||||||
|
"CMake variable (which is generally set by the user on the command line), "
|
||||||
|
"then in paths listed in the CMAKE_LIBRARY_PATH environment variable, "
|
||||||
|
"then in paths given to the PATHS option of the command, "
|
||||||
|
"and finally in paths listed in the PATH environment variable.";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmFindLibraryCommand, cmCommand);
|
cmTypeMacro(cmFindLibraryCommand, cmCommand);
|
||||||
|
|
|
@ -64,20 +64,22 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
|
||||||
helpString = hs?hs:"(none)";
|
helpString = hs?hs:"(none)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Construct a search path.
|
||||||
std::vector<std::string> path;
|
std::vector<std::string> path;
|
||||||
// add any user specified paths
|
std::vector<std::string> callPaths;
|
||||||
for (unsigned int j = 2; j < args.size(); j++)
|
for (unsigned int j = 2; j < args.size(); j++)
|
||||||
{
|
{
|
||||||
// expand variables
|
// expand variables
|
||||||
std::string exp = args[j];
|
std::string exp = args[j];
|
||||||
cmSystemTools::ExpandRegistryValues(exp);
|
cmSystemTools::ExpandRegistryValues(exp);
|
||||||
|
|
||||||
// Glob the entry in case of wildcards.
|
// Glob the entry in case of wildcards.
|
||||||
cmSystemTools::GlobDirs(exp.c_str(), path);
|
cmSystemTools::GlobDirs(exp.c_str(), callPaths);
|
||||||
}
|
}
|
||||||
cmSystemTools::GetPath(path, "CMAKE_INCLUDE_PATH");
|
m_Makefile->GetIncludeSearchPath(callPaths, path);
|
||||||
// add the standard path
|
|
||||||
cmSystemTools::GetPath(path);
|
// Use the search path to find the file.
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
for(k=0; k < path.size(); k++)
|
for(k=0; k < path.size(); k++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,13 +70,17 @@ public:
|
||||||
return
|
return
|
||||||
" FIND_PATH(<VAR> fileName path1 [path2 ...]\n"
|
" FIND_PATH(<VAR> fileName path1 [path2 ...]\n"
|
||||||
" [DOC \"docstring\"])\n"
|
" [DOC \"docstring\"])\n"
|
||||||
"Find the directory containing a file named by fileName. Paths "
|
"Find the directory containing a file named by fileName. "
|
||||||
"are searched in the order specified. A cache entry named by "
|
"A cache entry named by "
|
||||||
"<VAR> is created to store the result. If the file is not "
|
"<VAR> is created to store the result. If the file is not "
|
||||||
"found, the result will be <VAR>-NOTFOUND. If DOC is specified "
|
"found, the result will be <VAR>-NOTFOUND. If DOC is specified "
|
||||||
"then the next argument is treated as a documentation string for "
|
"then the next argument is treated as a documentation string for "
|
||||||
"the cache entry <VAR>. The environment variable CMAKE_INCLUDE_PATH "
|
"the cache entry <VAR>. "
|
||||||
"is searched as well as the PATH variable.\n";
|
"The search proceeds first in paths listed in the CMAKE_INCLUDE_PATH "
|
||||||
|
"CMake variable (which is generally set by the user on the command line), "
|
||||||
|
"then in paths listed in the CMAKE_INCLUDE_PATH environment variable, "
|
||||||
|
"then in paths given to the command, and finally in paths listed in the "
|
||||||
|
"PATH environment variable.";
|
||||||
}
|
}
|
||||||
cmStdString FindHeaderInFrameworks( std::vector<std::string> path,
|
cmStdString FindHeaderInFrameworks( std::vector<std::string> path,
|
||||||
const char* var, const char* file);
|
const char* var, const char* file);
|
||||||
|
|
|
@ -2195,18 +2195,17 @@ std::string cmMakefile::FindLibrary(const char* name,
|
||||||
{
|
{
|
||||||
return cmSystemTools::CollapseFullPath(name);
|
return cmSystemTools::CollapseFullPath(name);
|
||||||
}
|
}
|
||||||
// Add the system search path to our path.
|
|
||||||
|
// Construct a search path.
|
||||||
std::vector<std::string> path;
|
std::vector<std::string> path;
|
||||||
cmSystemTools::GetPath(path, "CMAKE_LIBRARY_PATH");
|
this->GetLibrarySearchPath(userPaths, path);
|
||||||
cmSystemTools::GetPath(path, "LIB");
|
|
||||||
cmSystemTools::GetPath(path);
|
|
||||||
bool supportFrameworks = false;
|
bool supportFrameworks = false;
|
||||||
if(this->GetDefinition("APPLE"))
|
if(this->GetDefinition("APPLE"))
|
||||||
{
|
{
|
||||||
supportFrameworks = true;
|
supportFrameworks = true;
|
||||||
}
|
}
|
||||||
// now add the path
|
|
||||||
path.insert(path.end(), userPaths.begin(), userPaths.end());
|
|
||||||
// Add some lib directories specific to compilers, depending on the
|
// Add some lib directories specific to compilers, depending on the
|
||||||
// current generator, so that library that might have been stored here
|
// current generator, so that library that might have been stored here
|
||||||
// can be found too.
|
// can be found too.
|
||||||
|
@ -2309,6 +2308,50 @@ std::string cmMakefile::FindLibrary(const char* name,
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmMakefile::GetIncludeSearchPath(const std::vector<std::string>& callerPaths,
|
||||||
|
std::vector<std::string>& path)
|
||||||
|
{
|
||||||
|
// Add paths configured into the cache for this project.
|
||||||
|
if(const char* cmakeIncludePath = this->GetDefinition("CMAKE_INCLUDE_PATH"))
|
||||||
|
{
|
||||||
|
cmSystemTools::ExpandListArgument(cmakeIncludePath, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add paths in the user's environment.
|
||||||
|
cmSystemTools::GetPath(path, "CMAKE_INCLUDE_PATH");
|
||||||
|
cmSystemTools::GetPath(path, "INCLUDE");
|
||||||
|
|
||||||
|
// Add paths given by the caller.
|
||||||
|
path.insert(path.end(), callerPaths.begin(), callerPaths.end());
|
||||||
|
|
||||||
|
// Add standard system paths.
|
||||||
|
cmSystemTools::GetPath(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void
|
||||||
|
cmMakefile::GetLibrarySearchPath(const std::vector<std::string>& callerPaths,
|
||||||
|
std::vector<std::string>& path)
|
||||||
|
{
|
||||||
|
// Add paths configured into the cache for this project.
|
||||||
|
if(const char* cmakeLibPath = this->GetDefinition("CMAKE_LIBRARY_PATH"))
|
||||||
|
{
|
||||||
|
cmSystemTools::ExpandListArgument(cmakeLibPath, path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add paths in the user's environment.
|
||||||
|
cmSystemTools::GetPath(path, "CMAKE_LIBRARY_PATH");
|
||||||
|
cmSystemTools::GetPath(path, "LIB");
|
||||||
|
|
||||||
|
// Add paths given by the caller.
|
||||||
|
path.insert(path.end(), callerPaths.begin(), callerPaths.end());
|
||||||
|
|
||||||
|
// Add standard system paths.
|
||||||
|
cmSystemTools::GetPath(path);
|
||||||
|
}
|
||||||
|
|
||||||
std::string cmMakefile::GetModulesFile(const char* filename)
|
std::string cmMakefile::GetModulesFile(const char* filename)
|
||||||
{
|
{
|
||||||
std::vector<std::string> modulePath;
|
std::vector<std::string> modulePath;
|
||||||
|
|
|
@ -235,6 +235,14 @@ public:
|
||||||
std::string FindLibrary(const char* name,
|
std::string FindLibrary(const char* name,
|
||||||
const std::vector<std::string>& path);
|
const std::vector<std::string>& path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the include file or library search path.
|
||||||
|
*/
|
||||||
|
void GetIncludeSearchPath(const std::vector<std::string>& callerPaths,
|
||||||
|
std::vector<std::string>& path);
|
||||||
|
void GetLibrarySearchPath(const std::vector<std::string>& callerPaths,
|
||||||
|
std::vector<std::string>& path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a variable definition to the build. This variable
|
* Add a variable definition to the build. This variable
|
||||||
* can be used in CMake to refer to lists, directories, etc.
|
* can be used in CMake to refer to lists, directories, etc.
|
||||||
|
|
Loading…
Reference in New Issue