[cmake-developers] How to handle package Config.cmake files with dependencies ?

Michael Wild themiwi at gmail.com
Mon Feb 27 15:37:18 EST 2012


On 02/27/2012 09:15 PM, Alexander Neundorf wrote:
> Hi,
> 
> I think find_package in Config mode might still need some more work.
> 
> When the FooConfig.cmake has been found, Foo_FOUND is set to TRUE:
> 
>  // Set a variable marking whether the package was found.
>   std::string foundVar = this->Name;
>   foundVar += "_FOUND";
> 
> 
> This means it is true in all cases that the Config.cmake file has been found 
> (and the version was compatible).
> 
> Now I have to questions:
> 
> 
> * how to handle COMPONENTS ?
> 
> 
> If a package is requested with COMPONENTS, these should be considered for 
> setting Foo_FOUND:
> find_package(Foo REQUIRED COMPONENTS A B C)
> should only succeed if A, B and C are found.
> 
> This is how I would expect COMPONENTS to be handled in a FindFoo.cmake:
> (a) all components are searched by the Find-module, and each per-component 
> X_Y_FOUND is set accordingly
> 
> (b) there is a package-specific default subset of these components which have 
> to be found to make the package found, i.e. FOO_FOUND=TRUE
> 
> (c) by adding COMPONENTS to the find_package() call, these components are 
> added to the set of components which have to be found to make FOO_FOUND=TRUE
> 
> (d) if REQUIRED is used and FOO_FOUND is false, it errors out
> 

I like that proposal. I'm also quite unhappy with how components are
handled in config-mode.

> 
> 
> * how to handle dependencies ?
> 
> 
> Let's say the exported targets of Foo link against other imported/exported 
> targets. So that the imported targets work properly, the targets for the 
> libraries it depends on must have been found and imported before.
> Where should this 
> find_package(Bar)
> be done ?
> In FooConfig.cmake ?
> This would be possible only if Bar can be found in Config mode, because 
> otherwise Foo cannot rely on FindBar.cmake being available.
> 
> For Find-modules, it is clear that a Find-module should also find all its 
> dependencies.
> For a Config file I'm not sure about it. Shouldn't this be only a source of 
> information, purely declarative, and not initiate searching other packages ?


I think current best practice is to call find_package(Bar) inside the
FooConfig.cmake. If the FindBar.cmake is contained in CMake,
everything's fine (possibly, you need a cmake_minimum_required()),
otherwise Foo should install FindBar.cmake alongside FooConfig.cmake.

Michael



More information about the cmake-developers mailing list