Zunächst der Anruf:
include(FindPkgConfig)
sollte ersetzt werden durch:
find_package(PkgConfig)
Der find_package()
Anruf ist flexibler und ermöglicht Optionen wie REQUIRED
, die Dinge automatisch erledigen, mit denen man manuell arbeiten müsste include()
.
Zweitens sollte ein manueller Anruf pkg-config
nach Möglichkeit vermieden werden. CMake enthält eine Reihe von Paketdefinitionen, die unter Linux unter zu finden sind /usr/share/cmake-3.0/Modules/Find*cmake
. Diese bieten dem Benutzer mehr Optionen und Auswahlmöglichkeiten als ein roher Anruf an pkg_search_module()
.
Was den erwähnten hypothetischen target_use()
Befehl betrifft, hat CMake diesen bereits in gewisser Weise mit PUBLIC | PRIVATE | INTERFACE eingebaut. Ein Aufruf wie target_include_directories(mytarget PUBLIC ...)
bewirkt, dass die Include-Verzeichnisse automatisch in jedem Ziel verwendet werden mytarget
, das z target_link_libraries(myapp mytarget)
. Dieser Mechanismus scheint jedoch nur für Bibliotheken zu gelten, die in der CMakeLists.txt
Datei erstellt wurden, und funktioniert nicht für Bibliotheken, die mit erworben wurden pkg_search_module()
. Der Anruf add_library(bar SHARED IMPORTED)
könnte dafür verwendet werden, aber ich habe das noch nicht untersucht.
Die Hauptfrage funktioniert hier in den meisten Fällen:
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})
Das SDL2_CFLAGS_OTHER
enthält Definitionen und andere Flags, die für eine erfolgreiche Kompilierung erforderlich sind. Die Flaggen SDL2_LIBRARY_DIRS
und SDL2_LDFLAGS_OTHER
sind aber immer noch ignoriert, keine Ahnung , wie oft , dass ein Problem werden würde.
Weitere Dokumentation hier http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html
IMPORTED_TARGET
erfordert CMake 3.6 oder neuer.