Mode d'emploi et manuel de référence

Previous Up

4.2  Extensions

Grace à une suggestion de Andrew Sterian, ePiX est extensible. La méthode préférée est la création d'un module externe à utiliser à la compilation, analogue d'un fichier de stylemacros de LATEX. On peut aussi modifier le code des sources d'ePiX avant de le compiler, c'est rigide (et exige des privilèges d'administrateur) mais peut être utile pour changer les choix par défaut pour tout un système. Les extensions des utilisateurs s'étendent du fichier d'entête ne demandant que quelques connaissances élémentaires de C++ à une bibliothèque, compilée séparément, qui étend les capacités d'ePiX de manière importante.

Fichier d'entête

Un fichier d'entête de C++ (header) a, par convention, le suffixe .h comme dans myheader.h. Pour utiliser un tel fichier d'entête personnalisé, placez la ligne #include "myheader.h" dans le fichier source.

Les définitions de l'utilisateur peuvent être implantées facilement et robustement par des « fonctions en-ligne». Ces fonctions en-ligne sont semblables à des macros mais sont plus sures et ont plus de capacités (puisqu'elles sont manipulées par le compilateur au lieu du préprocesseur). En voici quelques exemples :

  inline void Bold(void) { pen(1.5); }
  inline void purple(void) { rgb(0.5, 0, 0.7); }
  inline void draw_square(double s) { rect(P(-s,-s),P(s,s)); }
  inline double cube(double x) { return x*x*x; }

Le mot-clé void signifie que la fonction ne retourne aucune valeur ou – quand on l'utilise comme paramètre – que la fonction ne prend pas d'argument. Les définitions des fonctions en-ligne sont syntactiquement exactement identiques à celles de fonctions ordinaires mais doivent être placées dans un fichier d'entête ou dans le fichier source dans lequel on les utilise. Les exemples ci-dessus doivent être utilisés dans un fichier d'entrée de la manière suivante :

  Bold();  
  draw_square(cube(1.25));

Compilation

Les prochaines sections esquissent la création d'une « bibliothèque statique» sur GNULinux et expliquent comment incorporer des fonctionnalités personnalisées à la compilation. Les fichiers extras/affine.cc et extras/affine.h illustrent les techniques décrites ci-dessous et peuvent servir de guide et de base pour des essais.

Une petite bibliothèque est, en général, écrite comme un fichier d'entête (header) qui contient des déclarations de fonctions (encore appelées «prototypes») et un fichier source contenant le code effectif. Par convention – sous *nix – ces fichiers ont des extensions .h et .cc respectivement. Entête et source peuvent « inclure» (include) d'autres fichiers d'entête pour incorporer des capacités supplémentaires.

/* my_code.h */
#ifndef MY_CODE
#define MY_CODE
#include <cmath>   // entête de bibliothèque standard de math 
#include "epix.h"  // entête d'ePiX 
using ePiX::P;

namespace Mine {   // pour éviter les conflits de noms 
  // fonctions pour la relativité
  double lorentz_norm(const P&);
  bool   spacelike(const P&);
} // fin de l'espace de noms (namespace)
#endif // MY_CODE

Ce fichier montre deux « caractéristiques de sécurité». Les trois lignes MY_CODE empèchent l'inclusion multiple du fichier. Dans un fichier de cette taille, la protection contre l'inclusion est un excès patent de zèle mais au fur et à mesure que votre base de code grossit et que le nombre de fichier d'entête croît, cette protection devient essentielle. Deuxièmement, l'entête introduit « Mine» comme espace de noms. Dans cet espace de noms, deux fonctions sont déclarées comme prototypes en donnant le type retourné, le nom et les types des arguments de la fonction. Un fichier d'entête devrait être commenté largement afin qu'un ou deux ans plus tard vous puissiez en déchiffrer le contenu. Dans un fichier plus long, il est bon d'écrire des informations quant à la version, l'adresse de contact, un commentaire général décrivant les capacités du fichier et une mention d'une licence.

