Hi,

Last year, the new INTERFACE_LIBRARY target type was to be part of the 
'target usage requirements' feature, but it was deferred until after 2.8.11. 
It was discussed a bit though, in my point 3 in this thread and some follow 
up messages:  

 
http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/3615/focus=5247

The idea of the INTERFACE_LIBRARY is that it creates no output itself, but 
it can have content in its INTERFACE_* properties. That makes it suitable 
for defining header-only libraries for example like in boost.

My implementation of it is in the INTERFACE_LIBRARY-target-type branch in my 
clone.

Other potential uses for it would be for an umbrella-target. In KDE 
frameworks the libkdecore.so library will no longer be present, but it will 
have been split into several smaller libraries. The kdecore target is 
install(EXPORT)ed as KDE4__kdecore. That target name is rarely used because 
the KDE4_KDECORE_LIBS variable is used instead. So, we will be able to 
populate that variable or a similar one with the smaller libraries for 
compatibility. In the future as imported targets are used more, it might 
make sense to introduce compatibility libraries like that, and the 
INTERFACE_LIBRARY would be a candidate for implementing that. However, in 
that case, the order of libraries resulting from 

 tll(foo directdep1 iface directdep2)

might have an effect. Maybe we could also introduce an ALIAS_LIBRARY or so 
which would be expanded in-place?

Another potential use-case for INTERFACE_LIBRARY/alias is a non-deprecated 
way of aliasing a target. Currently that can be done like this by relying on 
export() being executed at configure-time:

 export(TARGETS foo NAMESPACE BuiltIn:: FILE fooTarget.cmake)
 include(fooTarget.cmake)
 # Use BuiltIn::foo

The new/alternative use would look something like:

 add_library(BuiltIn::foo INTERFACE)
 target_link_libraries(BuiltIn::foo INTERFACE_LINK_LIBRARIES foo)
 # Use BuiltIn::foo


Another use-case (which again is mostly about aliasing) is being able to 
build example code as part of the same build-system or using an external 
package. For example, the QtWidgets examples can be built as part of the Qt 
build, or not by specifying -nomake examples. Any example can also be built 
using an installed Qt.

For a cmake project, a buildsystem for an example application could look 
like this:

 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
   find_package(KArchive NO_MODULE REQUIRED)
 endif()

 add_executable(bzip_example main.cpp)
 target_link_libraries(bzip_example KF5::KArchive)

The problem is that in the case of the example being in the same build-
system as the KArchive target itself, KF5::KArchive has no meaning. The two 
solutions to that are

 1. The Aliasing above
 2. Create a KArchive_LIBRARIES variable and use that in the example

The KArchive_LIBRARIES would be defined as KArchive in the KArchive 
buildsystem and KF5::KArchive in the KArchiveConfig.cmake.

I generally would prefer to not require variables like that (I would like to 
move towards the direct result of install(EXPORT) being a usable and 
conventional Config file), and I think the kind of aliasing allowed by the 
INTERFACE_LIBRARY makes that possible.

 add_library(KArchive ...)
 add_library(KF5::KArchive INTERFACE)
 target_link_libraries(KF5::KArchive INTERFACE_LINK_LIBRARIES KArchive)
 

So, the question is, should we design the INTERFACE_LIBRARY type to be 
suitable for all of these use-cases? Header-only libraries, aliasing of 
single targets, and encapsulating multiple targets (while resulting in a 
somewhat funny, or expected depending how you think of it, link order)?

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

Reply via email to