Préprocesseur

  • Possibilité d'inclure dans le code Fortran des lignes destinées au préprocesseur du langage C.
  • Le préprocesseur passe avant la compilation proprement dite. Il filtre des lignes de texte ou remplace des chaînes de caractères.

Exemples

#ifdef HAVE_MPI
    use mpi_f08
#endif

Une option de compilation dit si la "macro" HAVE_MPI est définie ou non.

integer, parameter:: wp = CPP_WP ! working precision for real type
real(wp) ...

Une option de compilation dit par quoi la macro CPP_WP doit être remplacée.

Impact sur le système de compilation

La possibilité d'utiliser le préprocesseur ne change presque rien au système de compilation. Essentiellement, la question se règle via les suffixes des noms de fichiers et des options de compilation supplémentaires.

Le suffixe .F (ou .F90) au lieu de .f (ou .f90) indique au compilateur que le fichier doit passer par le préprocesseur.

Si le programme est constitué d'un mélange de fichiers .f et .F alors la création de la liste des objets par :

objects := $(sources:.f=.o)

ou bien :

objects := $(sources:.F=.o)

ne marche plus. Utiliser les fonctions addsuffix et basename de make :

objects := $(addsuffix .o, $(basename ${sources}))

Options de définition de macros

make reconnaît la variable CPPFLAGS comme contenant les options à passer au préprocesseur. Cf. dans la base de données de make la règle %.o: %.F et la variable compile.F, à comparer à %.o: %.f et la variable compile.f.

L'option définissant une macro est (probablement tous les compilateurs) -D. Exemples :

-DHAVE_MPI -DCPP_WP='kind(0.)'

makedepf90 a aussi l'option -D. Il suffit donc en général de passer ${CPPFLAGS} à makedepf90.