Changes between Version 95 and Version 96 of Archi-1-TP10
- Timestamp:
- Nov 28, 2021, 1:02:02 PM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Archi-1-TP10
v95 v96 475 475 {{{#!protected ------------------------------------------------------------------------------------ 476 476 '' 477 C Ours 10 / slide 42477 Cours 10 / slide 42 478 478 - État de la pile après l'exécution des lignes 36 à 43 479 479 {{{#!xml … … 522 522 1. Rappelez à quoi sert un Makefile? 523 523 {{{#!protected ------------------------------------------------------------------------------------ 524 ''''''''''''''' 524 '' 525 Cours 9 / slide 26 525 526 - Le rôle principal d'un Makefile est de décrire le mode d'emploi pour construire un fichier dit **`cible`** à partir d'un ou plusieurs fichiers **`source`** (dits de dépendance) en utilisant des commandes du `shell`. Ce rôle pourrait tout aussi bien être occupé par un script `shell` et d'ailleurs, dans le premier TP, nous avons vu un usage du Makefile dans lequel nous avions rassemblé plusieurs scripts `shell` sous forme de règles. 526 - Le second rôle d'un Makefile est de permettre la reconstruction efficace du fichier **`cible`** lorsqu'un seul fichier **`source`** change. Pour ce rôle, le Makefile exprime toutes les étapes de constructionsde la **`cible`** finale et des **`cibles`** intermédiaires sous forme d'un arbre dont les feuilles sont les fichiers **`sources`**.527 '' '''''''''''''527 - Le second rôle d'un Makefile est de permettre la reconstruction partielle du fichier **`cible`** lorsque quelques fichiers **`source`** changent (pas tous). Pour ce rôle, le Makefile exprime toutes les étapes de construction de la **`cible`** finale et des **`cibles`** intermédiaires sous forme d'un arbre dont les feuilles sont les fichiers **`sources`**. 528 '' 528 529 }}} 529 530 1. Vous n'allez pas à avoir à écrire un Makefile complètement. Toutefois, si vous ajoutez des fichiers source, vous allez devoir les modifier en ajoutant des règles. Nous avons vu brièvement la syntaxe utilisée dans les Makefiles de ce TP au cours n°1. Les lignes qui suivent sont des extraits de `1_klibc/Makefile` (le Makefile de l'étape1). Dans cet extrait, quelles sont la `cible` finale, les `cibles` intermédiaires et les `sources`? A quoi servent les variables automatiques de make? Dans ces deux règles, donnez-en la valeur. 530 531 {{{#!make 531 kernel.x : kernel.ld obj/hcpu .o obj/kinit.o obj/klibc.o obj/harch.o532 kernel.x : kernel.ld obj/hcpua.o obj/kinit.o obj/klibc.o obj/harch.o 532 533 $(LD) -o $@ -T $^ 533 534 $(OD) -D $@ > $@.s … … 538 539 }}} 539 540 {{{#!protected ------------------------------------------------------------------------------------ 540 ''''''''''''''' 541 '' 542 Cours 9 / slides 27 et 56 541 543 - La `cible` finale est : `kernel.x` 542 - Les `cibles` intermédiaires sont : `kernel.ld`, `obj/hcpu .o`, `obj/kinit.o`, `obj/klibc.o` et `obj/harch.o`.544 - Les `cibles` intermédiaires sont : `kernel.ld`, `obj/hcpua.o`, `obj/kinit.o`, `obj/klibc.o` et `obj/harch.o`. 543 545 - La `source` est : `hcpua.S` 544 546 - Les variables automatiques servent à extraire des noms dans la définition de la dépendance (`cible : dépendances`) 545 547 - dans la première règle : 546 548 - `$@` = `cible` = `kernel.x` 547 - `$^` = l'ensemble des dépendances = `kernel.ld`, `obj/hcpu .o`, `obj/kinit.o`, `obj/klibc.o` et `obj/harch.o`549 - `$^` = l'ensemble des dépendances = `kernel.ld`, `obj/hcpua.o`, `obj/kinit.o`, `obj/klibc.o` et `obj/harch.o` 548 550 - dans la seconde règle : 549 - `$@` = `cible` = `obj/hcpu .o`551 - `$@` = `cible` = `obj/hcpua.o` 550 552 - `$<` = la première des dépendances = `hcpua.S` 551 '' '''''''''''''553 '' 552 554 }}} 553 555 1. Dans le TP, à partir de la deuxième étape, nous avons trois répertoires de sources `kernel`, `ulib` et `uapp`. Chaque répertoire contient une fichier `Makefile` différent destiné à produire une `cible` différente grâce à une règle nommée `compil`, c.-à-d. si vous tapez `make compil` dans un de ces répertoires, cela compile les sources locales.\\Il y a aussi un Makefile dans le répertoire racine `4_libc`. Dans ce dernier Makefile, une des règles est destinée à la compilation de l'ensemble des sources dans les trois sous-répertoires. Cette règle appelle récursivement la commande `make` en donnant en argument le nom du sous-répertoire où descendre :\\`make -C <répertoire> [cible]` est équivalent à `cd <répertoire>; make [cible] ; cd ..`\\Ecrivez la règle `compil` du fichier `4_libc/Makefile`. … … 564 566 }}} 565 567 {{{#!protected ------------------------------------------------------------------------------------ 566 ''''''''''''''' 568 '' 569 Ce n'est pas dit dans le cours, mais la question contient la réponse... 567 570 {{{#!make 568 571 compil: … … 571 574 make -C uapp compil 572 575 }}} 573 '' '''''''''''''576 '' 574 577 }}} 575 578 … … 589 592 1. fonction C à nombre d'arguments variables `fprintf`? 590 593 {{{#!protected ------------------------------------------------------------------------------------ 591 '' '''''''''''''594 '' 592 595 - 593 '' '''''''''''''596 '' 594 597 }}} 595 598 1. génération de nombres pseudoaléatoires `rand`? 596 599 {{{#!protected ------------------------------------------------------------------------------------ 597 '' '''''''''''''600 '' 598 601 - 599 '' '''''''''''''602 '' 600 603 }}} 601 604 1. traduction d'une chaîne de caractère en nombre `atoi`? 602 605 {{{#!protected ------------------------------------------------------------------------------------ 603 '' '''''''''''''606 '' 604 607 - 605 '' '''''''''''''606 }}} 607 }}} 608 609 610 ---------------------------------------------------------------------------------------------------- --------------------------------608 '' 609 }}} 610 }}} 611 612 613 ---------------------------------------------------------------------------------------------------- 611 614 612 615