Comment utiliser une bibliothèque compilée sans CMake ?
La meilleure façon est de passer par un "module de recherche", en anglais find module, de CMake.
Modules de recherche de CMake
Même si la bibliothèque n'a pas été compilée avec CMake, il peut exister un "module de recherche" de CMake pour cette bibliothèque.
Le module de recherche contient du code CMake qui :
- cherche la bibliothèque dans des endroits standard, utilisant éventuellement d'autres logiciels comme pkg-config pour trouver la bibliothèque ;
- crée une cible dans CMake, avec des propriétés d'interface, cible qui peut être utilisée comme si la bibliothèque correspondante avait été compilée avec CMake.
Le module de recherche est un fichier dont le nom est de la forme
Find<PackageName>.cmake
. Un ensemble de modules de
recherche
est distribué avec CMake lui-même. Le module de recherche peut être
écrit par un tiers (chercher sur internet, sur Github etc. si
quelqu'un en a écrit un pour la bibliothèque qui vous intéresse).
Utilisation d'un module CMake pour trouver une bibliothèque
Si ce n'est pas un module de recherche distribué avec CMake, le
télécharger dans votre arborescence source. Dans CMakeLists.txt
,
donner le chemin de ce module. Par exemple :
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
Faire appel au module avec la commande :
find_package(PackageName REQUIRED)
sans le mot-clef CONFIG (à la différence de la recherche d'une bibliothèque compilée avec CMake).
Manipulation 30
- Écrire le fichier
CMakeLists.txt
pour le programmetest_netcdf90.f90
. - Utiliser les modules
FindNetCDF.cmake
etFindNetCDF_Fortran.cmake
du dépôt lguez/cmake.
Rappel : modes module et config de find_package
Attention :
- mode module :
find_package
sans le mot-clefCONFIG
, utiliseFind<PackageName>.cmake
dans le répertoire source du projet utilisateur de PackageName. - mode config :
find_package
avec le mot-clefCONFIG
, utilise<PackageName>Config.cmake
dans le répertoire de compilation de PackageName ou dans un répertoire d'installation.
Utilisation d'une bibliothèque sans module de recherche
Pour utiliser une bibliothèque non compilée par CMake et pour laquelle vous n'avez pas de module de recherche, utilisez les commandes :
find_path(<VAR> name REQUIRED)
Cherche le répertoire contenant le fichier name, résultat dans
<VAR>
. Xxx_INCLUDE_DIR
est un nom conventionnel pour <VAR>
.
find_library(<VAR> name REQUIRED)
Cherche la bibliothèque name. Donner name sans préfixe (lib
) ni
suffixe (.a
ou .so
). En sortie, <VAR>
contient le nom complet,
avec le chemin absolu et le préfixe et le suffixe. Xxx_LIBRARY
est
un nom conventionnel pour <VAR>
.
Ces deux commandes cherchent dans les répertoires standard. Vous
pouvez donner un répertoire supplémentaire où chercher avec la
variable CMAKE_PREFIX_PATH
.
Les variables définies par les deux commandes sont des variables de cache. Vous pouvez imposer leur valeur à l'installation.
Utilisez les variables obtenues :
target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> ${Xxx_INCLUDE_DIR})
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> ${Xxx_LIBRARY})
Manipulation 31
- Écrire le
CMakeLists.txt
pour le programmemax_diff_rect
, qui utilise la bibliothèque Jumble. Remarquez que Jumble va automatiquement chercherNR_util
, dont il a besoin. - Récrire le
CMakeLists.txt
en faisant comme si Jumble etNR_util
n'étaient pas compilés avec CMake (c'est-à-dire en n'utilisant pasfind_package
).