ENH: add support for CMAKE_FIND_PREFIX_PATH as discussed with Brad.

CMAKE_FIND_PREFIX_PATH is both an environment variable and a cmake variable,
which is a list of base directories where FIND_PATH, FIND_FILE, FIND_PROGRAM
and FIND_LIBRARY will search in the respective subdirectories

Alex
This commit is contained in:
Alexander Neundorf 2007-10-26 09:55:40 -04:00
parent 480b97a8e2
commit 0398d8ad38
7 changed files with 74 additions and 2 deletions

View File

@ -83,6 +83,7 @@ cmFindBase::cmFindBase()
"1. Search cmake specific environment variables. This " "1. Search cmake specific environment variables. This "
"can be skipped if NO_CMAKE_ENVIRONMENT_PATH is passed.\n" "can be skipped if NO_CMAKE_ENVIRONMENT_PATH is passed.\n"
"" ""
" CMAKE_FIND_PREFIX_PATH/XXX_SUBDIR\n"
" CMAKE_FRAMEWORK_PATH\n" " CMAKE_FRAMEWORK_PATH\n"
" CMAKE_APPBUNDLE_PATH\n" " CMAKE_APPBUNDLE_PATH\n"
" CMAKE_XXX_PATH\n" " CMAKE_XXX_PATH\n"
@ -92,6 +93,7 @@ cmFindBase::cmFindBase()
"-DVAR=value. This can be skipped if NO_CMAKE_PATH " "-DVAR=value. This can be skipped if NO_CMAKE_PATH "
"is passed.\n" "is passed.\n"
"" ""
" CMAKE_FIND_PREFIX_PATH/XXX_SUBDIR\n"
" CMAKE_FRAMEWORK_PATH\n" " CMAKE_FRAMEWORK_PATH\n"
" CMAKE_APPBUNDLE_PATH\n" " CMAKE_APPBUNDLE_PATH\n"
" CMAKE_XXX_PATH\n" " CMAKE_XXX_PATH\n"
@ -546,10 +548,15 @@ void cmFindBase::HandleCMakeFindRootPath()
void cmFindBase::AddEnvironmentVariables() void cmFindBase::AddEnvironmentVariables()
{ {
std::vector<std::string> paths;
std::vector<std::string> prefixPaths;
cmSystemTools::GetPath(prefixPaths, "CMAKE_FIND_PREFIX_PATH");
this->AddFindPrefix(paths, prefixPaths);
std::string var = "CMAKE_"; std::string var = "CMAKE_";
var += this->CMakePathName; var += this->CMakePathName;
var += "_PATH"; var += "_PATH";
std::vector<std::string> paths;
cmSystemTools::GetPath(paths, var.c_str()); cmSystemTools::GetPath(paths, var.c_str());
if(this->SearchAppBundleLast) if(this->SearchAppBundleLast)
{ {
@ -562,6 +569,41 @@ void cmFindBase::AddEnvironmentVariables()
this->AddPaths(paths); this->AddPaths(paths);
} }
void cmFindBase::AddFindPrefix(std::vector<std::string>& dest,
const std::vector<std::string>& src)
{
// default for programs
std::string subdir = "/bin";
if (this->CMakePathName == "INCLUDE")
{
subdir = "/include";
}
else if (this->CMakePathName == "LIBRARY")
{
subdir = "/lib";
}
else if (this->CMakePathName == "FRAMEWORK")
{
subdir = ""; // ? what to do for frameworks ?
}
for (std::vector<std::string>::const_iterator it = src.begin();
it != src.end();
++it)
{
std::string dirWithSubdir = it->c_str();
dirWithSubdir += subdir;
dest.push_back(dirWithSubdir);
if (subdir == "/bin")
{
dirWithSubdir = it->c_str();
dirWithSubdir += "/sbin";
dest.push_back(dirWithSubdir);
}
}
}
void cmFindBase::AddFrameWorkPaths() void cmFindBase::AddFrameWorkPaths()
{ {
if(this->NoDefaultPath) if(this->NoDefaultPath)
@ -644,6 +686,15 @@ void cmFindBase::AddCMakeVariables()
var += this->CMakePathName; var += this->CMakePathName;
var += "_PATH"; var += "_PATH";
std::vector<std::string> paths; std::vector<std::string> paths;
if(const char* prefixPath =
this->Makefile->GetDefinition("CMAKE_FIND_PREFIX_PATH"))
{
std::vector<std::string> prefixPaths;
cmSystemTools::ExpandListArgument(prefixPath, prefixPaths);
this->AddFindPrefix(paths, prefixPaths);
}
if(const char* path = this->Makefile->GetDefinition(var.c_str())) if(const char* path = this->Makefile->GetDefinition(var.c_str()))
{ {
cmSystemTools::ExpandListArgument(path, paths); cmSystemTools::ExpandListArgument(path, paths);

View File

@ -53,6 +53,8 @@ protected:
void AddFrameWorkPaths(); void AddFrameWorkPaths();
void AddAppBundlePaths(); void AddAppBundlePaths();
void AddEnvironmentVariables(); void AddEnvironmentVariables();
void AddFindPrefix(std::vector<std::string>& dest,
const std::vector<std::string>& src);
void AddCMakeVariables(); void AddCMakeVariables();
void AddSystemEnvironmentVariables(); void AddSystemEnvironmentVariables();
void AddCMakeSystemVariables(); void AddCMakeSystemVariables();

View File

@ -32,6 +32,8 @@ cmFindLibraryCommand::cmFindLibraryCommand()
"SEARCH_XXX_DESC", "library"); "SEARCH_XXX_DESC", "library");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"SEARCH_XXX", "library"); "SEARCH_XXX", "library");
cmSystemTools::ReplaceString(this->GenericDocumentation,
"XXX_SUBDIR", "lib");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"CMAKE_FIND_ROOT_PATH_MODE_XXX", "CMAKE_FIND_ROOT_PATH_MODE_XXX",
"CMAKE_FIND_ROOT_PATH_MODE_LIBRARY"); "CMAKE_FIND_ROOT_PATH_MODE_LIBRARY");

