Compléments

FetchContent

La problématique :

  • Vous avez sur des dépôts un programme et des bibliothèques dont dépend ce programme.
  • Vous voulez simplifier la vie de l'utilisateur : qu'il n'ait pas à télécharger et compiler séparément chaque bibliothèque (et dans le bon ordre s'il y a des dépendances entre elles).

Une solution si les bibliothèques peuvent être compilées avec CMake : le module FetchContent.

include(FetchContent)
FetchContent_Declare(<name> GIT_REPOSITORY <url>)
...
FetchContent_MakeAvailable(<name1> [<name2>...])

L'ordre peut être quelconque même s'il y a des dépendances entre les bibliothèques téléchargées.

Les bibliothèques sont téléchargées au moment de la configuration. Elles sont ajoutées au projet comme avec la commande add_subdirectory.

La commande option

option(optVar helpString)

définit une variable de cache optVar, de type logique, dont la valeur par défaut est "False". C'est un raccourci pour :

set(optVar False CACHE BOOL helpString)

Manipulation 32

  • Modifiez le fichier CMakeLists.txt de max_diff_rect pour offrir l'option de télécharger automatiquement les bibliothèques nécessaires. Adresses : https://github.com/lguez/NR_util, https://github.com/lguez/Jumble
  • Remarquez que si l'utilisateur choisit le téléchargement alors, après la configuration, le répertoire _deps est créé dans le répertoire de compilation.

MPI

Pour compiler un programme utilisant MPI :

find_package(MPI REQUIRED)
target_link_libraries(<target> ... PRIVATE MPI::MPI_Fortran)

Nota bene : CMake n'utilise pas le wrapper du compilateur pour MPI. Il est possible d'avoir un exécutable compilé sans MPI dans le même projet.

Si vous utilisez le module mpi_f08 (conseillé) dans votre code source Fortran, vous pouvez vérifier à la configuration que votre version de MPI est suffisamment récente. Le module FindMPI, qui est utilisé par find_package(MPI), définit la variable logique MPI_Fortran_HAVE_F08_MODULE.

Manipulation 33

Écrivez le fichier CMakeLists.txt pour le programme hello_MPI_Fortran. Vérifiez la disponibilité de mpi_f08.

Problèmes de richesse

Si vous avez plusieurs compilateurs sur votre machine, ou plusieurs versions de bibliothèques, comment orienter CMake vers l'un ou l'autre ?

Si votre environnement est contrôlé par la commande module, chargez les modules que vous souhaitez utiliser, et de préférence seulement ceux-là, avant de lancer CMake. Pour choisir un compilateur, utilisez la variable d'environnement FC. Par exemple :

FC = ifort cmake ..

ou

FC = ifort cmake-gui ..

Vous ne pouvez pas relancer cmake avec un autre compilateur, en gardant le reste de votre configuration. Pour changer de compilateur, vous devez repartir de zéro : tout effacer dans le répertoire de compilation (ou créer un autre répertoire de compilation).

Si CMake ne choisit pas la bonne version d'une bibliothèque, utilisez la variable CMAKE_PREFIX_PATH. Vous n'avez pas besoin de repartir de zéro (c'est-à-dire d'effacer le répertoire de compilation) pour changer de version d'une bibliothèque. Supprimez la variable pointant vers cette bibliothèque : bouton dans cmake-gui ou option -U de cmake.

Si CMake ne choisit pas la bonne version de la bibliothèque MPI, définir la variable de cache MPIEXEC_EXECUTABLE (type FILEPATH) pointant vers le mpiexec de la bonne bibliothèque.