Brad King wrote: > On Fri, Apr 26, 2013 at 10:39 AM, Stephen Kelly > <steve...@gmail.com> wrote: >> Brad King <brad.king@...> writes: >> >>> I looked into implementing this and realized that we're not propagating >>> usage requirements from the entire link closure, only from the direct >>> dependencies. >> >> Are you sure? Maybe I don't understand what you mean. Can you post a code >> snippet? >> >> add_library(foo SHARED empty.cpp) >> target_include_directories(foo INTERFACE /opt/foo) >> add_library(bar SHARED empty.cpp) >> add_library(sho SHARED empty.cpp) >> >> target_link_libraries(sho bar) >> target_link_libraries(bar foo) > > It appears to work but I do not see how from a quick read of the > implementation. > The AppendTllIncludes is only called for direct dependencies by tll(). > What propagates the requirement transitively in 2.8.11-rc3?
Ah, indeed. This solves the mystery of why the current implementation creates the generator expression for each entry instead of reading the property directly. $<TARGET_PROPERTY:foo,INTERFACE_INCLUDE_DIRECTORIES> gives a transitively evaluated result, but fooTarget->GetDefinition("INTERFACE_INCLUDE_DIRECTORIES") does not. The former works because it is part of the targetPropertyTransitiveWhitelist in cmGeneratorExpressionEvaluator when evaluating the TargetPropertyNode, so I probably also wanted to ensure re-use of the logic around there for context-sensitive conditions which relate to caching. It can probably be refactored to bypass the genex evaluation though. Thanks, Steve. -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers