[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