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