[CMake] FindXXX, XXXConfig and UseXXX

Brad King brad.king at kitware.com
Mon Feb 18 15:19:55 EST 2008


Fernando Cacciola wrote:
> XXXConfig.cmake should be generated by the cmake script that configures 
> the library and it should contain the settings specific to that 
> configuration (such as source and binary folders, detected third party 
> dependencies, needed flags, etc)

Correct.

> FindXXX.cmake should search a user's system for an instance of 
> XXXConfig.cmake (using XXX_DIR and defaults paths). If it finds it, it 
> should load that XXXConfig.cmake.

No, see below.

> UseXXX.cmake should set include directories, libraries, compiler and 
> linker flags, etc, based on the settings defined in a XXXConfig.cmake 
> that must has been processed already.
> 
> XXXConfig.cmake should define a XXX_USE_FILE with the full path to the 
> UseXXX.cmake file.
> 
> XXX users would load XXX in their own programs via:
> 
> 
> find_package(XXX)
> 
> if ( XXX_FOUND )
> 
>  include( ${XXX_USE_FILE} )
> 
> endif()

Correct.

> If FindXXX.cmake is found in the paths specified by CMAKE_MODULE_PATH, 
> it is loaded by find_package(XXX).

There should not be a FindXXX.cmake at all.

> If not, but the user sets XXX_DIR to some binary folder for some 
> installation of XXX, the above code works still by loading 
> XXXConfig.cmake directly (witout going through FindXXX..cmake)
> 
> Is all that correct?

Yes.

> Is so, how should FindXXX and UseXXX distributed?

UseXXX.cmake should come with the project next to XXXConfig.cmake.

The whole idea of creating a package with XXXConfig.cmake is to not have 
to have a FindXXX.cmake module at all.  The find_package command is 
supposed to find XXXConfig.cmake automatically, but it is not very good 
at finding the files as of CMake 2.4 so the user has to set XXX_DIR 
alot.  CMake 2.6 will have a much better find_package:

   http://www.cmake.org/Wiki/CMake_2.6_Notes#Packages

You should install XXXConfig.cmake and UseXXX.cmake in the XXX install 
tree under one of the locations mentioned in the find_package command 
documentation (as of CMake 2.6).  For example, a project on UNIX might 
install

   <prefix>/lib/xxx-1.2/XXXConfig.cmake

Someone using CMake 2.4 will have to set XXX_DIR to that directory by 
hand, but anyone using CMake 2.6 will have the file found automatically. 
  Versioning is also supported in the CMake 2.6 find_package.  See the 
nots above.

-Brad


More information about the CMake mailing list