First off, the call:
include(FindPkgConfig)
should be replaced with:
find_package(PkgConfig)
The find_package()
call is more flexible and allows options, such as REQUIRED
, that do things automatically that one would have to do manually with include()
.
Secondly, manually calling pkg-config
should be avoided when possible. CMake comes with a rich set of package definitions, found on Linux under /usr/share/cmake-3.0/Modules/Find*cmake
. These provide more options and choice for the user than a raw call to pkg_search_module()
.
As for the mentioned hypothetical target_use()
command, CMake already has that built-in in a way with PUBLIC|PRIVATE|INTERFACE. A call like target_include_directories(mytarget PUBLIC ...)
will cause the include directories to be automatically used in every target that uses mytarget
, e.g., target_link_libraries(myapp mytarget)
.
However, this mechanism seems to be only for libraries created within the CMakeLists.txt
file and does not work for libraries acquired with pkg_search_module()
. The call add_library(bar SHARED IMPORTED)
might be used for that, but I haven't yet looked into that.
As for the main question, this here works in most cases:
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
...
target_link_libraries(testapp ${SDL2_LIBRARIES})
target_include_directories(testapp PUBLIC ${SDL2_INCLUDE_DIRS})
target_compile_options(testapp PUBLIC ${SDL2_CFLAGS_OTHER})
The SDL2_CFLAGS_OTHER
contains defines and other flags necessary for a successful compile. The flags SDL2_LIBRARY_DIRS
and SDL2_LDFLAGS_OTHER
are however still ignored, no idea how often that would become a problem.
More documentation here: CMake Documentation — FindPkgConfig.
IMPORTED_TARGET
requires CMake 3.6 or newer. – Vue