| | 1 | = Le Makefile = |
| | 2 | |
| | 3 | == Comment gérer les dépendances de tâches == |
| | 4 | |
| | 5 | |
| | 6 | La synthèse sous Alliance se décompose en plusieurs outils s'exécutant chronologiquement |
| | 7 | sur un flux de données. Chaque outil possède ses propres options donnant |
| | 8 | des résultats plus ou moins adaptés suivant l'utilisation que l'on veut faire du circuit. |
| | 9 | |
| | 10 | Les dépendances de données dans le flux sont matérialisées dans la réalité par une |
| | 11 | pendance de fichier. Le fichier Makefile exécuté à l'aide de la commande make permet |
| | 12 | gérer ces dépendances. Différents exemples de fichiers seront fournis durant le TP. |
| | 13 | |
| | 14 | Ce TP n'étant pas un cours sur le Makefile, nous nous limiterons à expliquer l'usage qui |
| | 15 | est fait dans les exemples fournis. |
| | 16 | |
| | 17 | == 1 Principe de base : Les Règles == |
| | 18 | |
| | 19 | Un Makefile est un fichier contenant une ou plusieurs règles traduisant les dépendances |
| | 20 | entre les actions et les fichiers. |
| | 21 | |
| | 22 | Voici une règle type Makefile : |
| | 23 | {{{ |
| | 24 | #Rq: chaque commande doit être précédée d’une tabulation |
| | 25 | cible1 : dépendance1 dépendance2 .... |
| | 26 | commande_X |
| | 27 | commande_Y |
| | 28 | }}} |
| | 29 | |
| | 30 | Les dépendances et cibles représentent, en général, des fichiers. |
| | 31 | Seule la première régle du Makefile est examinée. Les |
| | 32 | règles suivantes sont ignorées si elles ne sont pas impliquées par la première. |
| | 33 | Si certaines dépendances d'une règle X sont elles-mêmes des règles dans le Makefile |
| | 34 | alors ces dernières seront examinées avant la règle X appelante. |
| | 35 | Pour chaque règle X examinée, si au moins une de ses dépendances est plus récente que |
| | 36 | sa cible alors les commandes de la règle X seront exécutées. Remarque : les commandes |
| | 37 | servent généralement à produire la cible (i.e un nouveau fichier). |
| | 38 | Une cible peut ne pas représenter un fichier. Dans ce cas, les commandes de cette règle |
| | 39 | seront toujours exécutées. |
| | 40 | |
| | 41 | == 2 Règles de modèles == |
| | 42 | |
| | 43 | Ces règles sont plus polyvalentes car vous pouvez spécifier des règles de dépendance |
| | 44 | plus complexes. Une règle de modèle ressemble à une règle normale, sauf qu'un |
| | 45 | symbole (%) apparaît dans le nom de la cible. Les dépendances emploient également |
| | 46 | (%) pour indiquer la relation entre les noms de dépendance et le nom de la cible. La |
| | 47 | règle de modèle suivante spécifie comment tous les fichiers vst sont formés à partir des |
| | 48 | vbe. |
| | 49 | |
| | 50 | {{{ |
| | 51 | #exemple de règle pour la synthèse |
| | 52 | %.vst : %.vbe |
| | 53 | boog $* |
| | 54 | }}} |
| | 55 | |
| | 56 | == 3 Définitions de variables == |
| | 57 | |
| | 58 | On peut définir des variables en n'importe quel endroit du fichier Makefile, mais |
| | 59 | une écriture lisible nous amène à les définir en début de fichier. |
| | 60 | |
| | 61 | {{{ |
| | 62 | #définitions de variables |
| | 63 | |
| | 64 | MY_COPY = cp -r |
| | 65 | MY_NUM = 42 |
| | 66 | MY_STRING = "hello" |
| | 67 | |
| | 68 | Elles sont utilisables à n'importe quel endroit du Makefile. Elles doivent être précé- |
| | 69 | dées du caractère '''$''' |
| | 70 | |
| | 71 | #utilisation d’une variable dans une règle |
| | 72 | |
| | 73 | copie: |
| | 74 | ${MY_COPY} digicode.vbe tmp/ |
| | 75 | }}} |
| | 76 | |
| | 77 | |
| | 78 | == 4 Variables prédéfinies == |
| | 79 | |
| | 80 | * $@ Nom complet de la cible. |
| | 81 | * $* Nom du fichier cible sans l'extension. |
| | 82 | * $< Nom du premier fichier dépendant. |
| | 83 | * $+ Noms de tous les fichiers dépendants avec des dépendances doubles répertoriées |
| | 84 | dans leur ordre d'apparition. |
| | 85 | * $^ Noms de tous les fichiers dépendants. Les doubles sont retirés. |
| | 86 | * $ ? Noms de tous les fichiers dépendants plus récents que la cible. |
| | 87 | * $% Nom de membre pour des cibles qui sont des archives (langage C). Si, par |
| | 88 | |
| | 89 | === exemple === |
| | 90 | |
| | 91 | La cible est libDisp.a(image.o), $% est image.o et $@ est libDisp.a. |