View File

@ -36,6 +36,8 @@ cmFindPathCommand::cmFindPathCommand()
"directory containing the named file"); "directory containing the named file");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"SEARCH_XXX", "file in a directory"); "SEARCH_XXX", "file in a directory");
cmSystemTools::ReplaceString(this->GenericDocumentation,
"XXX_SUBDIR", "include");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"CMAKE_FIND_ROOT_PATH_MODE_XXX", "CMAKE_FIND_ROOT_PATH_MODE_XXX",
"CMAKE_FIND_ROOT_PATH_MODE_INCLUDE"); "CMAKE_FIND_ROOT_PATH_MODE_INCLUDE");

View File

@ -37,6 +37,8 @@ cmFindProgramCommand::cmFindProgramCommand()
"SEARCH_XXX_DESC", "program"); "SEARCH_XXX_DESC", "program");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"SEARCH_XXX", "program"); "SEARCH_XXX", "program");
cmSystemTools::ReplaceString(this->GenericDocumentation,
"XXX_SUBDIR", "[s]bin");
cmSystemTools::ReplaceString(this->GenericDocumentation, cmSystemTools::ReplaceString(this->GenericDocumentation,
"CMAKE_FIND_ROOT_PATH_MODE_XXX", "CMAKE_FIND_ROOT_PATH_MODE_XXX",
"CMAKE_FIND_ROOT_PATH_MODE_PROGRAM"); "CMAKE_FIND_ROOT_PATH_MODE_PROGRAM");

View File

@ -10,3 +10,15 @@ FIND_PACKAGE(NotAPackage QUIET)
FIND_PACKAGE(VTK QUIET) FIND_PACKAGE(VTK QUIET)
ADD_EXECUTABLE(FindPackageTest FindPackageTest.cxx) ADD_EXECUTABLE(FindPackageTest FindPackageTest.cxx)
# test behaviour of cmFindBase wrt. the CMAKE_FIND_PREFIX_PATH variable
# foo.h should be found in ${CMAKE_CURRENT_SOURCE_DIR}/include:
SET(CMAKE_FIND_PREFIX_PATH /blub /blah "${CMAKE_CURRENT_SOURCE_DIR}")
FIND_PATH(FOO_DIR foo.h)
IF(NOT FOO_DIR)
MESSAGE(FATAL_ERROR "Did not find foo.h which is in ${CMAKE_CURRENT_SOURCE_DIR}/include
CMAKE_FIND_PREFIX_PATH = ${CMAKE_FIND_PREFIX_PATH}")
ENDIF(NOT FOO_DIR)

View File

@ -0,0 +1 @@
/* empty header file */