[CMake] 3rd party cmake files

Brad King brad.king at kitware.com
Wed Jun 7 16:03:40 EDT 2006


Alexander Neundorf wrote:
> Ok, we need a solution here.
> Now that cmake is going to enter the "center stage" :-) things are going to change in this regard.
> Until now cmake comes with FindFoo.cmake modules for all other software packages. 
> Once other software packages will also use cmake as their native buildsystem it will be better if these projects deliver the required cmake files themselves, be it FindFoo.cmake or FooConfig.cmake files.
> In KDE we have now already two "independent" software packages:
> kdewin32 and qtdbus, which both use cmake as their native build system, which are both independent from KDE and which both have to be installed before starting to compile KDE (i.e. kdelibs).
> Now in kdelibs we need a way to find kdewin32 and qtdbus.
> For kdewin32 this wouldn't be a big problem. For qtdbus there are more issues. It features some cmake macros for code generation (QTDBUS_ADD_INTERFACES()). These are used when building qtdbus itself and also when compiling software which uses qtdbus. So qtdbus should install the cmake files which contain these macros.
> Requiring every user to manually adjust KDEWIN32_Dir and QTDBUS_Dir is not really an option for the long term.

What's wrong with using FIND_PATH to locate FooConfig.cmake as I 
suggested previously?  Then kdelibs would have a FindFoo.cmake that 
contains no knowledge of Foo except that it provides a FooConfig.cmake. 
  Project Foo would install FooConfig.cmake to contain all the 
information about where Foo is located.  The CMake code in kdelibs would 
have

FIND_PACKAGE(Foo)

which uses the kdelibs copy of the simple FindFoo.cmake.  If it is not 
found automatically for some reason then the user would set Foo_DIR to 
the location of one file (rather than Foo_INCLUDE_DIR and Foo_LIBRARY 
separately).

In this solution FindFoo.cmake contains only a few lines like

find_path(QtDBUS_DIR FindQtDBUS.cmake PATHS ...)
if(EXISTS ${QtDBUS_DIR}/QtDBUSConfig.cmake)
   include(${QtDBUS_DIR}/QtDBUSConfig.cmake)
else(EXISTS ${QtDBUS_DIR}/QtDBUSConfig.cmake)
   # ...report not found...
endif(EXISTS ${QtDBUS_DIR}/QtDBUSConfig.cmake)

which does not depend on the Foo version and thus does not have to come 
with Foo.  Since the find_path command can list PATH_SUFFIXES and other 
places to look, kdelibs should be able to find Foo automatically.

-Brad


More information about the CMake mailing list