Débuter en C sur MacOS-X

C'est un peu plus simple qu'avec Windows, puisque MacOS-X est déjà un système Unix [de la souche BSD si vous voulez tout savoir]. La boîte en carton contenant le système MacOS-X offre aussi un CD Développeur permettant d'installer tous les outils de développement, dont un EMACS tristounet sans souris, le compilateur gcc, le logiciel XCode que nous verrons plus bas, etc. Je suppose que vous êtes au moins sous la version Snow Leopard (10.6) de MacOS-X.

Sommaire :

1. Travailler à l'ancienne : Emacs + gcc
1.1 Edition d'un fichier avec Emacs
1.2 Compilation avec gcc
1.3 Exécution du fichier binaire
1.4 Le graphisme avec AquaTerm
2. Utiliser le gestionnaire de projets XCode


Référence pour en savoir plus :

1. Travailler à l'ancienne : Emacs + gcc

La ligne de commande Unix est d'emblée disponible sur Mac, avec l'application Terminal. Mais on peut aussi remplacer Emacs par une application Mac Carbon Emacs plus agréable. Mais si vous vous contentez d'un Emacs en mode triste, il fonctionne d'emblée avec la commande emacs au Terminal [prenez alors un Terminal dans une fenêtre assez grande; vous pouvez sauver les préférences du Terminal]...

L'approche Terminal/gcc + Emacs est une solution minimale qui fonctionne parfaitement tant que l'on n'utilise pas de fonctionnalités graphiques [typiquement, pour tracer une courbe, mieux vaut envoyer en C des données numériques vers un fichier-disque et les faire absorber par un tableur que programmer graphiquement avec une API compliquée].

Vous trouverez chez Eyrolles un BestOf C bien fait, mais qui traitera du C classique, non spécialisé pour Mac...

1.1 Edition d'un fichier foo.c avec Emacs 

Vous trouverez l'application Terminal dans le dossier /Applications/Utilitaires. Mettez son icône dans le Dock pour l'avoir toujours à portée de souris. Lancez-le. Ne le zoomez pas, prenez disons une portion droite de l'écran comme dans la photo ci-dessus.

Vous avez téléchargé chez Apple l'application Carbon Emacs, placez-la aussi dans votre Dock, et lancez-la. Sinon, lancez Emacs tristounet sur la ligne de commande du Terminal, suivi ou non du fichier à éditer foo.c s'il existe déjà :

$ emacs foo.c

