summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2006-01-27 23:20:55 (GMT)
committerBrad King <brad.king@kitware.com>2006-01-27 23:20:55 (GMT)
commit938890757aa721ec08909df4870304d5a9405337 (patch)
treef1120377ca512d92ffb1aad64e5bb59e0d5c699b /Source
parentf4b306d5d449b8b5959c2d32898bd9fd23b893c6 (diff)
downloadCMake-938890757aa721ec08909df4870304d5a9405337.zip
CMake-938890757aa721ec08909df4870304d5a9405337.tar.gz
CMake-938890757aa721ec08909df4870304d5a9405337.tar.bz2
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.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmFindFileCommand.cxx14
-rw-r--r--Source/cmFindLibraryCommand.h11
-rw-r--r--Source/cmFindPathCommand.cxx14
-rw-r--r--Source/cmFindPathCommand.h12
-rw-r--r--Source/cmMakefile.cxx55
-rw-r--r--Source/cmMakefile.h8
6 files changed, 86 insertions, 28 deletions
diff --git a/Source/cmFindFileCommand.cxx b/Source/cmFindFileCommand.cxx
index 30c481b..daf02dd 100644
--- a/Source/cmFindFileCommand.cxx
+++ b/Source/cmFindFileCommand.cxx
@@ -60,20 +60,18 @@ bool cmFindFileCommand::InitialPass(std::vector<std::string> const& argsIn)
{
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++)
{
// 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");
-
- // add the standard path
- cmSystemTools::GetPath(path);
+ // Use the search path to find the file.
for(unsigned int k=0; k < path.size(); k++)
{
std::string tryPath = path[k];
diff --git a/Source/cmFindLibraryCommand.h b/Source/cmFindLibraryCommand.h
index b5f0f7b..885405d 100644
--- a/Source/cmFindLibraryCommand.h
+++ b/Source/cmFindLibraryCommand.h
@@ -72,8 +72,7 @@ public:
" [PATHS path1 path2 ...]\n"
" [DOC \"docstring\"])\n"
"Find a library named by one of the names given after the NAMES "
- "argument. Paths specified after the PATHS argument are searched "
- "in the order specified. A cache entry named by <VAR> is created "
+ "argument. A cache entry named by <VAR> is created "
"to store the result. If the library is not found, the result "
"will be <VAR>-NOTFOUND. If DOC is specified then the next "
"argument is treated as a documentation string for the cache "
@@ -81,8 +80,12 @@ public:
" FIND_LIBRARY(VAR libraryName [path1 path2 ...])\n"
"Find a library with the given name by searching in the specified "
"paths. This is a short-hand signature for the command that is "
- "sufficient in many cases. The environment variable CMAKE_LIBRARY_PATH "
- "is searched as well as the PATH variable.\n";
+ "sufficient in many cases. "
+ "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);
diff --git a/Source/cmFindPathCommand.cxx b/Source/cmFindPathCommand.cxx
index 35e6d0c..83d5faa 100644
--- a/Source/cmFindPathCommand.cxx
+++ b/Source/cmFindPathCommand.cxx
@@ -64,20 +64,22 @@ bool cmFindPathCommand::InitialPass(std::vector<std::string> const& argsIn)
helpString = hs?hs:"(none)";
}
}
+
+ // Construct a search 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++)
{
// expand variables
std::string exp = args[j];
- cmSystemTools::ExpandRegistryValues(exp);
+ cmSystemTools::ExpandRegistryValues(exp);
// 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");
- // add the standard path
- cmSystemTools::GetPath(path);
+ m_Makefile->GetIncludeSearchPath(callPaths, path);
+
+ // Use the search path to find the file.
unsigned int k;
for(k=0; k < path.size(); k++)
{
diff --git a/Source/cmFindPathCommand.h b/Source/cmFindPathCommand.h
index 17e431b..3c44221 100644
--- a/Source/cmFindPathCommand.h
+++ b/Source/cmFindPathCommand.h
@@ -70,13 +70,17 @@ public:
return
" FIND_PATH(<VAR> fileName path1 [path2 ...]\n"
" [DOC \"docstring\"])\n"
- "Find the directory containing a file named by fileName. Paths "
- "are searched in the order specified. A cache entry named by "
+ "Find the directory containing a file named by fileName. "
+ "A cache entry named by "
"<VAR> is created to store the result. If the file is not "
"found, the result will be <VAR>-NOTFOUND. If DOC is specified "
"then the next argument is treated as a documentation string for "
- "the cache entry <VAR>. The environment variable CMAKE_INCLUDE_PATH "
- "is searched as well as the PATH variable.\n";
+ "the cache entry <VAR>. "
+ "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,
const char* var, const char* file);
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 58dbab1..7d38acc 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -2195,18 +2195,17 @@ std::string cmMakefile::FindLibrary(const char* name,
{
return cmSystemTools::CollapseFullPath(name);
}
- // Add the system search path to our path.
+
+ // Construct a search path.
std::vector<std::string> path;
- cmSystemTools::GetPath(path, "CMAKE_LIBRARY_PATH");
- cmSystemTools::GetPath(path, "LIB");
- cmSystemTools::GetPath(path);
+ this->GetLibrarySearchPath(userPaths, path);
+
bool supportFrameworks = false;
if(this->GetDefinition("APPLE"))
{
supportFrameworks = true;
}
- // now add the path
- path.insert(path.end(), userPaths.begin(), userPaths.end());
+
// 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.
@@ -2309,6 +2308,50 @@ std::string cmMakefile::FindLibrary(const char* name,
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::vector<std::string> modulePath;
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index dba2763..3f289c1 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -236,6 +236,14 @@ public:
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
* can be used in CMake to refer to lists, directories, etc.
*/