r.build

Assemble des objets (.o) et crée un exécutable pour la plateforme spécifiée, avec les options de compilations nécessaires pour assurer la compatibilité avec la librairie librmn correspondante et crée 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 inclusions, options particulières de compilation, etc...).

Par défaut, le script compile selon l'architecture locale. Cependant, ce script est particulièrement destiné à 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 est un complément naturel du script r.compile lorsque l'option -o de ce dernier n'a pas été activée.

Usage

 
r.build
-obj fichier.o objets à assembler
-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 pour SX6
-options_comp CoMpIlAtIoN_OpTiOnS dans le code
-obj Fichiers objets à utiliser 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 programmes a appeler pour r.makebidon (voir exemple)
-o Nom de l'absolu (obligatoire)
-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 Librairies d'applications de l'usager
-libgraph Librairie NCAR locale (graph par défaut)
-libsys Librairies systèmes supplémentaires
-librmn Librairie RMN utilisé (rmn par défaut)
-libpriv Librairie priv utilisé
-O Niveau d'optimisation (-O 0...4)
-debug Option de déboggage des compilateurs
-fstd89 Version 89 des fichiers standards
-modele Ajoute les paths nécessaires pour l'usage des librairies d'un modele particulier (ANAL, PHY, 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.).
-conly Construction de l'absolu avec cc (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
-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

Il est maintenant possible  de "déballer" une librairie pour forcer l'usage des .o de cette librairie plutôt que des .o d'une autre librairie (utile pour créer des patches). La façon de procéder: on crée une librairie qui a pour extension .a.fl (fl = force load). Par exemple,
utiliser

r.compile -src ... -libpath ici/lib -libappl "patch full"

fera l'extraction de la librairie ici/lib/libpatch.a.fl dans un répertoire temporaire (équivalent à r.ar x libpatch.a.fl) et utilisera les .o trouvés
plutôt que ce qui pourrait se trouver dans la librairie libfull.a .

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 (cherche les librairies du modele dans le répertoire  ${ARMNLIB}/modeles/${modele}/v_current/lib/${FULL_ABI}
-log: compile.log
-liste: compile.liste

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.build -obj *.o -fstd89 -o exec.out même si *.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

Choix d'un cross-compiler pour les SX

Le script permet maintenant contrôler le crosskit utilisé pour les SX6 en utilisant la variable SX6_OS_REL (par exemple, un export SX6_OS_REL=12.1 avant un r.compile forcera l'usage du crosskit 12.1). Le défaut demeure
12.1 pour SX6.

Exemples (voir aussi r.compile)

1. Assemblage de tous les .o d'un répertoire pour le IBM en créant l'exécutable main.exe

r.build -obj *.o -arch AIX -o main.exe


2. Idem pour SX6 en utilisant librmn et MPI

r.build -obj *.o -arch SX6 -mpi -librmn -o a.out


Utilisation de r.makebidon pour un appel a la sous-routine "test" ou "test1" du fichier test.o (on invoque l'executable avec a.out -test ou a.out -test1)

r.build -obj test.o  -bidon -main test test1 -o a.out

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