[cmake-developers] exports and MAP_IMPORTED_CONFIG_<CONFIG>

Stephen Kelly steveire at gmail.com
Thu Dec 13 08:44:29 EST 2012


Brad King wrote:

> On 12/09/2012 08:48 AM, Stephen Kelly wrote:
>> I think the 'Setting include directories via target_link_libraries() ?'
>> thread needs to be concluded first (with reasoning), as that affects
>> everything else.
> 
> While thinking about my next response to that discussion I realized
> that most of our discussion so far about exported interfaces has missed
> a major piece.  You briefly mentioned it while we discussed the syntax
> of the $<CONFIG_DEBUG> expression.  It is MAP_IMPORTED_CONFIG_<CONFIG>:
> 
>  
http://www.cmake.org/cmake/help/v2.8.10/cmake.html#prop_tgt:MAP_IMPORTED_CONFIG_CONFIG
> 
> Every part of an exported interface (link interface libraries, include
> dirs, compile definitions, etc.) potentially depends on the configuration
> being exported from the project.  The exporting project knows nothing of
> the importing projects' configurations.  All evaluation of its generator
> expressions must be done using only one of the original configurations
> for expressions like $<CONFIG:...>, $<CONFIG_DEBUG> and $<CONFIGURATION>.

So, the problem is that upstream will populate interfaces for configs of its 
own choosing, and downstream is responsible for mapping to them?

So, upstream can contain this:

 $<$<CONFIG:Release>:foo>

and downstream can contain this:

 MAP_IMPORTED_CONFIG_COVERAGE "Release"

and that will be ignored by what is currently in the branch when downstream 
is using the COVERAGE config. 

I think that's correct, and I see the problem. 

I don't see any reason to change $<CONFIGURATION> in any way, but I see a 
reason for CONFIG and CONFIG_DEBUG to be changed to be aware of mapped 
configs. Is changing that ok from a backward compatibility point of view? Do 
we need a policy? 

> 
> One approach to this is to perform partial evaluation of all exported
> interfaces to resolve generator expressions that depend on the config.
> Then store the results in exported properties ending in _<CONFIG>.

Are you suggesting storing this stuff in new properties like 

 INTERFACE_LINK_LIBRARIES_DEBUG

etc? Ie new-style with a <CONFIG> suffix?

> This is essentially what CMake <= 2.8.10 does to produce properties
> like IMPORTED_LINK_INTERFACE_LIBRARIES_<CONFIG>, but that is actually
> full evaluation because there is no support for generator expressions.

My first thought would be to change the implementation of 
DebugTestNode::Evaluate instead to query the mapped configs from the 
context->Target, or context->WorkingTarget (which doesn't exist yet). 

Is there a reason to prefer partial evaluation and multiple exported 
properties in the _<CONFIG> style?

> The importing project then selects one of the exported configurations
> using heuristics and MAP_IMPORTED_CONFIG_<CONFIG> if defined.
> 
> Another approach is to try to honor the configuration mapping while
> evaluating exported generator expressions in the importing project.

Ah, I think this is what I suggest above too.

> Evaluation would need to track when it crosses into expressions that
> came from another project and lookup the configuration mapping.

According to 

 http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/3737/focus=3751

config packages don't set MAP_IMPORTED_CONFIG_<CONFIG>, and only the caller 
does. Where would the configuration mapping come from is another project is 
encountered?

> 
> Note that the above holds for not only link interface libraries but
> for any new usage requirements support too.  For example in the partial
> evaluation approach the exported interfaces would need properties like
> 
>  (IMPORTED_)?INCLUDE_DIRECTORIES_<CONFIG>
>  (IMPORTED_)?COMPILE_DEFINITIONS_<CONFIG>
> 
> Such properties are distinct from properties like INCLUDE_DIRECTORIES
> in that they will not contain config-dependent generator expressions.

... but otherwise can contain generator expressions, which differentiates 
them from the old-style properties?

I prefer the approach of honoring the configuration mapping while evaluating 
the generator expression. That way we don't have to introduce _<CONFIG> 
variants for the new properties, which simplifies documentation at least :) 
'this one can use $<CONFIG>, but this one can't' etc.

Thanks,

Steve.





More information about the cmake-developers mailing list