cmake
Cerca e usa pacchetti, librerie e programmi installati
Ricerca…
Sintassi
- find_package (pkgname [versione] [EXACT] [QUIET] [REQUIRED])
- includere (FindPkgConfig)
- pkg_search_module (prefisso [REQUIRED] [QUIET] pkgname [otherpkg ...])
- pkg_check_modules (prefisso [REQUIRED] [QUIET] pkgname [otherpkg ...])
Parametri
| Parametro | Dettagli |
|---|---|
| versione (opzionale) | Versione minima del pacchetto definita da un numero maggiore e facoltativamente un numero minore, di patch e di tweak, nel formato major.minor.patch.tweak |
| ESATTO (facoltativo) | Specificare che la versione specificata nella version è la versione esatta da trovare |
| RICHIESTO (facoltativo) | Genera automaticamente un errore e interrompe il processo se il pacchetto non viene trovato |
| QUIET (opzionale) | La funzione non invierà alcun messaggio all'output standard |
Osservazioni
Il metodo
find_packageè compatibile su tutte le piattaforme, mentre la modalitàpkg-configè disponibile solo su piattaforme tipo Unix, come Linux e OSX.Una descrizione completa del
find_packagenumerosi parametri e opzioni nel manuale .Anche se è possibile specificare molti parametri facoltativi come la versione del pacchetto, non tutti i moduli di ricerca utilizzano correttamente tutti quei parametri. Se si verifica un comportamento non definito, potrebbe essere necessario trovare il modulo nel percorso di installazione di CMake e correggere o comprendere il suo comportamento.
Usa find_package e Trova Moduli .cmake
Il modo predefinito per trovare i pacchetti installati con CMake è utilizzare la funzione find_package insieme a un file Find<package>.cmake . Lo scopo del file è definire le regole di ricerca per il pacchetto e impostare variabili diverse, come <package>_FOUND , <package>_INCLUDE_DIRS e <package>_LIBRARIES .
Molti file Find<package>.cmake sono già definiti per impostazione predefinita in CMake. Tuttavia, se non è presente alcun file per il pacchetto necessario, puoi sempre scrivere il tuo e inserirlo in ${CMAKE_SOURCE_DIR}/cmake/modules (o qualsiasi altra directory se CMAKE_MODULE_PATH stato sovrascritto)
Un elenco di moduli predefiniti è disponibile nel manuale (v3.6) . È essenziale controllare il manuale in base alla versione di CMake utilizzata nel progetto, altrimenti potrebbero mancare moduli. È anche possibile trovare i moduli installati con cmake --help-module-list .
C'è un bell'esempio per FindSDL2.cmake su Github
Ecco un CMakeLists.txt base che richiede SDL2:
cmake_minimum_required(2.8 FATAL_ERROR)
project("SDL2Test")
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules")
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})
Usa pkg_search_module e pkg_check_modules
Sui sistemi operativi Unix-like, è possibile utilizzare il programma pkg-config per trovare e configurare i pacchetti che forniscono un file <package>.pc .
Per poter utilizzare pkg-config , è necessario chiamare include(FindPkgConfig) in un CMakeLists.txt . Quindi, ci sono 2 possibili funzioni:
-
pkg_search_module, che controlla il pacchetto e utilizza il primo disponibile. -
pkg_check_modules, che controlla tutti i pacchetti corrispondenti.
Ecco un CMakeLists.txt base che utilizza pkg-config per trovare SDL2 con versione precedente o uguale a 2.0.1:
cmake_minimum_required(2.8 FATAL_ERROR)
project("SDL2Test")
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2>=2.0.1)
include_directories(${SDL2_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})