По-перше, дзвінок:
include(FindPkgConfig)
слід замінити на:
find_package(PkgConfig)
find_package()
Виклик є більш гнучким і дозволяє такі опції, як REQUIRED
, що робити речі автоматично , що можна було б зробити вручну include()
.
По-друге, pkg-config
слід уникати викликів вручну, коли це можливо. CMake постачається з багатим набором визначень пакетів, які можна знайти в Linux під /usr/share/cmake-3.0/Modules/Find*cmake
. Вони надають для користувача більше опцій та вибору, ніж незворотний дзвінок pkg_search_module()
.
Що стосується згаданої гіпотетичної target_use()
команди, CMake вже має таку вбудовану функцію з PUBLIC | PRIVATE | INTERFACE. Виклик , як target_include_directories(mytarget PUBLIC ...)
змусить включати каталоги , які будуть автоматично використовуватися в будь-якої мети , яка використовує mytarget
, наприклад target_link_libraries(myapp mytarget)
. Однак, здається, цей механізм призначений лише для бібліотек, створених у CMakeLists.txt
файлі, і не працює для бібліотек, придбаних за допомогою pkg_search_module()
. Дзвінок add_library(bar SHARED IMPORTED)
може бути використаний для цього, але я ще не вивчав це.
Що стосується основного питання, то це тут працює в більшості випадків:
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})
SDL2_CFLAGS_OTHER
Містить визначення та інші прапори , необхідні для успішної компіляції. Прапори SDL2_LIBRARY_DIRS
і SDL2_LDFLAGS_OTHER
не менше по- , як і раніше ігноруються, ні найменшого уявлення про те , як часто , що б стати проблемою.
Більше документації тут http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
IMPORTED_TARGET
вимагає CMake 3.6 або новішої версії.