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

Alexander Neundorf neundorf at kde.org
Mon Feb 27 15:15:54 EST 2012


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



* 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 ?

Alex



More information about the cmake-developers mailing list