Compléments

Plusieurs répertoires sources

  • Cas où les fichiers composant le programme ou la bibliothèque sont répartis dans plusieurs répertoires.
  • Peut être traité simplement avec make à condition qu'il n'y ait pas de fichiers homonymes.
  • Créer le makefile à la racine de l'arborescence du code.

  • Lister les répertoires et sous-répertoires relatifs à la racine de l'arborescence du code (sans inclure le répertoire racine), séparés par des espaces, dans la variable VPATH. VPATH pour view path.

  • Les produits de la compilation sont créés à la racine de l'arborescence.

  • Il faut indiquer à makedepf90 de chercher les sources dans les différents répertoires, avec l'option -I de makedepf90. Utiliser la fonction addprefix de make : $(addprefix -I, ${VPATH})

Manipulation 10

Écrire le makefile pour la bibliothèque Jumble, sachant que :

  • Cette bibliothèque n'utilise aucune autre bibliothèque.
  • Un des fichiers doit passer par le préprocesseur et la macro CCP_WP doit être définie. Choisir par exemple : CPP_WP='kind(0.)'

  • Les fichiers test_ifirstloc.f, test_nr_util.f, test_eigval.f et test_greg2jd.f contiennent des programmes principaux de test et ne font donc pas partie de la bibliothèque.

Tester la compilation.

Nota bene : les sources Fortran contiennent des lignes include de fichiers.h mais il n'y a rien de plus à faire dans le makefile. makedepf90 tient compte de ces .h automatiquement. Cf. le fichier depend.mk créé.

Nota bene : l'option CPPFLAGS n'est utilisée que pour le fichier nrtype.F. Cf. les commandes créées par make.

Nota bene : make crée automatiquement les commandes de compilation avec le bon chemin.

Passer en mode non déterministe de ar et tester.

Plusieurs cibles (non fictives)

  • make ne limite pas le nombre de cibles (exécutables, bibliothèques etc.) insérées dans un makefile.
  • Convention : créer une cible fictive all qui regroupe les principales cibles du makefile. Cette cible devrait être la première du makefile.

Manipulation 11

  • Ajouter dans le makefile de Jumble les cibles pour les programmes de test : faire dépendre les exécutables de la bibliothèque.
  • Ajouter une cible fictive all.
  • Ne pas oublier d'ajouter les exécutables tests dans la recette de clean.

Compilation parallèle

dependencies

On voit sur cet exemple la possibilité de principe de compilation de certains fichiers en parallèle : fou2, plouf3 et plouf1, puis, dès que foo2.o existe, foo1 et bar, etc.

make crée le graphe de dépendances et sait exploiter cette possibilité. Utiliser l'option -j de make pour spécifier un nombre de tâches parallèles. Exemple :

make -j 4

On gagne en temps de compilation si suffisamment de cœurs sont disponibles.

Pour utiliser le suffix .f90

Si vous souhaitez que vos sources Fortran aient les suffixes .f90 ou .F90 et non .f ou .F, ajoutez dans votre makefile les règles implicites suivantes, qui sont calquées sur les règles de la base de données de make pour .f et .F.

Pour le makefile d'un programme à un seul fichier créant directement l'exécutable à partir du source (pas de séparation entre compilation de l'objet et édition de lien), ajouter :

%: %.f90
    $(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@

ou bien :

%: %.F90
    $(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@

Nota bene : vous n'avez pas à redéfinir LINK.f ni LINK.F, ni à créer de variable supplémentaire.

Pour le makefile d'un code à plusieurs fichiers (avec séparation entre compilations des objets et édition de lien), ajouter :

%.o: %.f90
    $(COMPILE.f) $(OUTPUT_OPTION) $<

ou :

%.o: %.F90
    $(COMPILE.F) $(OUTPUT_OPTION) $<

Nota bene : vous n'avez pas à redéfinir COMPILE.f ni COMPILE.F, ni à créer de variable supplémentaire.

Création de TAGS

Pour les utilisateurs d'Emacs ou Vi, possibilité de créer un index des identificateurs dans un ensemble de fichiers sources, pour pouvoir sauter à la définition d'un identificateur.

Le programme qui crée l'index s'appelle Exuberant Ctags. L'installer avec le gestionnaire de paquets de votre distribution Linux. Sur Ubuntu :

apt install exuberant-ctags

Le fichier contenant l'index est appelé TAGS. Le makefile a la liste des sources et est donc le bon endroit pour créer ou mettre à jour le fichier TAGS.

Pour un fichier TAGS pour Emacs, ajouter dans le makefile la règle :

TAGS: ${sources}
    ctags -e --language-force=fortran $^

Pour Vi, enlever l'option -e de ctags.

$^ est une "variable automatique" de make : l'ensemble des prérequis de la règle courante. Donc ici ${sources}.

Génération automatique de graphiques PDF pour LaTeX

Références sur make