Skip to content
  • Stephen Kelly's avatar
    Fix include dir propagation from conditionally linked targets · 26dba6a1
    Stephen Kelly authored and Brad King's avatar Brad King committed
    Generator expressions, including configuration-specific expressions may
    be used as link libraries of targets.  The old-style keywords of
    target_link_libraries are handled in terms of new generator expressions.
    However, the generator expressions expect target names to be valid
    against a regular expression, whereas target_link_libraries does not
    require validation.  In generator expression constructed without any
    action from the user we need to ensure that only valid expressions are
    generated.  Ensure that strings which are not valid target names are not
    used in generator expressions which validate the argument.
    
    Code like
    
     target_link_libraries(B debug A)
    
    generates usage requirement references such as "$<$<CONFIG:DEBUG>:A>".
    When cmTarget::GetIncludeDirectories uses such references it generates
    expressions like:
    
     $<TARGET_PROPERTY:$<$<CONFIG:DEBUG>:A>,INTERFACE_INCLUDE_DIRECTORIES>
    
    When the conditions are false such references evaluate as an empty
    string and the expression fails with an error such as:
    
     $<TARGET_PROPERTY:tgt,prop> expression requires a non-empty target name.
    
    Fix this by teaching cmTarget::GetIncludeDirectories to wrap the above
    expression inside a conditional:
    
     $<$<BOOL:$<$<CONFIG:DEBUG>:A>>:...>
    
    so that $<TARGET_PROPERTY:...> will not be evaluated with an empty
    target.
    26dba6a1