203 | | = 4 Annexe Le Makefile = |
204 | | |
205 | | == Comment gérer les dépendances de tâches == |
206 | | |
207 | | |
208 | | La synthèse sous Alliance se décompose en plusieurs outils s'exécutant chronologiquement |
209 | | sur un flux de données. Chaque outil possède ses propres options donnant |
210 | | des résultats plus ou moins adaptés suivant l'utilisation que l'on veut faire du circuit. |
211 | | |
212 | | Les dépendances de données dans le flux sont matérialisées dans la réalité par une |
213 | | pendance de fichier. Le fichier Makefile exécuté à l'aide de la commande make permet |
214 | | gérer ces dépendances. Différents exemples de fichiers seront fournis durant le TP. |
215 | | |
216 | | Ce TP n'étant pas un cours sur le Makefile, nous nous limiterons à expliquer l'usage qui |
217 | | est fait dans les exemples fournis. |
218 | | |
219 | | == 4.1 Principe de base : Les Règles == |
220 | | |
221 | | Un Makefile est un fichier contenant une ou plusieurs règles traduisant les dépendances |
222 | | entre les actions et les fichiers. |
223 | | |
224 | | Voici une règle type Makefile : |
225 | | {{{ |
226 | | #Rq: chaque commande doit être précédée d’une tabulation |
227 | | cible1 : dépendance1 dépendance2 .... |
228 | | commande_X |
229 | | commande_Y |
230 | | }}} |
231 | | |
232 | | Les dépendances et cibles représentent, en général, des fichiers. |
233 | | Seule la première régle du Makefile est examinée. Les |
234 | | règles suivantes sont ignorées si elles ne sont pas impliquées par la première. |
235 | | Si certaines dépendances d'une règle X sont elles-mêmes des règles dans le Makefile |
236 | | alors ces dernières seront examinées avant la règle X appelante. |
237 | | Pour chaque règle X examinée, si au moins une de ses dépendances est plus récente que |
238 | | sa cible alors les commandes de la règle X seront exécutées. Remarque : les commandes |
239 | | servent généralement à produire la cible (i.e un nouveau fichier). |
240 | | Une cible peut ne pas représenter un fichier. Dans ce cas, les commandes de cette règle |
241 | | seront toujours exécutées. |
242 | | |
243 | | == 4.2 Règles de modèles == |
244 | | |
245 | | Ces règles sont plus polyvalentes car vous pouvez spécifier des règles de dépendance |
246 | | plus complexes. Une règle de modèle ressemble à une règle normale, sauf qu'un |
247 | | symbole (%) apparaît dans le nom de la cible. Les dépendances emploient également |
248 | | (%) pour indiquer la relation entre les noms de dépendance et le nom de la cible. La |
249 | | règle de modèle suivante spécifie comment tous les fichiers vst sont formés à partir des |
250 | | vbe. |
251 | | |
252 | | {{{ |
253 | | #exemple de règle pour la synthèse |
254 | | %.vst : %.vbe |
255 | | boog $* |
256 | | }}} |
257 | | |
258 | | == 4.3 Définitions de variables == |
259 | | |
260 | | On peut définir des variables en n'importe quel endroit du fichier Makefile, mais |
261 | | une écriture lisible nous amène à les définir en début de fichier. |
262 | | |
263 | | {{{ |
264 | | #définitions de variables |
265 | | |
266 | | MY_COPY = cp -r |
267 | | MY_NUM = 42 |
268 | | MY_STRING = "hello" |
269 | | |
270 | | Elles sont utilisables à n'importe quel endroit du Makefile. Elles doivent être précé- |
271 | | dées du caractère '''$''' |
272 | | |
273 | | #utilisation d’une variable dans une règle |
274 | | |
275 | | copie: |
276 | | ${MY_COPY} digicode.vbe tmp/ |
277 | | }}} |
278 | | |
279 | | |
280 | | == 4.4 Variables prédéfinies == |
281 | | |
282 | | * $@ Nom complet de la cible. |
283 | | * $* Nom du fichier cible sans l'extension. |
284 | | * $< Nom du premier fichier dépendant. |
285 | | * $+ Noms de tous les fichiers dépendants avec des dépendances doubles répertoriées |
286 | | dans leur ordre d'apparition. |
287 | | * $^ Noms de tous les fichiers dépendants. Les doubles sont retirés. |
288 | | * $ ? Noms de tous les fichiers dépendants plus récents que la cible. |
289 | | * $% Nom de membre pour des cibles qui sont des archives (langage C). Si, par |
290 | | |
291 | | === exemple === |
292 | | |
293 | | La cible est libDisp.a(image.o), $% est image.o et $@ est libDisp.a. |