Ensuite, vient le fichier source correspondant, les définitions y sont placés dans l'espace de noms et doivent correspondre exactement à leur prototypes du fichier d'entête.

/* my_code.cc */
#include "my_code.h"
using namespace ePiX;

namespace Mine {
  double lorentz_norm(const P& arg)
  {
    double x(arg.x1()), y(arg.x2()), z(arg.x3()); 
// extrait les coordonnées
    return (y-x)*(y+x) + z*z; // -x^2 + y^2 + z^2
  }
  bool spacelike(const P& arg)
  {
    return (lorentz_norm(arg) > 0);//vrai s'il y a inégalité
  }
} // end of namespace
 

Des copies de ces fichiers sont inclus avec le code source afin que vous meniez vos expériences avec. Ensuite le source doit être « compilé», «archivé» et « indexé». Dans les commandes suivantes, le signe % est l'invite du système.

% g++ -c my_code.cc
% ar -ru libcustom.a my_code.o
% ranlib libcustom.a

Voyez la documentation de votre système pour les détails des options des commandes et ce que fait chaque étape. Pour l'édition des liens (ci-dessous) le nom de la bibliothèque doit commencer par « lib» et avoir l'extension .a. Une fois ces étapes franchies avec succès, placez la bibliothèque libcustom.a et le fichier d'entête my_code.h dans le répertoire de votre projet. Vous êtes prêt à utiliser ce code dans une figure faite avec ePiX.

Liaison à l'exécution

Le script epix autorise les fichiers d'entrée à être liés à des bibliothèques externes à l'exécution, quand le fichier d'entrée est compilé en un exécutable temporaire.

epix reconnait les options de la ligne de commande et les passe verbatim au compilateur. Les options les plus communément utilisées sont celles du type

   -I<include>     -L<libdir>     -l<lib>

Par exemple, pour lier figure.xp à mylibs/libcustom.a, lancez

   epix -Lmylibs -lcustom figure

Les options -I. -L. demande au compilateur de chercher dans le répertoire courant un fichier d'entête et un fichier de bibliothèque. Les options pour le compilateur peuvent apparaitre dans un ordre quelconque mais doivent être placées avant le(s) nom(s) du fichier (des fichiers) d'entrée.

On peut placer les options pour le compilateur dans un fichier de configuration $HOME/.epixrc avec la syntaxe ci-dessus. Une ligne du fichier de configuration contenant un # est un commentaire quelque soit l'endroit ou le # apparait. Si une ligne quelconque qui n'est pas un commentaire ne commence pas avec un tiret le reste du fichier est ignoré silencieusement. Les options de la ligne de commande sont lues avant le fichier de configuration.

Utiliser plusieurs versions

Le script epix lie par défaut à la bibliothèque mathématique du C libm.a et à la bibliothèque d'ePiX libepix.a. L'option de commande –no-defaults efface l'entête et les chemins d'inclusion et retrire libepix.a de la liste des liens. On peut donc utiliser le script pour différentes versions d'ePiX, une caractéristique potentiellement utile si on doit régulièrement compiler d'anciens fichiers source ou si l'on préfère simplement la syntaxe d'une ancienne version.

Pour installer et utiliser la Version 0.8.5 (p. ex.) construisez le package suivant les instructions de son fichier INSTALL mais n'utilisez pas le makefile pour l'installation. Au contraire installer manuellement les seuls entête et bibliothèque, en utilisant leur numéro de version :

# install -m 644 epix.h /usr/local/include/epix-0.8.5.h
# install -m 644 libepix.a /usr/local/lib/libepix-0.8.5.a

On peut utiliser un répertoire non-système au lieu de /usr/local. Pour utiliser l'ancienne version, un fichier source doit inclure (include) le fichier d'entête approprié – qui est identifié par son numéro de version. Pour compiler, entrer une commande telle que :

epix --no-defaults -I/usr/local -L/usr/local -lepix-0.8.5 file.c

Previous Up