Reputation: 58841
I have VTK6 installed on my Debian machine and it places all its CMake files under
$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
When I do
find_package(VTK)
in another project, it all works out fine. However,
include(vtkModuleAPI)
yields the error
include could not find load file:
vtkModuleAPI
I had always been under the impression that find_package()
and include
share the same search paths, specifically CMAKE_MODULE_PATH
. Apparently that's not correct.
Note that
SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
does work.
Also note that I'm using CMake 3.5, so there no longer is a FindVTK.cmake
as it used to be.
What are the default search paths for find_package()
and include()
? Why is vtkModuleAPI.cmake
not found?
Upvotes: 4
Views: 8767
Reputation: 66061
There are two modes of find_package, which have many differences:
Module mode tries to locate FindXXX.cmake
file. The file is searched under directories listed in CMAKE_MODULE_PATH plus under directory where CMake is installed.
Config mode tries to locate XXXConfig.cmake
file. The file is searched under directories listed in CMAKE_PREFIX_PATH and some other, system-specific variables. (Full algorithm see in the documentation, linked at the beginning of the post).
Command include searches modules only under directories in CMAKE_MODULE_PATH and special CMake module directory.
As you can see, command include
and command find_package
in module mode uses similar search paths. But in your case, VTKConfig.cmake
can be searched only in config mode of find_package
, which uses completely different search algorithm.
In case of VTK, CMake has shipped FindVTK.cmake
file, which is used when you call find_package(VTK)
. But inside, this script uses find_package(VTK QUIET NO_MODULE)
.
If this call locates file /usr/lib/cmake/vtk-6.3/VTKConfig.cmake
, it executes this script, and the script includes vtkModuleAPI.cmake
one.
If your VTKConfig.cmake
is not located by CMake, you may help it by setting VTK_DIR variable to /usr/lib/cmake/vtk-6.3/
.
[Starting with CMake-3.1, FindVTK.cmake
is no longer shipped with CMake, so find_package(VTK)
immediately tries to locate VTKConfig.cmake
].
In any case, modules in directory /usr/lib/cmake/vtk-6.3/
shouldn't be included directly: this directory is private for VTK.
Upvotes: 8
Reputation: 5800
find_package(VTK)
uses FindVTK.cmake
(in it's module mode, c.f. docu on find_package()
), which is shipped by CMake and (in your case) should be located in /usr/share/cmake/Modules
.
After adding /usr/lib/cmake/vtk-6.3
to CMAKE_MODULE_PATH
, find_package(VTK)
will still use the same FindVTK.cmake
module.
In case you want to use another FindVTK.cmake
module, prepend the path to that FindVTK.cmake
module to CMAKE_MODULE_PATH
.
include()
will not use a find module and only sees files located in the CMAKE_MODULE_PATH
.
Upvotes: 1