Odb-server
Qu'est-ce que Odb-server ?

Odb-server fournit un serveur offrant des services à des éditeurs de code et autres environnements de développement intégrés (IDE) pour obtenir des informations sur le code OCaml édité. En fait, Odb-server peut être utilisé pour fournir n'importe quel service, mais il a été développé à l'origine pour permettre à Oug de fournir des services à des éditeurs de code. Une bibliothèque est également fournie pour enrichir le serveur afin de fournir des services supplémentaires.

Téléchargement et installation

Odb-server est téléchargeable ici.

Vous pouvez aussi accéder au Dépôt Git:

# git clone git://github.com/zoggy/odb-serv.git

La dernière version est 0.1 (2011-11-09).

Première distribution.

Pour installer, suivre les instructions du fichier INSTALL inclus dans l'archive de distribution.

La compilation de Odb-server requiert:

Licence

Odb-server est distribué sous licence GPL version 2.

Principes

Il s'agit d'avoir un serveur auquel s'adresse l'éditeur ou l'IDE du développeur (emacs, chamo, vi, ...). Chaque service est composé d'un nom d'outil (une chaîne de caractères) et d'une commande.

Les commandes sont de la même forme que les commandes shell, c'est-à-dire un nom de commande et des arguments, avec des arguments séparés par des blancs et les guillemets et apostrophes pouvant être utilisés de la même façon que dans un shell pour spécifier un argument contenant des blancs.

La communication avec le serveur se fait par l'intermédiaire d'un socket, et par un protocole textuel.

Le serveur de base offre les outils "server" et "project", supportant chacun diverses commandes. Cependant, il peut être enrichi d'autres outils de deux façons:

  1. soit par un greffon indiqué sur la ligne de commande de lancement du serveur,
  2. soit par un second serveur se connectant au serveur en lui signifiant qu'il offre un certain outil, disons X. Dans ce cas, le serveur principal est un proxy pour l'outil X: Lorsque le serveur principal recevra une requête (1) concernant l'outil X, il la redirigera vers le second serveur (2) offrant les services de cet outil, et la réponse obtenue (3) sera retransmise au client (4). La figure suivante illuste ce fonctionnement:


    Le second serveur peut lui aussi effectuer des requêtes auprès du serveur principal; il peut par exemple avoir besoin des informations du projet.

Un environnement de développement pourrait donc comporter plusieurs outils fournis par un serveur principal et différents serveurs secondaires, offrant chacun un ou plusieurs outils. L'intérêt étant que l'arrêt ou la charge d'un serveur secondaire ne provoque pas de blocage des autres outils.

Protocole

Le protocole utilisé pour échanger requêtes et réponses est très simple.

Les requêtes sont de la forme suivante:

<tool> [options]
<command>

Par exemple, pour demander le contenu de la variable includes pour le fichier /home/foo/test.ml, le client adressera la requête suivante au serveur, concernant l'outil project:

project
attribute "/home/foo/test.ml" includes
Le format des options n'est pas encore spécifié.

Le format des réponses est aussi simple:

<tool> <code> <len>
<contents
eventually on
more than one line, of length len>

Voici par exemple la réponse possible à la requête ci-dessus:

project 0 12
-I +lablgtk2

Le module Odb_comm offre des fonctions pour construire, envoyer et recevoir des requêtes et des réponses.

Lancement du serveur principal

Le serveur principal est lancé par la commande odb-server (ou odb-server.byte pour la version bytecode). Dans la suite, nous parlerons uniquement de la version compilée nativement, mais la correspondance des noms de fichiers pour la version bytecode est évidente.

Il est possible de charger des greffons au lancement du serveur. Ces greffons sont des fichiers objets OCaml. Ainsi, on pourra charger le greffon foo.cmxs de la manière suivante:

# odb-server foo.cmxs &

L'option -h donne la liste des options.

Création d'un autre serveur

On peut créer un autre serveur, soit pour le lancer en tant que serveur principal, soit pour le lancer en tant que serveur secondaire. Dans les deux cas, on pourra ajouter un ou plusieurs nouveaux outils à offrir à l'éditeur client.

La création d'un nouveau serveur est assez simple, le code doit faire les choses suivantes:

  1. Créer un ou plusieurs nouveaux outils (voir la section à ce sujet),
  2. Dans le cas d'un serveur secondaire, enregistrer ce ou ces outils auprès du serveur principal, grâce à la fonction Odb_client.register_to_server,
  3. Lancer la boucle d'attente des requêtes avec la fonction Odb_server.start_server.

Le code du serveur de Oug peut servir d'exemple.

Documentation des outils disponibles

Le serveur Odb-server de base fournit deux outils, "server" et "project".

La commande "doc" de l'outil "server" génère une page HTML contenant la documentation des commandes disponibles pour chaque outil. Chaque outil doit fournir une commande "doc" renvoyant la partie de HTML décrivant ses commandes. On utilisera les fonctions du module Odb_doc pour générer cette documentation au bon format. La commande "doc" de l'outil "server" appelle la commande "doc" des autres outils disponibles et aggrège les résultats dans une page HTML renvoyée en réponse. On peut voir la page pour les outils par défaut ici.

Cette page peut être facilement obtenue par la commande suivante, consistant à lancer le server et à utiliser le client odb-client pour obtenir la page de documentation et la rediriger dans un fichier:

# odb-server &
# odb-client "server: doc" > foo.html
L'outil "project"

L'outil "project" utilise un fichier de description de projet pour connaître les fichiers sources et les options de compilation associées. Un exemple d'un tel fichier se trouve ici.

Création d'un outil

La distribution inclus un outil jouet "ocamlwc" comme base à partir de laquelle on peut développer ses propres outils.

Le code est ici.

Pour compiler:

# ocamlopt -g -shared -o ocamlwc.cmxs -thread ocamlwc.ml

Pour tester, on lance le serveur en lui donnant le greffon à charger sur la ligne de commande:

# odb-server ocamlwc.cmxs &

Ensuite, on peut utiliser le client de test. La première commande appelle la commande "comments" de l'outil "ocamlwc" sur le fichier "ocamlwc.ml". La seconde fait générer la documentation des outils disponibles:

# ./odb-client "ocamlwc: comments ocamlwc.ml"
response header: ocamlwc 0 1
8
# ./odb-client "server: doc" > /tmp/t.html

Le module Odb_tools contient la définition des outils, les fonctions d'enregistrement, ...