فهرست منبع

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

Alexander Neundorf 18 سال پیش
والد
کامیت
0398d8ad38

+ 53 - 2
Source/cmFindBase.cxx

@@ -83,6 +83,7 @@ cmFindBase::cmFindBase()
     "1. Search cmake specific environment variables.  This "
     "can be skipped if NO_CMAKE_ENVIRONMENT_PATH is passed.\n"
     ""
+    "   CMAKE_FIND_PREFIX_PATH/XXX_SUBDIR\n"
     "   CMAKE_FRAMEWORK_PATH\n"
     "   CMAKE_APPBUNDLE_PATH\n"
     "   CMAKE_XXX_PATH\n"
@@ -92,6 +93,7 @@ cmFindBase::cmFindBase()
     "-DVAR=value.  This can be skipped if NO_CMAKE_PATH "
     "is passed.\n"
     ""
+    "   CMAKE_FIND_PREFIX_PATH/XXX_SUBDIR\n"
     "   CMAKE_FRAMEWORK_PATH\n"
     "   CMAKE_APPBUNDLE_PATH\n"
     "   CMAKE_XXX_PATH\n"
@@ -546,10 +548,15 @@ void cmFindBase::HandleCMakeFindRootPath()
 
 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_";
   var += this->CMakePathName;
   var += "_PATH";
-  std::vector<std::string> paths;
   cmSystemTools::GetPath(paths, var.c_str());
   if(this->SearchAppBundleLast)
     {
@@ -559,7 +566,42 @@ void cmFindBase::AddEnvironmentVariables()
     {
     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()
@@ -644,6 +686,15 @@ void cmFindBase::AddCMakeVariables()
   var += this->CMakePathName;
   var += "_PATH";
   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()))
     {
     cmSystemTools::ExpandListArgument(path, paths);

+ 2 - 0
Source/cmFindBase.h

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

+ 2 - 0
Source/cmFindLibraryCommand.cxx

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

+ 2 - 0
Source/cmFindPathCommand.cxx

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

+ 2 - 0
Source/cmFindProgramCommand.cxx

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

+ 12 - 0
Tests/FindPackageTest/CMakeLists.txt

@@ -10,3 +10,15 @@ FIND_PACKAGE(NotAPackage QUIET)
 FIND_PACKAGE(VTK QUIET)
 
 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)
+

+ 1 - 0
Tests/FindPackageTest/include/foo.h

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