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 programme test_netcdf90.f90.
  • Utiliser les modules FindNetCDF.cmake et FindNetCDF_Fortran.cmake du dépôt lguez/cmake.

Rappel : modes module et config de find_package

Attention :

  • mode module : find_package sans le mot-clef CONFIG, utilise Find<PackageName>.cmake dans le répertoire source du projet utilisateur de PackageName.
  • mode config : find_package avec le mot-clef CONFIG, 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 programme max_diff_rect, qui utilise la bibliothèque Jumble. Remarquez que Jumble va automatiquement chercher NR_util, dont il a besoin.
  • Récrire le CMakeLists.txt en faisant comme si Jumble et NR_util n'étaient pas compilés avec CMake (c'est-à-dire en n'utilisant pas find_package).