[CMake] Get linker flags / include directories for a library target

Unknown ax487 at gmx.de
Fri Dec 28 18:04:30 EST 2018


I would like to thank all of you for your suggestions. I have gathered
the following (correct me if I am wrong):

- The LINK_FLAGS target property is used in cmake 2.x, the
  INTERFACE_LINK_LIBRARIES in cmake 3.x, the latter contains a ;-list
  of libraries.
- The list may contain generator expressions, it is however
  possible to to use file(GENERATE ..) to obtain evaluate those.
- In any case, the library list contains libraries having different 
  formats (see [1]), full paths, (imported) targets, and plain names.
- When Makefiles (or files for other build systems) are generated,
  the list is turned into -L/-l flags used by ld. This happens
  on the C++ side of things, the functionality is not exposed
  to cmake scripts.

As for automatic generation of a pkg-config .pc file, there have
been some inquiries ([2], [3], and [4]), the last one being rather
recent.

The answers point out that pkg-config files can be generated using
configure_file(...), that cmake has its own (imported target) method
for handling dependencies.

I don't mean to be disrespectful or unappreciative of the work put
into cmake (in fact I think it is a vast improvement over automake),
but since there is no way to obtain the required information
programatically, all users of my library have to either use
cmake themselves, or use non-portable workarounds which are prone
to break sooner than later. 

If I want to use an external tool (think setup.py) to build
extensions (in-place or not), the same problem occurs.

This is rather disappointing to be honest...

ax487



[1] 
https://cmake.org/cmake/help/latest/command/target_link_libraries.html
[2] https://cmake.org/pipermail/cmake/2006-August/010747.html
[3] https://cmake.org/pipermail/cmake/2008-January/019533.html
[4] https://cmake.org/pipermail/cmake/2018-March/067289.html

On Mon, 2018-12-24 at 10:46 -0500, Robert Maynard wrote:
> That functionality exists in the C++ side of the code base and is run
> during the 'generate' stage  ( CMakeLists are parsed during
> 'configure', than a 'generate' step is run ).
> 
> To get access to how import targets and generator expressions are
> resolved you have two options.
> 1. You can try to use file(GENERATE but it doesn't support all the
> generator expressions currently
> 2. You use cmake-server
> (https://cmake.org/cmake/help/latest/manual/cmake-server.7.html) to
> query a build directory for all this information.
> 
> On Fri, Dec 21, 2018 at 9:12 AM Unknown <ax487 at gmx.de> wrote:
> > Hello Kai,
> > 
> > thanks for your suggestion. I tried the property,
> > but I just got "foo_linker_flags-NOTFOUND" as a
> > result (I am using cmake 3.13.1 btw). The
> > same goes for
> > 
> > LINK_OPTIONS, and
> > INTERFACE_LINK_OPTIONS.
> > 
> > I tried using the INTERFACE_LINK_LIBRARIES property
> > instead. The resulting list contains things I can use,
> > such as /usr/lib/libz.so
> > 
> > However, I am using another cmake imported library.
> > Therefore, the list contains some libbaz::libbaz
> > dependency as well.
> > 
> > In order to get the actual list of libraries, I would
> > have to also resolve these names.
> > 
> > But this has to be done somewhere during the
> > generation of the Makefiles, so that functionality
> > must exist somewhere in cmake.
> > 
> > 
> > On Fri, 2018-12-21 at 09:33 +0100, Kai Wolf wrote:
> > > You can ask a CMake build target for its properties using
> > > get_target_property().
> > > For instance, to retrieve the linker flags for a given target
> > > foo,
> > > you’d write:
> > > 
> > >     get_target_prooperty(foo_linker_flags foo LINK_FLAGS)
> > > 
> > > See [1] for a list of valid parameters.
> > > 
> > > Greetings,
> > > 
> > > Kai
> > > 
> > > [1]
> > > https://cmake.org/cmake/help/latest/manual/cmake-properties.7.html#properties-on-targets
> > > 
> > > http://kai-wolf.me
> > > http://effective-cmake.com
> > > 
> > > > Am 20.12.2018 um 23:14 schrieb Unknown <ax487 at gmx.de>:
> > > > 
> > > > Dear community,
> > > > 
> > > > I have been wondering on multiple occasions about how to get
> > > > the
> > > > linker flags (i.e. all -llib -Ldir) and include flags (-Idir)
> > > > for a library (i.e. a target added to the project using
> > > > add_library) within a cmake.
> > > > 
> > > > There are many cases in which the flags are required,
> > > > noticeably
> > > > generating a suitable pkg-config file or creating a wrappers
> > > > around
> > > > C/C++ libraries.
> > > > 
> > > > I think that it should be possible to derive the flags from
> > > > some of the target properties of the library, but I don't
> > > > know exactly how.
> > > > 
> > > > Could you give me a hand?
> > > > 
> > > > ax487
> > > > 
> > > > --
> > > > 
> > > > 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:
> > > > https://cmake.org/mailman/listinfo/cmake
> > 
> > --
> > 
> > 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:
> > https://cmake.org/mailman/listinfo/cmake



More information about the CMake mailing list