[CMake] link_libraries vs target_link_libraries

Andreas Pakulat apaku at gmx.de
Mon Nov 10 09:16:57 EST 2008

On 10.11.08 12:01:13, Fernando Cacciola wrote:
> The CGAL library (www.cgal.org) uses cmake as build system. Thus, our  
> users do:
> find_package(CGAL REQUIRED)
> include( ${CGAL_USE_FILE} )
> ...
> UseCGAL.cmake, as all such files, call include_directories,  
> add_definitions and overrides (under certain circumstances) the  
> compiler/linker flags that were used to build the CGAL library.
> These are all settings that affect any target added after the inclusion  
> of UseCGAL.cmake.
> However, following the recommended practice (according to the  
> documentation of the deprecated link_libraries command), UseCGAL DOES  
> NOT call link_libraries. Instead, it realies on the user calling  
> target_link_libraries himself.
> Well, I'm questioning this recommended practice because it's half baked:  
> It makes sense to allow users to control which targets are linked  
> against CGAL, but NOT if OTOH they cannot control which targets are  
> given the CGAL include directories, definitions and flags.
> That is, IMO, target_link_libraries makes little sense in the absence of  
> target_include_directories, target_add_definitions and target_*_FLAGS.
> What it's so special about linking that only that command can be made  
> target specific???
> Or am I missing something?

There are projects that have headers that are usable without linking
against any library. There are also projects installing their headers into
a common place, that have multiple libraries. In that latter case you'd
have include_directories() point to the common place for the headers, but
obviously you can't know which of the libraries needs to be linked in.

Boost is a good example (albeit it doesn't use cmake to build itself).
There are various libraries shipped with it, they all install their headers
into <includedir>/boost/<libraryname>/ and the libs are of course directly
in <libdir>. And its common practice to have only <includedir>/boost in the

For the case of a single library with a few headers, for which a UseXXX
file is provided the requirement really doesn't make much sense (IMHO) -
unless you can use some of the headers without linking.


Don't read any sky-writing for the next two weeks.

More information about the CMake mailing list