r.compile

Compile simultanément des sources en Fortran (.f, .ftn, .ptn, .f90, .ftn90, .cdk90) et/ou en C (.c) avec les options de compilations nécessaires pour assurer la compatibilité avec la librairie librmn correspondante et crée sur demande un exécutable pour la plateforme spécifiée. À moins de besoins très spécifiques, très peu d'options de compilation auront à être spécifiées puisque l'utilisation des clés appropriées avec r.compile apporte les ajustements nécessaires aux compilateurs (répertoires de recherche des librairies et des fichiers à inclure, options particulières de compilation, etc...).

Par défaut, le script compile selon l'architecture locale. Cependant, ce script est particulièrement pratique pour la compilation sur pollux afin de créer des exécutables pour les NEC SX6 via l'utilisation des cross-compiler sxf90 et sxcc. Il remplace les scripts de la famille f7732, devenus obsolètes.

Usage

 
 r.compile  
-src fich1.f fich2.f90 fich3.ftn fich4.c fich5.cdk90 sources (maximum 1024 fichiers)
-opt =-option1 =-option2 Options supplémentaires globales(à n'utiliser que si le script n'inclut pas certains flags très particuliers)
-optc =-option1 =-option2 Options supplémentaires pour le compilateur C (à n'utiliser que si le script n'inclut pas certains flags très particuliers)
-optf =-option1 =-option2 Options supplémentaires pour le compilateur Fortran (à n'utiliser que si le script n'inclut pas certains flags très particuliers)
-defines =-Dnom1=def1:-Dnom2=def2... Définitions additionnelles (à n'utiliser que pour des définitions très particulières au code)
-includes path1 path2 Répertoires contenant les inclusions additionnelles
-n64 [_o32] Mode de compilation 64 bits (ou o32 si -n64 _o32)
-multi Mode multi (vs stack)
-mpi [stubs] Mode MPI.Utiliser l'argument "stubs" permet d'utiliser du code MPI en lançant l'éxécutable directement, sans "mpirun" sur un seul processeur, sans charger la librairie MPI.
-shared Shared objects
-fast Option FAST sur SX
-options_comp Si utilisation de CoMpIlAtIoN_OpTiOnS dans le code
-obj Fichiers objets supplémentaires à rajouter pour la création d'un exécutable
-abi Variable $ABI (prioritaire sur -n64, -multi)
-arch Architecture de destination (HP-UX, IRIX64, SX6, Linux, Linux_alpha, AIX) des objets et de l'exécutable. Dans le cas des SX. les compilateurs sxf90 et sxcc sont utilisés.
-bidon [lang] Si r.makebidon est necessaire. Le fichier bidon généré sera en fortran ou en c, selon la valeur de la clé (fortran par défaut). (À utiliser dans le cas ou un programme ne contient que des sous-routines: r.makebidon crée un "main" qui appelera une sous-routine de départ). 
-main Nom du ou des sous-routines à appeler pour r.makebidon (voir exemple)
-o  Nom de l'absolu si désiré
LIBRAIRIES VOIR EXEMPLES PLUS BAS
-libpath Path de librairies supplémentaires (si certaines librairies sont dans des répertoires très particuliers non-spécifiés par le script) 
-libappl Usage de librairies d'applications particulières
-libgraph Utilisation de la librairie NCAR locale
-libsys Utilisation de librairies systèmes supplémentaires
-librmn Utilisation de la Librairie RMN
-libpriv Usage de la librairie priv (routines FFT et assembleur pour le NEC principalement)
-O Niveau d'optimisation (-O 0...4) 
-debug Option de déboggage des compilateurs
-fstd89 Utilisation de la version 89 des fichiers standards au lieu de la version en cours
-modele Usage des librairies d'un modele particulier (ANAL, PHY, MC2,etc...)
-version Détermine la version particulière du modèle (spécifié avec -modele) à utiliser (n'entrer que le numéro de version, 4.8.9 par ex.).
-P Pre-processing seulement (génération des .f à partir des .ftn (via r.ftntof) et une passe sur les .c avec cpp)
-conly Construction de l'absolu avec cc (ou sxcc) au lieu de f90 (sxf90)
-log Redirige les messages d'erreurs et les sorties standards vers le fichier spécifié.
-liste Produit dans le fichier spécifié une liste des fichiers sources traités avec leur statut (erreur ou ok) Imprime aussi la liste des librairies spécifées par l'usager
-ignorerr Ignore les erreurs de compilation
-bindir Répertoire de destination des binaires (.o)
-codebeta module Utilise "$ARMNLIB/lib/$FULL_ABI/module.o" plutôt que des sous-routines de librairies
-ignoreempty Si un .ftn (.f90) produit un .f (.f90) vide, ce dernier ne sera pas compilé, sans interruption de la compilation.
-use_malib
Charge les .o de la librairie spécifiée par son chemin complet. À n'utiliser qu'avec de petites librairies temporaires, cette option ne doit pas remplacer -libappl
-prof
Ajoute les options nécessaires à l'utilisation d'un "profiler".
-openmp
Ajoute les options nécessaires à l'utilisation de OpenMP.

Recherche des librairies et fichiers "includes":

Selon la valeur de la clé -arch et -abi, la recherche s'ajuste afin de charger des librairies compatibles avec l'exécutable en cours de compilation. Dans le script, les valeurs des clés -arch et -abi sont stockées dans les variables $arch et $abi respectivement. Une variable plus globale, $FULL_ABI est construite selon les options spécifiées. Par exemple:
 
 
Clés spécifiées $FULL_ABI correspondant
-arch SX6 -multi SX6_multi
-arch IRIX64 -n64 _o32 IRIX64_o32
-arch IRIX64  IRIX64
-arch HP-UX  HP-UX
-arch Linux Linux

Les librairies demandées sont trouvées dans les répertoires suivants, dans l'ordre:

-$libpath si la clé -libpath est spécifiée
-$HOME/userlibs/$FULL_ABI
-$ARMNLIB/modeles/$modele/v_$version/lib/$FULL_ABI si les clés -modele et/ou -version sont utilisées
-$ARMNLIB/lib/$FULL_ABI

Les fichiers à inclure sont recherchés dans:

-$ARMNLIB/include/$FULL_ABI

Les options de compilations sont lues dans $ARMNLIB/include/$FULL_ABI/Compiler_rules et on peut ajouter au besoin des options personnelles dans un fichier nommé Compiler_rules se trouvant dans le répertoire $HOME/userlibs/$FULL_ABI.

Par défaut, les clés suivantes ont la valeur:

-arch : `uname -s` (retourne le nom de la plateforme)
-librmn: rmn (utilise librmn.a dans le répertoire approprié)
-libgraph: graph (utilise libgraph.a dans le répertoire approprié)
-version: current

Si l'option -o est spécifiée (construction d'un absolu), ce ne sont que les objets existants et lisibles (ceux dont un ls retourne un "exit code" de 0)  qui sont passés au compilateur. Dans le cas où un objet serait inexistant, un avertissement s'affiche à l'écran et la compilation se poursuit avec les objets restant (ceci permet par exemple de faire un r.compile -src *.f -obj dosier/*.o   -o exec.out sans problème même si dossier/*.o est vide)

Le script affiche les commandes de compilation qu'il effectue. Si la compilation ne se termine pas normalement (exit status différent de 0), un message d'erreur est affiché.

Le script utilise cclargs, mais sans le séparateur ":". Il faut utiliser les guillemets pour donner plus d'une définition à une clé, par exemple -libappl "rpn_comm gem mc2 phy" plutôt que -libappl rpn_comm:gem:mc2:phy

Exemples (voir aussi r.build)

1. Compilation de tous les .f et les .c du répertoire pour le SX6

r.compile -src *.f *.c -arch SX6


2. Idem pour SX6 avec la construction d'un absolu a la fin en utilisant librmn et MPI

r.compile -src *.f *.c -arch SX6 -mpi -librmn -o a.out


Utilisation de r.makebidon (en c) pour un appel a la sous-routine "test" du fichier test.ftn (on invoque l'executable avec a.out -test) avec optimisation du second niveau et envoi des .o dans $TMPDIR

r.compile -src test.ftn  -bidon c -main test -o a.out -O 2 -bindir $TMPDIR


4. Utilisation d'autres librairies et du mode o32 (SGI)

r.compile -n64 _o32 -src test.c -o a.out -librmn rmnbeta32stack -libappl rpn_comm -mpi
ou
r.compile -abi _o32 -src test.c -o a.out -librmn rmnbeta32stack -libappl rpn_comm -mpi

      


5. Utilisation de librairies hors des répertoires standards (ici libtoto.a dans ~armnluc)

r.compile -src test.c -o a.out -libpath ~armnluc  -libappl toto  -mpi

 
Auteur: Luc Corbeil (ARMN-SI) - 15 février 2003