Un petit mot
sur la compilation séparée et
les librairies de fonctions
en OCAML




Compilation et création d'un exécutable

    Un code source est un fichier .ml qui contient des phrases Ocaml
    (le nom du fichier doit commencer par un minuscule).

    Pour compiler un code source, disons toto.ml et créer un code exécutable,
    disons toto.exe, la commande est :

        ocamlc toto.ml -o toto.exe
 
    On peut ensuite exécuter le code exécutable toto.exe par :

        ./toto.exe


Exercice :
       
     - télecharger le code source fib.ml
     - compiler le et créer un code exécutable fib.exe
     - exécuter la commande ./fib.exe 10


Compilation séparée

    Pour les applications de taille plus conséquente, il est courant
de découper le code source en plusieurs petits fichiers.

Par exemple :

    toto_1.ml
    toto_2.ml
    ...
    toto_n.ml


On peut compiler chacun de ces fichiers séparement les uns des autres
en utilisant la commande ocamlc avec l'option -c. Ainsi pour compiler
un fichier toto_i.ml, la commande est :

    ocamlc -c toto_i.ml
 
On obtient un code objet toto_i.cmo.

Une fonction, disons f, du fichier toto_i.ml, a pour nom Toto_i.f
dans un autre fichier. Attention à mettre une majuscule
à Toto_i. On peut toutefois éviter de préciser à chaque fois le
préfixe "Toto_i." devant le nom f de la fonction, en tapant
au préalable la phrase open Toto_i;; dans cet autre fichier source.

Pour créer un code exécutable (rassembler les codes objets),
la commande est :

    ocamlc toto_1.cmo toto_2.cmo ... toto_n.cmo -o toto.exe

NB:
- Attention l'ordre des noms de fichiers dans la liste a de  l'importance.
  Il faut passer les .cmo dans l'ordre des dépendances entre fonctions :
  une fonction ne peut pas être utilisée avant d'avoir été définie.


On peut aussi utiliser toutes les fonctions définies dans un fichier toto_i.ml
depuis l'interpreteur (prompt #) en le compilant et en chargeant le code objet par :

    #load "toto_i.cmo";;

NB :
- Il faut taper le # devant la commande load
- Les mêmes règles s'appliquent concernant les noms de fonctions

Exemple :

    # #load "toto_i.cmo";;
    # Toto_i.f;;
    val f : 'a ->  'b = <fun>
    # open Toto_i;;
    # f;;
    val f :
'a ->  'b = <fun>



Utilisation de librairies de fonctions prédéfinies

Un certain nombre de librairies de fonctions sont à disposition du programmeur :

Chacune de ces librairies se présente sous la forme de 2 fichiers:
un fichier .cma et un fichier .cmi dans le répertoire /usr/lib/ocaml.

On peut utiliser les fonctions d'une librairie depuis l'interpréteur
comme pour les fonctions d'un code objet. Par exemple, pour utiliser
les fonctions de la librairie graphique, on peut taper :
	#load "graphics.cma";;
open Graphics;;

On peut aussi utiliser les fonctions d'une librairie dans un code source,
disons toto.ml. Pour cela,il faut placer la commande open (par exemple open Graphics;;)
au début du fichier. On compilera ensuite le code source avec la commande :

    ocamlc /usr/lib/ocaml/graphics.cma toto.ml -o toto.exe



Création de nouvelles librairies


On peut créer une nouvelle librairie de fonctions, disons libtoto.cma,
à partir de codes objets, disons toto_1.cmo, toto_2.cmo, ..., toto_n.cmo
et d'un fichier libtoto.ml, en utilisant la commande ocamlc avec l'option -a :

    ocamlc -a toto_1.cmo toto_2.cmo ... toto_n.cmo libtoto.ml -o libtoto.cma

Cette commande crée les fichiers libtoto.cma et libtoto.cmi.

Le fichier libtoto.ml doit contenir la liste des définitions
des fonctions de la librairie. Pour définir une fonction
on peut utiliser une fonction définie dans un toto_i de la liste.
 
Exemple :

let f = Toto_i.f;;



[Page réalisée par Eric Violard]