# 3.2. La Première Construction

Après la génération du projet, nous allons d'abord faire un petit tour dans le code source pour avoir une vision globale de la façon dont fonctionne l'architecture de l'application. Cela ne nous fera pas vraiment avancer mais il peut être utile de savoir où effectuer les modifications dans les prochaines étapes. Lorsque vous ouvrez la page LFV (Logical File Viewer) de la vue arborescente, vous voyez des dossiers qui contiennent déjà des fichiers du projet utiles au développeur. Les deux premiers dossiers sont "En-têtes" et "Sources". Évidemment, le dossier En-têtes contient tous les fichiers d'en-tête et le dossier Sources tous les codes sources. Les autres dossiers ne nous intéressent pas pour l'instant, nous y reviendrons plus tard pour voir ce qu'ils contiennent. Les deux dossiers contiennent donc les fichiers suivants :

En-têtes :

- kscribble.h : contient la déclaration de la classe KScribbleApp

- kscribbledoc.h : contient la déclaration de la classe KScribbleDoc

- kscribbleview.h : contient la déclaration de la classe KScribbleView

- resource.h : contient un ensemble de macros pour les identificateurs de menus

Sources :

- kscribble.cpp : contient l'implantation de la classe KScribbleApp

- kscribbledoc.cpp : contient l'implantation de la classe KScribbleDoc

- kscribbleview.cpp : contient l'implantation de la classe KScribbleView

- main.cpp : contient l'implantation de la fonction main().

