Hi, Just to let people know how I solved it in the end...
After wondering for a little while, I realised that the following should actually work more robustly: # Get the interface directories of the linked libraries: if( ARG_LINK_LIBRARIES ) # First declare an interface library that will help us collect the # include paths from them: set( _genLibName ${dictname}GeneratorLib ) add_library( ${_genLibName} INTERFACE ) target_link_libraries( ${_genLibName} INTERFACE ${ARG_LINK_LIBRARIES} ) # Now use this interface library to get the include paths: list( APPEND incdirs "$<TARGET_PROPERTY:${_genLibName},INTERFACE_INCLUDE_DIRECTORIES>" ) unset( _genLibName ) endif() In this case it becomes non-important what sort of libraries are given as the LINK_LIBRARIES argument. The intermediate interface library takes care of collecting the include directories from the entities that provide such a thing. Cheers, Attila > On 11 Dec 2015, at 12:58, Attila Krasznahorkay > <attila.krasznahor...@gmail.com> wrote: > > Dear All, > > I'm trying to do something a bit more complicated, so please bear with me... > > In our project we use a special kind of source code generator. Called a > "dictionary generator". (https://root.cern.ch/how/how-use-reflex) To simplify > the life of our users a bit, we provide a helper function for generating > "dictionary libraries", which has a signature like: > > atlas_add_dictionary( MyDictLibrary > MyDictLibrary/MyDictLibraryDict.h > MyDictLibrary/selection.xml > INCLUDE_DIRS ... > LINK_LIBRARIES ... ) > > Now, in order to make sure that the dictionary generation command succeeds, > we need to pull in the public include paths of all the libraries that this > library is supposed to be linked against, recursively. To do this, I do the > following behind the scenes: > > foreach( l ${ARG_LINK_LIBRARIES} ) > # Skip physical libraries: > if( EXISTS ${l} ) > continue() > endif() > # Skip generator expressions: > if( ${l} MATCHES "[$]<" ) > continue() > endif() > # Get the include directories of this library: > list( APPEND includes > "$<TARGET_PROPERTY:${l}:INTERFACE_INCLUDE_DIRECTORIES>" ) > endforeach() > > As long as the users only specify either library targets, or absolute library > path names here, this works well. But I just ran into some issues where this > function is called with a system library name like "rt". So the project > generation bails, complaining that "rt" is not a target. > > Would it be possible to figure out in a generator expression if a given name > is a target or not? Clearly I can't make this decision in an > > if( TARGET ${l} ) > > statement, as the target may only get defined after this function call. > > For now I'll be able to work around this issue, but I wonder if it would be > possible to provide a full-proof implementation that would not be killed by > the users specifying a low-level system library like this in the future. > > Cheers, > Attila -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake