[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-team] Re: Makefiles
> Quelqu'un, pourrait-il m'expliquer simplement comme creer un make file ?
Pff... "simplement" ? :)
Bon, je vais essayer, simplement...
Un makefile est un ensemble de règles ("rules") qui définissent des dépendances entre
fichiers, selon la syntaxe (très stricte):
fichier: depend_de_1 depend_de_2 ...
action1
action2
depend_de_? sont aussi des fichiers
action? est n'importe quoi... echo, cc, ld, ... du shell, quoi.
Note que entre fichier: et depend_de... ce sont *2 tabulations* (et pas autre chose), ainsi
que les lignes action?: elles sont précédées de 2 tabulations aussi.
Ca, ce sont les règles pour les vieux make - le GNU make (donc celui sous Linux) est beaucoup
plus souple: une tabulation ou un ou plusieurs espace(s) fait l'affaire aussi.
Un exemple de C++:
socket.o: socket.h socket.cc
echo "Compiling socket.o"
c++ -c socket.cc
server.o: server.h server.cc
echo "Compiling server.o"
c++ -c server.cc
server: server.o socket.o
echo "Linking server"
c++ -o server server.o socket.o
Voilà.
La règle 1 (socket.o) définit que socket.o dépend de socket.h et socket.cc
En clair, ça veut dire que quand tu tapes "make", make va vérifier les timestamps (la date de dernère
modification, en fait) des fichiers socket.o, socket.h et socket.cc.
Si (ddm == date de dernière modification):
- socket.o n'existe pas
- ddm(socket.h) > ddm(socket.o)
- ddm(socket.cc) > ddm(socket.o)
alors make va éxécuter les lignes d'action qui se trouvent en-dessous de cette règle.
Dans ce cas-ci, il va afficher le message "Compiling socket.o" et va faire ça ;)
Voilà, en gros, c'est le principe.
Il y a aussi moyen de définir des variables (très conseillé), dont la plus courant est le compilateur:
CXX=c++ -DOS=Linux -I/usr/local/include
Il faut alors modifier les règles comme ceci (ici, pour socket.o):
socket.o: socket.h socket.cc
echo "..."
$(CXX) -c socket.cc
Contrairement au shell, il ne faut pas faire $CXX ou ${CXX} mais bien $(CXX) ;)
Il y a moyen de modifier la valeur de ces variables depuis la ligne de commande, p.ex.:
make CXX="c++ -DOS=AIX" PREFIX="/usr/local"
En principe, on doit aussi dire *ce* qu'on voudrait bien "make"r (ça s'appelle un "target") ;)
Ici:
make server
Lorsque l'on appelle simplement "make" sans spécifier de "target", make prend "all" comme
target. On devrait toujours définir ce target. Dans notre exemple:
all: server
Mais ça peut aussi être:
all: server client libmysocket.a
Note qu'on ne met pas d'actions en dessous, parce que cette ligne ne définit que des dépendances.
Comme les dépendances sont vérifiées récursivement (si server dépend de libmysocket.a, make va
d'abord vérifier les dépendances de libmysocket.a et éventuellement éxécuter les actions définies
là-bas - ce procédé est évident), les dépendances de server, client et libmysocket.a seront vérifiées
une après une dans les définitions de dépendances de celles-ci, plus loin dans le makefile...
Notre makefile devient:
--------------------------------------------------
CC=c++ -DOS=Linux -I/usr/local/include
all: server
.SILENT:
socket.o: socket.h socket.cc
echo "Compiling socket.o"
c++ -c socket.cc
server.o: server.h server.cc
echo "Compiling server.o"
c++ -c server.cc
server: server.o socket.o
echo "Linking server"
c++ -o server server.o socket.o
--------------------------------------------------
Le .SILENT: c'est une petite astuce... Sans ça, make va afficher chaque ligne d'action avant de l'éxécuter.
Maintenant, "make" est pareil que "make all", qui revient au même que "make server" ;))
Sinon, jette un oeil sur qqes makefiles existants pour te faire une idée, et consulte la
documentation (man make).
-o) Pascal Bleser | UNIX *is* user friendly.
/\\ C++/UNIX Development | It's just selective about
_\_v ATOS Payment Systems | who its friends are...
pbleser@atos-group.com---------------------------------
---------
This message was sent by Majordomo 1.94.3. Please report problems to
manu@rtfm.be. If you want to be deleted from the list, send a mail to
majordomo@rtfm.be with "unsubscribe linux-team" in the body.