Avant de rentrer dans les sources, nous allons laisser KDevelop construire et exécuter notre nouvelle application. Pour cela, sélectionnez "Construire" dans le menu "Construire" ou cliquez sur le bouton correspondant de la barre d'outils . La fenêtre des messages s'ouvre au bas de KDevelop et vous permet de voir ce que `make` fait grâce aux messages qu'il donne :

     1   Making all in docs
     2   make[1]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
     3   Making all in en
     4   make[2]: Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs/en'
     5   make[2]: Nothing to be done for `all'.
     6   make[2]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs/en'
     7   make[2]:
     Entering directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
     8  make[2]: Nothing to be done for `all-am'.
     9   make[2]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
     10  make[1]: Leaving directory
     `/home/rnolden/Tutorial/kscribble1/kscribble/docs'
     11  make[1]: Entering
     directory `/home/rnolden/Tutorial/kscribble1/kscribble'
     12  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include
     -I/usr/X11R6/include    -O0 -g -Wall  -c  	kscribbleview.cpp
     13  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include
     -I/usr/X11R6/include    -O0 -g -Wall  -c  	kscribbledoc.cpp
     14  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include
     -I/usr/X11R6/include    -O0 -g -Wall  -c           	kscribble.cpp
     15  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include
     -I/usr/X11R6/include    -O0 -g -Wall  -c  	main.cpp
     16  /usr/bin/moc ./kscribble.h -o kscribble.moc.cpp
     17  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include -I/usr/lib/qt/include
      -I/usr/X11R6/include    -O0 -g -Wall  -c  	kscribble.moc.cpp
     18  /usr/bin/moc ./kscribbledoc.h -o kscribbledoc.moc.cpp
     19  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include
     -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbledoc.moc.cpp
     20  /usr/bin/moc ./kscribbleview.h -o kscribbleview.moc.cpp
     21  g++ -DHAVE_CONFIG_H -I. -I. -I.. -I/opt/kde/include
     -I/usr/lib/qt/include  -I/usr/X11R6/include    -O0 -g -Wall  -c
     kscribbleview.moc.cpp
     22  /bin/sh ../libtool --silent --mode=link g++  -O0
     -g -Wall   -o kscribble -L/opt/kde/lib  -L/usr/X11R6/lib -rpath /opt/kde/lib
     	-rpath /usr/X11R6/lib kscribbleview.o kscribbledoc.o kscribble.o
     main.o kscribble.moc.o kscribbledoc.moc.o kscribbleview.moc.o  	-lkfile -lkfm
     -lkdeui -lkdecore -lqt -lXext -lX11
     23  make[1]: Leaving directory `/home/rnolden/Tutorial/kscribble1/kscribble'

Comme vous le constatez, nous avons mis des numéros au début de chaque ligne qui n'apparaissent pas dans les messages ; c'est juste pour simplifier la description de ce qui s'est passé pendant la construction. D'abord, `make` travaille récursivement. Cela signifie qu'il débute dans le dossier où il a été appelé, entre d'abord dans les sous-dossiers, retourne et traite le dossier suivant. À la fin, le dossier où il a été lancé est traité et `make` termine. C'est pourquoi `make` est lancé dans le dossier principal du projet qui contient les sources. Aux lignes 1 et 2, vous voyez que le processus `make` entre dans le dossier `docs`, puis dans le sous-dossier `en`. Comme il n'y a rien à faire, il quitte ces dossiers jusqu'à revenir au répertoire source `kscribble` à la ligne 11. Ensuite, le vrai travail commence : `make` appele le compilateur, ici `g++`, pour compiler le fichier source `kscribbleview.cpp`. La macro `-DHAVE&_;CONFIG&_;H` indique que le fichier `config.h` doit être utilisé. Ce fichier, qui contient des macros spécifiques à chaque plate-forme et à l'application, est situé dans le dossier principal du projet. Les commandes `-I` qui suivent ajoutent un chemin vers des fichiers d'inclusion (NdT : appelés aussi "includes") où `g++` pourra trouver les "includes" dont il a besoin. Ces chemins sont le dossier courant, le dossier principal du projet (avec `-I..`) et le chemin des includes pour les fichiers d'en-tête de KDE, Qt et X11. Les dossiers de ces fichiers d'includes sont déterminés par le script `configure` et définis dans les Makefiles, c'est pourquoi le compilateur sait où ils sont situés. Enfin, `-O0` définit l'optimisation à zéro (aucune optimisation), `-g` active le déboguage, `-Wall` définit les avertissements du compilateur à `all` et `-c` dit au compilateur de produire un fichier objet intermédiaire, c'est-à-dire seulement compiler le fichier.

Cela est aussi fait pour les autres fichiers sources de notre projet aux lignes 13-15. Évidemment, nos sources sont compilées mais au lieu de lier (NdT : opération réalisée par l'éditeur de liens) les fichiers objets intermédiaires des sources pour en faire un exécutable, nous voyons d'autres commandes. À la ligne 16, vous voyez que le programe "moc" est appelé pour traiter le fichier d'en-tête `kscribble.h` qui génère le fichier `kscribble.moc.cpp`. Ensuite, à la ligne 17, le fichier source est aussi compilé. La même chose se passe pour les autres fichiers d'en-tête du projet jusqu'à la ligne 21. En fait, comme la boîte à outils Qt contient le mécanisme signal/slot mais reste une implantation C++, vous utilisez des mots-clés comme les déclarations `signals:` et `slots:` dans vos classes qui ne sont pas, à l'origine, dans le langage C++. Cela vous permet de faire facilement communiquer les objets qui héritent de la classe `QObject`, évitant ainsi l'utilisation des traditionnels pointeurs sur les fonctions de callback. Aussi, l'application nécessite les sources qui implantent cette fonctionnalité et c'est pour cela que `moc` est appelé. Moc est le Compilateur de Méta Objet (NdT : Moc signifie littéralement Meta Object Compiler) de la boîte à outils Qt et construit l'implantation des mécanismes de signal et de slot en analysant le fichier d'en-tête et en générant un fichier source qui doit être compilé dans le binaire. Comme KDevelop utilise `automoc` pour déterminer quels fichiers doivent être traités, vous n'avez pas besoin de vous préoccuper des appels à `moc` et au compilateur C++ pour les fichiers générés par moc. Souvenez-vous seulement des règles qui permettent à une classe d'utiliser le mécanisme de signal et de slot de `QObject` ou toute classe qui hérite de `QObject` elle-même, vous devez aussi inclure la macro `Q&_;OBJECT` (sans point-vigule& ;!) au début de la déclaration de la classe et la déclaration des signaux et des slots.

Enfin, votre binaire est construit par le compilateur. Le binaire généré est appelé `kscribble`, l'éditeur de liens inclut le chemin vers KDE et vers les bibliothèques de X11 et lie les sources avec les bibliothèques `kfile, kfm, kdeui, kdecore, qt, Xext` et `X11`. Ensuite, c'est terminé et make se termine.