Primero de, la llamada:
include(FindPkgConfig)
debe ser reemplazado por:
find_package(PkgConfig)
La find_package()
llamada es más flexible y permite opciones como REQUIRED
, que hacen cosas automáticamente con las que uno tendría que hacer manualmente include()
.
En segundo lugar, las llamadas manuales pkg-config
deben evitarse cuando sea posible. CMake viene con un amplio conjunto de definiciones de paquetes, que se encuentran en Linux en /usr/share/cmake-3.0/Modules/Find*cmake
. Estos brindan más opciones y opciones para el usuario que una llamada sin procesar pkg_search_module()
.
En cuanto al target_use()
comando hipotético mencionado , CMake ya lo tiene incorporado de alguna manera con PUBLIC | PRIVATE | INTERFACE. Una llamada como target_include_directories(mytarget PUBLIC ...)
hará que los directorios de inclusión se utilicen automáticamente en cada destino que utilice mytarget
, por ejemplo target_link_libraries(myapp mytarget)
. Sin embargo, este mecanismo parece ser solo para bibliotecas creadas dentro del CMakeLists.txt
archivo y no funciona para bibliotecas adquiridas conpkg_search_module()
. La llamadaadd_library(bar SHARED IMPORTED)
podría usarse para eso, pero aún no lo he investigado.
En cuanto a la pregunta principal, esto aquí funciona en la mayoría de los casos:
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})
El SDL2_CFLAGS_OTHER
contiene define y otras banderas necesarios para una compilación exitosa. Las banderasSDL2_LIBRARY_DIRS
SDL2_LDFLAGS_OTHER
Sin embargo, las y aún se ignoran, no tengo idea de la frecuencia con la que eso se convertiría en un problema.
Más documentación aquí http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
IMPORTED_TARGET
requiere CMake 3.6 o más reciente.