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 :
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...
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.
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.
$ 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
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




