J.-M Friedt
TD0 : Makefile
J.-M Friedt
FEMTO-ST/d´ epartement temps-fr´ equence jmfriedt@femto-st.fr
transparents ` a jmfriedt.free.fr
17 janvier 2021
1 / 10
J.-M Friedt
Compilation s´ epar´ ee
int main() {...
fonc();
comm();
...
} main.c
void fonc() {...}
fonction.c
void comm() {...
USB_USBTask();
}
communication.c
gcc −c fonction.c gcc −c communication.c gcc −c main.c
main.o fonction.o communication.o
Bibliothèque communication USB (LUFA) gcc −o exec main.o fonction.o communicatin.o −lbiblio
édition de liens (linker)
• S´eparation de groupes de fonctions associ´ees dans des fichiers distincts : lisibilit´e
• S´eparation de l’algorithme (main()) des ressources bas-niveau (comm()) ou traitements (fonc()) : r´eutilisation
• Exploitation de biblioth`eques externes (e.g. communication sur bus USB)
• Pour chaque code source, un fichier d’entˆete avec les prototypes de fonctions : JAMAISde code C dans un.h.
J.-M Friedt
Compilation s´ epar´ ee
int main() {...
fonc();
comm();
...
} main.c
void fonc() {...}
fonction.c
void comm() {...
USB_USBTask();
}
communication.c
gcc −c fonction.c gcc −c communication.c gcc −c main.c
main.o fonction.o communication.o
Bibliothèque communication USB (LUFA) gcc −o exec main.o fonction.o communicatin.o −lbiblio
édition de liens (linker)
• Code source C→objet :gcc -cavec chemin des fichiers d’entˆetre par-I
• Objets + biblioth`eques→ex´ecutable :gcc *.o -o execavec chemin des biblioth`eques statiques (.a) par-L
• Lien avec une biblioth`eque :-lbibliofait appel `alibbiblio.a
3 / 10
J.-M Friedt
Makefile : principes
Outil (make) d’automatisation de la s´ equence de compilation selon des r` egles de d´ ependance et de r´ esolution des d´ ependances
• s’appuie sur un script (ASCII) d´ ecrivant les ´ etapes de compilation
• ce script se nomme par convention Makefile ou makefile
• pour un fichier nomm´ e diff´ eremment, make -f fichier
• une r` egle de l’objectif ` a atteindre : all
• chaque r` egle est suivie de : d´ ependances
• chaque r` egle est suivie d’une ou plusieurs lignes pr´ efix´ ees de TAB
1avec la solution pour passer de la d´ ependance ` a la r` egle
• Example :
programme.o: programme.c
gcc -c programme.c -o programme.o
1. oubli de la tabulation :Makefile:8: *** missing separator. Stop.
J.-M Friedt
Makefile : introduction
Dans l’exemple pr´ ec´ edent :
a l l : e x e c
e x e c: main . o c o m m u n i c a t i o n . o f o n c t i o n . o
g c c −o e x e c main . o c o m m u n i c a t i o n . o f o n c t i o n . o −L r e p /→
,→b i b l i o −l b i b l i o main . o : main . c
g c c −I r e p / i n c −c main . c f o n c t i o n . o : f o n c t i o n . c
g c c −I r e p / i n c −c f o n c t i o n . c c o m m u n i c a t i o n . o : c o m m u n i c a t i o n . c
g c c −I r e p / i n c −c c o m m u n i c a t i o n . c
• la r`egleall(mot cl´e demake) n´ecessite les objets
• les objets n´ecessitent les codes sources (C)
• tenter de compiler un objet donc le code source n’existe pas :
make: *** No rule to make target ’x.c’, needed by ’x.o’. Stop.
5 / 10
J.-M Friedt
Makefile : variables
Variables :
• ´eliminer les redondances et les risques d’oubli lors de modifications du Makefile
• r´eutilisation du Makefile (ne changer que la cible)
• passage d’arguments depuis la ligne de commande en shell ( ?=) CFLAGS=−I r e p / i n c
LDFLAGS=−L r e p / b i b l i o −l b i b l i o EXECUTABLE?=e x e c
a l l : $(EXECUTABLE)
$(EXECUTABLE) : main . o c o m m u n i c a t i o n . o f o n c t i o n . o
g c c −o $(EXECUTABLE) main . o c o m m u n i c a t i o n . o f o n c t i o n . o→
,→ $( LDFLAGS ) main . o : main . c
g c c $( CFLAGS ) −c main . c f o n c t i o n . o : f o n c t i o n . c
g c c $( CFLAGS ) −c f o n c t i o n . c c o m m u n i c a t i o n . o : c o m m u n i c a t i o n . c
g c c $( CFLAGS ) −c c o m m u n i c a t i o n . c
valeur par d´efaut de ex´ecutable (exec) peut ˆetre modifi´ee en ligne de commande→
J.-M Friedt
Makefile : principe
• Automatise la s´ equence de commandes pour compiler un code source
• make ne recompile que les d´ ependances qui sont plus r´ ecentes que les r` egles (bas´ e sur la date de cr´ eation des fichiers) ⇒ gain de temps sur les gros projet (e.g. noyau Linux)
• il existe des g´ en´ erateurs de Makefile : cmake, configure (autoconf/M4) ...
• ajout de r` egles en compl´ ement de all: : habituellement clean, peut ˆ etre flash ...
7 / 10
J.-M Friedt
Makefile : conclusion
CFLAGS=−I r e p / i n c
LDFLAGS=−L r e p / b i b l i o−l b i b l i o MCU=a t m e g a 3 2 u 4
EXECUTABLE?=e x e c a l l : $(EXECUTABLE) . b i n
$(EXECUTABLE) . b i n : main . o c o m m u n i c a t i o n . o f o n c t i o n . o
g c c−o$(EXECUTABLE) main . o c o m m u n i c a t i o n . o f o n c t i o n . o$( LDFLAGS ) o b j c o p y−O b i n a r y $(EXECUTABLE) $(EXECUTABLE) . b i n
main . o : main . c
g c c$( CFLAGS )−c main . c f o n c t i o n . o : f o n c t i o n . c
g c c$( CFLAGS )−c f o n c t i o n . c c o m m u n i c a t i o n . o : c o m m u n i c a t i o n . c
g c c$( CFLAGS )−c c o m m u n i c a t i o n . c c l e a n :
rm ∗. o $(EXECUTABLE) $(EXECUTABLE) . b i n f l a s h :
a v r d u d e−c a v r 1 0 9−b 57 60 0−D−p$(MCU)−P / d e v / ttyACM0−e−U f l a s h : w :$(EXECUTABLE) . b i n
make cleanpour effacer les objets et le r´esultat,make flashpour flasher le microcontrˆoleur
J.-M Friedt
Makefile : avanc´ e
Des symboles qui facilitent la vie :
• $@ pour la r` egle (cible)
• $? pour les d´ ependances plus anciennes que la cible
• $^ pour toutes les d´ ependances
• $(wildcard *.o) pour toutes les d´ ependances
CFLAGS=−I r e p / i n c
LDFLAGS=−L r e p / b i b l i o −l b i b l i o EXECUTABLE?=e x e c
OBJ=$( w i l d c a r d ∗. c ) a l l : $(EXECUTABLE)
$(EXECUTABLE) : $( OBJ )
g c c −o $@ $( OBJ ) $( LDFLAGS ) c l e a n :
rm ∗. o
Une liste de variables d´ efinies par d´ efaut par make
22. www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
9 / 10
J.-M Friedt
Makefile : exercices
1
Proposez un Makefile capable de compiler un de vos programmes
`
a destination de l’Atmega32U4
2
D´ eplacez la phase d’initialisation de l’Atmega32U4 (code avant while (1) {...}) dans un code source init.c s´ epar´ e du programme principal et modifiez Makefile en cons´ equent.
3
Ajouter la r` egle pour nettoyer le r´ epertoire de travail des fichiers temporaires et de l’ex´ ecutable lors du lancement de la commande make propre
4