Une fois EMACS ouvert [dans une fenêtre indépendante si c'est Carbon Emacs, ou dans la fenêtre du Terminal sinon], vous disposez d'une pléthore de combinaisons de touches pour le manipuler. Il suffit de connaître dans un premier temps quelques touches commençant par "Control X" [C = la touche Ctrl] :

C-x C-f Find ouvrir un fichier par son nom, le créer s'il n'existe pas déjà.
C-x C-s Save sauver le buffer courant sous le nom actuel.
C-x C-w Write sauver le buffer courant sous un nouveau nom.
C-x C-c Couite
quitter Emacs
C-x C-k Kill couper du curseur jusqu'à la fin de la ligne
C-x C-y Yank restaurer ce qui a été coupé par C-x C-K [mais le garder dans le presse-papiers]

Le dialogue avec Emacs se fait par l'intermédiaire du minibuffer, situé tout en bas de sa fenêtre. Faites attention aux combinaisons de touches, Emacs ne pardonne pas... Pour en savoir plus : GNU Emacs Manual.

Bref, vous tapez votre fichier dont le nom DOIT se terminer par .c [par exemple essai.c] afin que le mode C soit activé automatiquement par Emacs.

1.2 Compilation du fichier foo.c avec gcc 

Le compilateur gcc [actuellement en version 4.x] est fourni par Apple avec les outils de développement, et se trouve... aucune idée, peut-être dans /usr/bin/gcc, allez savoir. Votre path [chemins dans lesquels sont recherchés les logiciels Unix] devrait être bien réglé, de sorte que la commande gcc au Terminal soit reconnue.

Si vous travaillez avec Carbon Emacs, qui est une application Mac [mais avec les commandes Emacs usuelles], éditez votre fichier .c, sauvez-le, puis revenez au Terminal d'un coup de souris. On compile, l'option -o [c'est la lettre o minuscule comme output et non pas zéro] indiquant le nom de l'exécutable binaire produit :

$ gcc foo.c -o foo

Ne mettez pas .exe, cette extension est propre à Windows, elle n'a pas d'intérêt dans le monde Unix. Si la compilation a produit des erreurs [gasp], retournez dans Emacs et corrigez votre source C. Si la compilation s'est bien passée, vous pouvez exécuter le code binaire produit.

1.3 Exécution du fichier binaire

Le fichier binaire foo a donc été produit, vérifiez-le avec la commande ls [listing] au Terminal :
$ ls
foo.c foo

Exécutez alors votre programme ! N'oubliez pas le ./ devant son nom pour indiquer qu'il s'agit d'un exécutable à rechercher dans le dossier courant :

$ ./foo
La racine carree de 2 vaut 2.414213562373095

1.4 Le graphisme avec AquaTerm

Le langage C n'étant pas portable au niveau graphique contrairement à Java ou PLT-Scheme par exemple, il est difficile de construire du logiciel fonctionnant avec des fenêtres, menus, graphisme, souris... et qui fonctionne à l'identique sous tous les O.S. [MacOS-X, Linux, Windows]. Il existe des couches portables comme wxWidgets mais réservées aux pros [c'est elle qui est utilisée par PLT-Scheme].

En ce qui nous concerne, sachez que le Mac est pourvu d'un noyau graphique très rapide et qu'il est paradoxalement très facile d'y accéder, une fois la porte des librairies entr'ouverte, ce qui reste hélas assez délicat pour le débutant en C sur Mac [mais idem sous Linux et Windows]. Nous en reparlerons plus bas. Voici donc la manière spartiate mais propre que l'on vous propose ici.

Nous allons utiliser AQUATERM, sans entrer dans les détails. Il s'agit d'un terminal graphique, contrairement au Terminal usuel qui est textuel uniquement. On peut donc y envoyer des dessins, depuis votre programme C [ou Fortran, etc] via une interface que l'on vous fournit. Vous commencez donc par le télécharger et vous l'installez...

Les pros mettront le nez là où il faut pour y trouver plein de choses savantes [gestion d'évènements, etc, cherchez avec Spotlight le fichier aquaterm.h]. Quant à nous, voici un petit fichier graphics.h contenant deux fonctions initGraphics et renderGraphics, ainsi que les signatures de quelques fonctions d'AQUATERM pour C :

// graphics.h
// pour L2-Info, sur MacOS-X
// On suppose que Aquaterm a été installé pour le #include qui suit...

#include "Aquaterm/aquaterm.h"

void
initGraphics(int refNum, int width, int height, const char *title) {
aqtInit();
aqtOpenPlot(refNum);
aqtSetPlotSize(width,height);
aqtSetPlotTitle(title);
aqtSetBackgroundColor(0.0, 0.0, 0.0); // white
aqtSetColor(0.0, 0.0, 0.0); // black
// police de 14 pts par défaut
}

void
renderGraphics() {
// draw it !
aqtRenderPlot();
aqtClosePlot();
aqtTerminate();
}

// -- ce qui suit est extrait de aquaterm.h
// void
aqtsetPlotTitle(const char *newTitle)
// void
aqtClearPlot()
// void
aqtSetColor(float r, float g, float b)
// -- Text handling
// void aqtSetFontsize(float newFontsize)
// void
aqtAddLabel(const char *text, float x, float y, float angleDegrees, int align)
// -- Line handling
// void
aqtMoveTo(float x, float y)
// void
aqtAddLineTo(float x, float y)
// void
aqtSetLinewidth(float newLinewidth)
// -- Rect handling
// void
aqtAddFilledRect(float lowerLeftX, float lowerLeftY, float width, float height)

Vous allez maintenant pouvoir inclure ce fichier graphics.h [qui va lui-même inclure tout ce qu'il faut] pour programmer graphiquement en C sur MacOS-X. Voici un programme demoGR.c :

// Mon programme demoGR.c
// Ce fichier peut être compilé sur MacOS-X et produire un exécutable Unix !
// En ligne de commande au Terminal :
// gcc demoGR.c -o demoGR -lAquaTerm

#include "graphics.h"
int main()
{
// Initialisation de la fenêtre graphique numéro 1... // Couleur = black et fond = white par defaut initGraphics(1, 400, 400, "Graphic Window"); // modification de la couleur du fond aqtSetBackgroundColor(1.0, 1.0, 0.0); // yellow // Affichage d'un texte 14pt noir par defaut en un point.
// Constantes d'alignement: AQTAlignLeft, AQTAlignRight, AQTAlignCenter
aqtAddLabel("Ce texte est en 14 pt", 4.0, 300.0, 0.0, AQTAlignLeft); // Affichage d'un texte rouge 24pt en rotation de 45 degrés aqtSetFontsize(24.0); aqtSetColor(1.0, 0.0, 0.0); // red int i; for(i=0; i<5; i++) aqtAddLabel("Coucou", 300.0, 300.0, 45.0*i, AQTAlignLeft); // angle en degrés ! // affichage d'un segment bleu (10,10) --> (200,200)
aqtSetColor(0.0, 0.0, 1.0); // blue
aqtMoveTo(10, 10);
aqtAddLineTo(200,200);
// affichage d'un segment bleu (200,200) --> (250,100) avec un trait d'épaisseur 4 aqtSetLinewidth(4.0); aqtMoveTo(200,200); // <-- repositionner après un setLineWidth ! aqtAddLineTo(250,100); // affichage d'un rectangle plein vert de cotes width=50, height=80, au point (200,200) aqtSetColor(0.0, 1.0, 0.0); aqtAddFilledRect(200,200,50,80); // Je veux le rendu, mais ne ferme pas la fenêtre ! renderGraphics(); // l'application AquaTerm reste ouverte !
return 0;
}

Et on le compile, puis on l'exécute :

   $ gcc demoGR.c -o demoGR -lAquaTerm
$ ./demoGR


L'exécution lance l'application AquaTerm, qu'il ne faut pas oublier de quitter par Cmd-Q.


2. Utiliser le gestionnaire de projets XCode

XCode est l'outil de développement de qualité professionnelle fourni gratuitement par Apple avec chaque ordinateur Macintosh. Il est conseillé de s'inscrire (gratuitement) sur la page des développeurs Apple pour obtenir les mises à jour, documentation, exemples de programmes, chocolats fourrés à la pomme, etc.

Montrons comment utiliser XCode pour compiler un programme C de base (non Cocoa) sur Mac, par exemple en License d'Informatique.

Vous lancez donc l'application XCode (je suis en version 3.2.2) qui se trouve dans
/Developer/Applications. Bien entendu, vous en placez un alias dans votre Dock... Dans la fenêtre qui s'ouvre, vous optez pour :



et dans la fenêtre suivante, vous demandez à construire une application écrite en C et accessible en ligne de commande :



XCode vous demande le nom de votre projet (en fait le nom du dossier qui contiendra les fichiers du projet, n'utilisez que lettres et chiffres), j'ai choisi "Essai". Il vous présente alors la fenêtre du projet, contenant la liste des fichiers et un éditeur. Dans sa grande bonté, il vous a même préparé un texte tout prêt, déjà compilable et exécutable. Je modifie ce texte :



Une fois le texte entré, le plus simple consiste à cliquer sur l'icône Build and Run, et zou ! Le programme est exécuté sur la console de XCode :



Perspicaces, vous avez noté que j'ai inclus le fichier d'en-tête (header) math.h pour la fonction sqrt. Lorsque vous allez rajouter des fichiers .c à votre projet, chacun de ces fichiers aura un fichier d'en-tête .h associé ouvert automatiquement.

Réglage des préférences de XCode. Ouvrez les Preferences dans le menu XCode et cliquez sur l'icône Debugging. Dans le menu déroulant On Start, optez pour Show Console. Cliquez ensuite sur l'icône Building, et au choix Open during builds optez pour Always. Enfin, cliquez sur l'icône Documentation, assurez-vous que la case Check for and install updates automatically soit cochée, et cliquez sur Check and install now.

XCode est un logiciel très complet, il faut l'appréhender peu à peu. Lisez quand même cette page d'Apple. Sachez quand même que la structure du panneau de gauche est une structure logique et ne correspond pas forcément à une structure de dossiers sur le disque. Si vous souhaitez exécuter votre programme à partir du Terminal, le binaire se trouve dans
Essai/build/Debug.

~/Essai/build/Debug$ ls
Essai
~/Essai/build/Debug$ Essai
La racine carrée de 2 est 1.414213562373095

Pour la suite, je parlerai d'une rencontre avec Objective-C.