| | 296 | |
| | 297 | = 4. Annexe : Makefile = |
| | 298 | |
| | 299 | == 4.1 Introduction == |
| | 300 | |
| | 301 | Le flot de conception proposé par la chaîne de CAO Alliance se décompose en plusieurs étapes. |
| | 302 | Chaque étape est réalisée par un outil CAO, et les différents outils communiquent entre eux par des fichiers. |
| | 303 | |
| | 304 | Les dépendances de données entre les différentes étapes sont donc matérialisées par des dépendances entre fichiers. |
| | 305 | L'outil '''make''' de UNIX permet de décrire ces dépendances, et |
| | 306 | donc d'automatiser l'enchaînement des étapes de conception. |
| | 307 | |
| | 308 | Le fichier Makefile est un ''script'' décrivant les dépendances, dont l'exécution est lancée par la commande ''make''. |
| | 309 | |
| | 310 | == 4.2 Principe de base : Les Règles == |
| | 311 | |
| | 312 | Un Makefile est un fichier contenant une ou plusieurs règles traduisant les dépendances entre les actions et les fichiers. |
| | 313 | |
| | 314 | Voici une règle type Makefile : |
| | 315 | {{{ |
| | 316 | #Rq: chaque commande doit être précédée d’une tabulation |
| | 317 | cible1 : dépendance1 dépendance2 .... |
| | 318 | commande_X |
| | 319 | commande_Y |
| | 320 | }}} |
| | 321 | |
| | 322 | Les dépendances et cibles représentent, en général, des fichiers. |
| | 323 | Seule la première régle du Makefile est examinée. |
| | 324 | Les règles suivantes sont ignorées si elles ne sont pas impliquées par la première. |
| | 325 | Si certaines dépendances d'une règle X sont elles-mêmes des règles dans le Makefile alors ces dernières seront examinées avant la règle X appelante. |
| | 326 | Pour chaque règle X examinée, si au moins une de ses dépendances est plus récente que sa cible alors les commandes de la règle X seront exécutées. |
| | 327 | |
| | 328 | Remarque : les commandes servent généralement à produire la cible (i.e un nouveau fichier). |
| | 329 | Une cible peut ne pas représenter un fichier. Dans ce cas, les commandes de cette règle seront toujours exécutées. |
| | 330 | |
| | 331 | == 4.3 Règles de modèles == |
| | 332 | |
| | 333 | Ces règles sont plus polyvalentes car vous pouvez spécifier des règles de dépendance plus complexes. |
| | 334 | Une règle de modèle ressemble à une règle normale, sauf qu'un symbole (%) apparaît dans le nom de la cible. |
| | 335 | Les dépendances emploient également (%) pour indiquer la relation entre les noms de dépendance et le nom de la cible. |
| | 336 | La règle de modèle suivante spécifie comment tous les fichiers vst sont formés à partir des vbe. |
| | 337 | {{{ |
| | 338 | #exemple de règle pour la synthèse |
| | 339 | %.vst : %.vbe |
| | 340 | boog $* |
| | 341 | }}} |
| | 342 | |
| | 343 | == 4.4 Définitions de variables == |
| | 344 | |
| | 345 | On peut définir des variables en n'importe quel endroit du fichier Makefile, mais une écriture lisible nous amène à les définir en début de fichier. |
| | 346 | |
| | 347 | {{{ |
| | 348 | #définitions de variables |
| | 349 | |
| | 350 | MY_COPY = cp -r |
| | 351 | MY_NUM = 42 |
| | 352 | MY_STRING = "hello" |
| | 353 | |
| | 354 | Elles sont utilisables à n'importe quel endroit du Makefile. Elles doivent être précédées du caractère '''$''' |
| | 355 | |
| | 356 | #utilisation d’une variable dans une règle |
| | 357 | |
| | 358 | copie: |
| | 359 | ${MY_COPY} digicode.vbe tmp/ |
| | 360 | }}} |
| | 361 | |
| | 362 | |
| | 363 | == 4.5 Variables prédéfinies == |
| | 364 | |
| | 365 | * '''$@''' Nom complet de la cible. |
| | 366 | * '''$*''' Nom du fichier cible sans l'extension. |
| | 367 | * '''$<''' Nom du premier fichier dépendant. |
| | 368 | * '''$+''' Noms de tous les fichiers dépendants avec des dépendances doubles répertoriées dans leur ordre d'apparition. |
| | 369 | * '''$^''' Noms de tous les fichiers dépendants. Les doubles sont retirés. |
| | 370 | * '''$?''' Noms de tous les fichiers dépendants plus récents que la cible. |
| | 371 | * '''$%''' Nom de membre pour des cibles qui sont des archives (langage C). |
| | 372 | Si, par la cible est libDisp.a(image.o), $% est image.o et $@ est libDisp.a. |