Removing the Windows-specific "includes" from "freeglut_joystick.c"
[freeglut] / LISEZMOI.cygwin_mingw
1 Glut alors!\r
2 \r
3 Par Jean-Seb le vendredi 10 juillet 2009, 00:18\r
4 \r
5 \r
6 Freeglut est une évolution open-source de Glut.\r
7 Sous Windows, on peut l'utiliser avec Cygwin.\r
8 Facile ? Oui, si on accepte de distribuer "cygwin1.dll"\r
9 Aidons Freeglut à conquérir son indépendance !\r
10 m.à.j 10/7/2009 : génération d'une librairie pour linker depuis la dll.\r
11 \r
12 \r
13 Récupération des sources\r
14 \r
15     * Reprenez les sources de la version 2.6.0 qui intègre les changements\r
16       récents.\r
17     * Pour l'instant, il s'agit d'une RC (Release Candidate), mais la version\r
18       finale ne saurait tarder.\r
19     * L'utilisation de la 2.6 est préférable à la branche 2.4-stable, de\r
20       nombreux bugs étant corrigés.\r
21     * Vous trouverez les sources sur le site de Freeglut:\r
22           o http://freeglut.sourceforge.net/\r
23 \r
24 \r
25 Principe\r
26 Objectif\r
27 \r
28     * Nous allons créer une dll liée à Cygwin, et une bibliothèque statique\r
29       indépendante\r
30     * Nous créerons également une librairie dynamique, permettant de linker avec\r
31       la dll.\r
32 \r
33 Liste des fichiers générés\r
34 \r
35     * freeglut.dll : une dll classique pour le linkage dynamique.\r
36     * libfreeglut.a : la bibliothèque statique. Le programme final est autonome\r
37       (du moins pour OpenGL).\r
38     * libfreeglutdll.a : la bibliothèque dynamique. Le programme final a besoin\r
39       de freeglut.dll.\r
40 \r
41 \r
42 Préparation\r
43 \r
44     * Dépliez l'archive freeglut.\r
45     * Allez dans le répertoire src (situé à la racine du répertoire Freeglut),\r
46       et créez un sous-répertoire "Gl"\r
47           o Dans ce sous-répertoire, copiez les fichiers du répertoire\r
48             "include/Gl"\r
49 \r
50     * Pourquoi faut-il créer un répertoire "Gl" pour la compilation ?\r
51           o C'était juste pour simplifier les choses lors de mes essais.\r
52           o Sinon vous pouvez créer directement les répertoires, et copier les\r
53             fichiers comme indiqué au point installation (lire plus loin).\r
54 \r
55     * Faites un peu de ménage dans /lib :\r
56           o Effacez toutes les références à la glut, pour ne pas avoir de\r
57             conflit au linkage.\r
58           o Cette étape est facultative, vous pouvez également choisir de ne\r
59             faire le ménage qu' après une compilation réussie de Freeglut.\r
60           o Attention à ne pas effacer, dans un enthousiasme rédempteur, la\r
61             bibliothèque glu32.lib (à ne pas confondre avec glut32.lib).\r
62 \r
63 \r
64 Compilation\r
65 \r
66     * Oubliez le triptyque ./configure , make , make install.\r
67           o Ca ne marche pas du tout avec Cygwin.\r
68 \r
69     * Voici un Makefile qui fera l'affaire:\r
70 \r
71 #Makefile pour Freeglut 2.6.0-rc et Cygwin\r
72 #A placer dans le répertoire "src/Common"\r
73 \r
74 sources=$(wildcard *.c)\r
75 objs=$(sources:.c=.o)\r
76 libname=freeglut\r
77 \r
78 \r
79 CFLAGS=-O2 -DTARGET_HOST_MS_WINDOWS -DX_DISPLAY_MISSING -DFREEGLUT_STATIC -I./\r
80 LDFLAGS=-lopengl32 -lgdi32 -lwinmm\r
81 \r
82 nocyg=-mno-cygwin -mwindows\r
83 \r
84 all: $(objs)\r
85         #construction dll liée à cygwin1.dll\r
86         gcc $(nocyg) $(objs) -shared $(LDFLAGS) -o $(libname).dll\r
87         nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def\r
88         dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a\r
89 \r
90         #construction bibliothèque statique indépendante de cygwin\r
91         ar cr lib$(libname).a $(objs)\r
92         #pas forcément obligatoire (création d'un index pour accélérer les accès)\r
93         ranlib lib$(libname).a\r
94 \r
95 %.o: %.c\r
96         gcc $(nocyg) -c $(CFLAGS) $<\r
97 \r
98 clean:\r
99         rm -f *.o $(libname).dll $(libname).def lib$(libname)dll.a lib$(libname).a\r
100 \r
101 \r
102 \r
103 \r
104 Quelques remarques sur le makefile\r
105 \r
106     * Ce makefile crée une dll, une bibliothèque statique (une archive, en\r
107       d'autres termes) et la bibliothèque dynamique qui permettra l'utilisation\r
108       de la dll.\r
109 \r
110     * Ne cherchez pas à stripper la bibliothèque statique! Vous ne pourriez plus\r
111       compiler en statique.\r
112           o Par contre, vous pouvez stripper l'exécutable final obtenu lors de\r
113             la compilation de votre application.\r
114 \r
115     * J'ai choisi d'appeller la dll et les bibliothèques par leurs "vrais noms":\r
116       freeglut.dll libfreeglutdll.a et libfreeglut.a.\r
117           o Le script configure recréait (pour des raisons de compatibilité avec\r
118             l'ancienne bibliothèque Glut) glut.dll et libglut.a.\r
119           o Lors des mes essais, j'ai eu des conflits avec une authentique\r
120             "glut" qui trainait dans mon "/lib". J'ai décidé d'appeller les\r
121             choses par leur nom, afin d'éviter les confusions.\r
122           o Rien ne vous empêche de renommer la dll, si vous avez besoin\r
123             d'utiliser des programmes Glut que vous ne pouvez pas recompiler.\r
124 \r
125     * La bibliothèque dynamique est générée à partir de la dll.\r
126           o Par souci de concision, j'ai utilisé awk. Il génère le fichier\r
127             d'exports utilisé par dlltool.\r
128           o La seule chose notable est la sélection des fonctions dont le nom\r
129             commence par _glut, afin d'éviter d'inclure dans la librairie\r
130             dynamique des fonctions sans rapport avec freeglut.\r
131           o ensuite, on utilise dlltool de façon très classique.\r
132 \r
133 nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def\r
134 dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a\r
135 \r
136 \r
137 \r
138 \r
139 Installation\r
140 \r
141     * Copiez libfreeglut.a, libfreeglutdll.a dans le répertoire /lib de Cygwin.\r
142     * Copiez freglut.dll dans le system32 de Windows (ce qui est pratique, mais\r
143       pas propre!).\r
144     * Copiez les fichiers headers de Freeglut (/include/gl) dans /usr/include/Gl\r
145       de Cygwin.\r
146     * Copiez les fichiers headers (toujours /include/gl) dans\r
147       /usr/include/mingw/Gl : ceci sert aux compilations avec le flag\r
148       -mno-cygwin, qui utilise alors les includes de mingw.\r
149           o Vous aurez éventuellement besoin d'écraser d'anciens fichiers\r
150             include, correspondants à Glut, si vous l'avez installé avec Cygwin.\r
151 \r
152 \r
153 Utilisation de la librairie\r
154 \r
155     * Nous allons tester avec le programme shapes, présent dans\r
156       progs/demos/shapes\r
157           o -mno-cygwin sert à forcer l'utilisation de Mingw sans la grosse\r
158             dépendance cygwin1.dll.\r
159           o -mwindows sert uniquement à enlever l'horrible fenêtre shell (très\r
160             utile pour la mise au point, par contre).\r
161           o -L. (notez le point après le "L") : j'ai laissé libfreeglut.a,\r
162             libfreeglutdll.a et freeglut.dll dans le répertoire de test, le\r
163             temps des tests justement.\r
164 \r
165 \r
166 Compilation en librairie statique freeglut, sans cygwin\r
167 \r
168     * Toute l'astuce réside dans le define : -DFREEGLUT_STATIC\r
169           o Il sert à obtenir la bonne décoration des noms de fonctions dans les \r
170             imports de la lib Freeglut.\r
171           o Vous pouvez essayer sans et prendre un éditeur hexa pour voir les\r
172             différences dans l'objet.\r
173     * attention à l'ordre des bibliothèques : -lfreeglut (statique) doit se\r
174       trouver avant la déclaration des bibliothèques dynamiques.\r
175 \r
176     * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin\r
177       -mwindows -DFREEGLUT_STATIC\r
178 \r
179 \r
180 Compilation avec dll freeglut, sans cygwin\r
181 \r
182     * Pour le define, même remarque que ci-dessus\r
183     * L'ordre des bibliothèques n'a plus d'importance.\r
184 \r
185     * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin\r
186       -DFREEGLUT_STATIC\r
187 \r
188 \r
189 Compilation avec dll freeglut, avec Cygwin\r
190 \r
191     * Cet exemple est donné uniquement pour référence, le thème de ce billet étant de se débarrasser de Cygwin.\r
192           o Disons que ça peut servir pendant la mise au point (et encore).\r
193 \r
194     * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut\r
195 \r
196 \r
197 \r
198 Où sont les dooooocs ?\r
199 \r
200     * Freeglut est livré avec sa documentation, plus très à jour.\r
201           o Il semble qu'il y ait un problème avec la doc Glut originale. Non\r
202             seulement elle ne correspond pas forcément au fonctionnement de\r
203             Freeglut, mais de plus, son auteur (Mark Kilgard) l'a copyrighté. Sa\r
204             distribution est donc difficile.\r
205 \r
206     * Jocelyn Fréchot a entrepris une mise à niveau des docs pour la version\r
207       2.6.0. On peut les trouver sur son site pour l'instant:\r
208           o http://jocelyn.frechot.free.fr/freeglut/\r
209 \r
210 \r
211 Quelque chose a survécu ...\r
212 \r
213     * J'ai également testé la recompilation des démos de la lib Glut originelle\r
214       (paix à ses cendres).\r
215           o Rien de particulier à signaler.\r
216 \r
217     * Merci à tous les mainteneurs courageux de Freeglut, qu'on croyait mort,\r
218       mais qui bouge encore.\r