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
demakedepf90
. Utiliser la fonction addprefix demake
:$(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
ettest_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
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}
.