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:
parent
480b97a8e2
commit
0398d8ad38
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -559,7 +566,42 @@ void cmFindBase::AddEnvironmentVariables()
|
||||||
{
|
{
|
||||||
cmSystemTools::GetPath(paths, "CMAKE_FRAMEWORK_PATH");
|
cmSystemTools::GetPath(paths, "CMAKE_FRAMEWORK_PATH");
|
||||||
}
|
}
|
||||||
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()
|
||||||
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
/* empty header file */
|
Loading…
Reference in New Issue