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

Alexander Neundorf neundorf at kde.org
Sat Mar 10 13:15:43 EST 2012


On Saturday 10 March 2012, Alexander Neundorf wrote:
> On Saturday 10 March 2012, Alexander Neundorf wrote:
> ...
> 
> > What it does is it requires a lot of manual checking in the users
> > CMakeLists.txt (because they have to check for each requested component
> > individually).
> > 
> > How about
> > 
> > find_package(Foo COMPONENTS Bar Blub OPTIONAL_COMPONENTS Zot Zat ) ?
> > 
> > COMPONENTS: Foo_FOUND is only TRUE if all listed components have been
> > found
> > 
> > OPTIONAL_COMPONENTS: they are not considered for setting Foo_FOUND
> > 
> > The result variables for each component will be fully ExactCase:
> > Foo_Bar_FOUND etc.
> > 
> > The library and include dir variables from all listed and found
> > components should be added to Foo_LIBRARIES and Foo_INCLUDE_DIRS.
> > 
> > If any components are given, it is recommended to search only the listed
> > components. AFAICS only in corner cases bad things can happen if all
> > components are searched.
> > 
> > How does that sound ?
> 
> I just had a look at how COMPONENTS is implemented in cmFindPackage.cxx:
> 
>    else if(doing == DoingComponents)
>       {
>       // Set a variable telling the find script this component
>       // is required.
>       std::string req_var = this->Name + "_FIND_REQUIRED_" + args[i];
>       this->AddFindDefinition(req_var.c_str(), "1");
> 
>       // Append to the list of required components.
>       components += components_sep;
>       components += args[i];
>       components_sep = ";";
>       }
> 
> Since this contains the word "required" multiple times this also suggests
> that the list of components is the list of required components.
> 
> IMO OPTIONAL_COMPONENTS looks like a good fit.

I pushed a branch ImprovedCOMPONENTSSupportInFindPackage to stage.

It is not finished (documentation and an updated fphsa() are missing at 
least), but you may want to have a look at it.

It adds
* OPTIONAL_COMPONENTS
* CMP0018: if a listed component is not found, Foo_FOUND is set to false in 
Config mode

Comments are welcome :-)

Alex



More information about the cmake-developers mailing list