:: Enseignements :: Licence :: L3 :: 2012-2013 :: Programmation C ::
[LOGO]

Doc my code


But du projet

Vous devez réaliser un programme permettant de générer la documentation technique d'une application à partir de ses sources en C documentées. Le principe, les spécifications et l'objectif de votre programme sont les mêmes que la mythique Javadoc... ou que l'outil doxygen.

Contenu de la documentation

La documentation technique générée prendra la forme d'un site Web dynamique (HTML, CSS, Javascript, etc.), permettant de parcourir aisément les sources documentées (à l'instar de Javadoc), et d'obtenir au minimum les informations suivantes : La documentation d'une fonction, variable, structure, macro, etc., peut être indifféremment décrite dans le fichier d'entête (fichier.h) et/ou dans le fichier source associé (fichier.c). Votre programme devra considérer cette éventualité.

Voici un extrait de documentation pouvant être générée par votre programme :


Figure 1. Documentation du contenu d'un fichier source voitures.c.


Figure 2. Documentation d'une fonction calculerDistance().

Bien entendu, vous avez toute liberté de modifier l'aspect de la documentation générée, et donc de ne pas obtenir une documentation strictement identique à l'exemple ci-dessus. Veillez toutefois à ce que l'utilisation de votre documentation générée reste simple et logique.
La documentation générée doit être la plus pratique et ergonomique possible. Par exemple, il doit être possible de naviguer dans cette documentation à l'aide de liens hypertextes, permettant notamment d'accéder directement à la description d'une fonction particulière en cliquant sur le nom de celle-ci dans la liste des fonctions du fichier source documenté. Vous pouvez vous inspirer de ce que proposent les documentations générées par les outils Javadoc ou doxygen.

Documentation des sources

La documentation générée est extraite directement des sources de l'application, sur la base de commentaires de documentation écrits par les développeurs directement dans les fichiers sources, et respectant un format spécifique.

Bloc de documentation

Un commentaire est considéré comme un bloc de documentation s'il respecte l'un des deux formats suivants :
/**  ...
     ... documentation ...
 */
///  ...
///  ... documentation ...
///  ...
Remarquez qu'il s'agit de commentaires classiques auxquels sont ajoutés des caractères spécifiques : une étoile (*) supplémentaire, ou trois barres obliques (/) au lieu de deux.

Important : la seule contrainte est qu'un bloc de documentation utilise au moins deux étoiles (*) pour la première ligne, ou trois barres obliques (/) pour chaque ligne ! De plus, les deux formats peuvent être indifféremment utilisés ; l'ensemble des blocs de documentation devront être pris en compte.
Ainsi, l'intégralité des commentaires suivants représentent la documentation de la fonction func :
/*********************************
 **  \fn        int func()      **
     \brief     Une petite fonction qui ne fait pas grand chose...
 ********************************/
//////////////////////////////////  \author Moi
///  \details   Quel bel exemple de fonction inutile !
///             On aurait largement pu s'en passer...
///  \return    0
//////////////////////////////////
int func() {
    return 0;
}

Balises spéciales

Plusieurs balises spéciales permettent de spécifier les informations que l'on décrit sur une fonction ou un fichier source. Voici les principales balises que votre programme devra gérer.
Dans le cas des balises acceptant une précision sur l'élément décrit (notamment \param), la séparation entre l'élément décrit et la précision se fait à l'aide d'au moins deux espaces ou d'une tabulation.

Il doit être possible d'utiliser plusieurs fois une même balise dans un même bloc de documentation ; leur contenu sera alors regroupé dans la documentation générée. Par exemple, dans le cas d'une fonction ayant plusieurs paramètres, on devra utiliser \param pour chacun de ces paramètres, et ces informations seront regroupées dans un bloc Paramètres dans la documentation générée.

Exemple de code documenté

L'extrait de documentation précédent (Figure 1 et Figure 2) a été obtenu à partir des fichiers sources documentés ainsi :
/**
 * \file      voitures.c
 * \author    Miroslav
 * \version   1.0
 * \date      12 Novembre 2009
 * \brief     Définit les modèles de voiture et leur particularités.
 *
 * Cette classe surcharge les accesseurs standards du module_voiture pour
 * convenir aux spécificités des différents modèles possibles.
 */

... // suite du code
...

/**
 * \fn         float calculerDistance(Point point1, Point point2)
 * \brief      Calcule la distance entre deux points
 * \details    La distance entre les \a point1 et \a point2 est calculée par
 *             l'intermédiaire des coordonnées des points. (cf #Point)
 * \param      point1    Point 1 pour le calcul de distance.
 * \param      point2    Point 2 pour le calcul de distance.
 * \return     Un \e float représentant la distance calculée.
 */
float calculerDistance(Point point1, Point point2);

..

Utilisation de votre programme

Votre programme sera utilisé en ligne de commandes, et génèrera automatiquement la documentation technique dynamique à partir des fichiers sources de l'application. Votre programme devra gérer trois possibilités de passer ces fichiers sources :

