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

Alexander Neundorf neundorf at kde.org
Tue Feb 28 13:48:54 EST 2012


On Monday 27 February 2012, Brad King wrote:
> On 2/27/2012 3:37 PM, Michael Wild wrote:
> > On 02/27/2012 09:15 PM, Alexander Neundorf wrote:
> >> 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).
> 
> The find_package command is acting as a primitive like find_library from
> the point of view of setting Foo_DIR, and that can be tested directly to
> see if the config file was found.  That leaves room to change the way
> we set Foo_FOUND.  We could add a policy that in NEW behavior unsets
> Foo_FOUND completely before loading FooConfig.  After FooConfig has been
> loaded it detects whether Foo_FOUND is now defined.  If set, use that
> value.  If not set, set it to true as it is now.  That will give the
> FooConfig file a chance to set the result.

Sounds good.
Do you think that needs a policy ?
The code currently does:

  // Set a variable marking whether the package was found.
  std::string foundVar = this->Name;
  foundVar += "_FOUND";
  this->Makefile->AddDefinition(foundVar.c_str(), found? "1":"0");

(I forgot the last line in my initial mail).
So the variable is set afterwards unconditionally.
The only condition where it would make a difference is if inside a 
FooConfig.cmake file there would be a check whether Foo_FOUND is already TRUE.

I can do that.

> >> * how to handle COMPONENTS ?
> > 
> > I like that proposal. I'm also quite unhappy with how components are
> > handled in config-mode.
> 
> With the approach I suggest above it will be up to FooConfig to determine
> this.
> 
> Another approach is to add an API to give FooConfigVersion access to the
> list of desired components.  If the package version file encodes a known
> list of available components it would be able to report UNSUITABLE if a
> requested component is missing.  Then find_package would move on to
> another candidate.  This might confuse users that expect a particular
> location to be found because it wouldn't report that it is missing a
> component and instead silently ignore it.  It is probably better to let
> FooConfig report a message that says its Foo doesn't have the component.

Yes, I agree that putting the component-handling into the version file sounds 
a bit unexpected.
 
Alex



More information about the cmake-developers mailing list