Améliorations et extensions

Les fonctionnalités décrites ci-dessus sont le strict minimum que votre programme devra être capable de proposer. Lorsque l'intégralité des consignes décrites ci-dessus seront correctement implémentées par votre programme, vous pourrez lui ajouter des améliorations et extensions. Nous vous proposons ici quelques idées d'extensions ; libre à vous d'en trouver d'autres !

Remarque : Ces améliorations et extensions feront partie intégrante de l'évaluation de votre projet.
Plus vous ajouterez de fonctionnalités, et meilleure sera l'évaluation de votre projet.

Autres balises spéciales

Vous remarquerez que le format spécifique de la documentation est librement inspiré (pompé) des outils très connus que sont Javadoc et doxygen. Nous n'avons listé que quelques unes des balises spéciales gérées par ces outils, mais il en existe beaucoup d'autres.

Vous pouvez piocher parmi l'ensemble des balises spéciales gérées par l'outil doxygen, pour ajouter des balises spéciales gérées par votre programme. Faites un choix judicieux : commencez par implémenter les balises les plus utiles et pertinentes !
Certaines balises sont indicatives ou cosmétiques, et permettent de contrôler l'affichage des informations dans la documentation générée. C'est le cas notamment des balises \a, \c ou encore \e. Ces balises peuvent être très utiles pour améliorer la compréhension d'une documentation ; peut-être serait-il judicieux de les choisir prioritairement...

Détection automatique du prototype des fonctions documentées

Dans les balises spéciales minimales se trouve la balise \fn, qui permet de définir le prototype complet d'une fonction documentée. En extension, et à l'instar du fonctionnement des outils Javadoc et doxygen, vous pouvez améliorer votre programme pour qu'il détecte automatiquement ce prototype, sans qu'il soit nécessaire de l'indiquer par l'utilisation de la balise \fn.
Dans l'exemple ci-dessus documentant la fonction calculerDistance(), le bloc de documentation deviendrait :
...

/**
 * \brief      Calcule la distance entre deux points
 * \details    La distance entre les \a point1 et \a point2 est calculée par
 *             l'intermédiaire des coordonnées des points. (cf #Point)
 * \param      point1    Point 1 pour le calcul de distance.
 * \param      point2    Point 2 pour le calcul de distance.
 * \return     Un \e float représentant la distance calculée.
 */
float calculerDistance(Point point1, Point point2);

..
Notez que le prototype n'est plus décrit par une balise \fn ; le programme détecte automatiquement ce prototype comme étant celui défini juste après la fin du bloc de documentation.

Fichier de configuration

Il peut être intéressant de pouvoir modifier le comportement de votre programme, qu'il s'agisse de la manière dont sont traités les fichiers sources documentés, ou de l'aspect de la documentation générée. Dans les outils tels que Javadoc ou doxygen, ce comportement peut être paramétré à l'aide d'un ou plusieurs fichiers de configuration.
À l'instar de ces outils, vous pouvez étendre votre programme pour qu'il puisse être paramétrable à l'aide d'un fichier de configuration, dont vous choisirez librement le format. Toutefois, n'oubliez pas dans votre rapport d'en expliquer le fonctionnement et la manière de l'utiliser !

Conditions de développement

Le but de ce projet est moins de pondre du code que de développer le plus proprement possible. C'est pourquoi vous développerez ce projet en utilisant un serveur de gestion de versions tel que CVS, Subversion (SVN), GIT, etc.
Vous pouvez par exemple utiliser le serveur CVS mis à disposition des étudiants de l'Université à cette adresse : serveur CVS de l'université.
Comme nous attendons de vous que vous le fassiez sérieusement, votre rendu devra contenir un dump du fichier de logs des opérations effectuées sur votre projet, extrait depuis le serveur de gestion de versions que vous aurez choisi d'utiliser, afin que nous puissions nous assurer que vous avez bien développé par petites touches successives et propres (commits bien commentés), et non pas avec un seul commit du résultat la veille du rendu.

Conditions de rendu

Vous travaillerez en binômes et vous lirez avec attention la Charte des Projets. Vous rendrez votre projet au moyen d'un package Debian. Le rendu consistera donc en un mail dans lequel vous donnerez l'URL de votre repository, qui devra se trouver sur votre compte web de l'université. Le test de votre projet se fera avec la commande suivante :

sudo apt-get install docmycode

La commande docmycode doit alors être installée et doit pouvoir permettre la génération de la documentation d'applications développées en C et passées au programme comme indiqué plus haut. Naturellement, toutes les options que vous proposerez (ne serait-ce que --help) devront être gérées avec getopt et getopt_long.

Afin de pouvoir accéder aux sources de votre travail, vous préparerez également un package source contenant les choses suivantes :
Comme pour l'exécutable, l'accès à votre package source se fera au moyen de apt-get :

apt-get source docmycode


Remarques importantes :
Le projet est à rendre par mail à tous les enseignants (i.e. Guillaume Blin et Mathieu Chapelle).