Bonjour,
Je suis confronté à un problème intéressant. Je travaille sur un projet pour lequel le makefile contient autant de règles que de fichier à compiler. J'aimerais bien le simplifier en les remplaçant pas une ligne du genre:
%.o : %.c
$(CC) $(OPTIONS) $(INCLUDE) -o $@ -c $<
C'est là que ça se complique:
- Tous les objets doivent aller dans le même répertoire
- Les fichiers source ne se trouvent pas tous au même endroit. Pas de possibilité de makefiles récursifs car je n'ai pas accès en écriture sur certains des répertoires.
- Les dépendance entre les fichiers entêtes et les fichiers sources ne sont pas triviales.
- La variable $< n'est pas positionnée si un chemin précède le fichier source (ce qui est toujours le cas).
Voici quelques exemples de regles de mon makefile:
1 2 3 4 5 6 7 8 9 10 11 12
|
$(D_OBJ)/comm.o : $(COMM)/comm.c $(COMM)/comm.h
$(CC) $(OPTIONS) $(INCLUDE)-o $(D_OBJ)/infra_comm.o -c $(COMM)/comm.c
$(D_OBJ)/checksum.o: $(D_AUTRES)/checksum.c $(D_AUTRES)/checksum.inc
$(CC) $(OPTIONS) $(INCLUDE)-o $(D_OBJ)/checksum.o -c $(D_AUTRES)/checksum.c
$(D_OBJ)/task.o: $(D_TIMER)/src/task.cpp $(D_TIMER)/inc/task.hpp
$(CC) $(OPTIONS) $(INCLUDE)-o $(D_OBJ)/task.o -c $(D_TIMER)/src/task.cpp
$(D_OBJ)/xml_tree.o: $(D_SRC)/xml_tree.cpp $(D_INC)/xml_tree.hpp $(D_INC)/header.hpp
$(CC) $(OPTIONS) $(INCLUDE) -c -o $(D_OBJ)/xml_tree.o $(D_SRC)/xml_tree.cpp |
Ces quelques lignes représentent assez bien la "biodiversité" des règles de mon makefile. C'est bien sympa, par contre c'est in-maintenable. Il y a au total 27 règles différentes, et 3 répertoires dans lesquels on va chercher les fichiers. Pour le moment, là seule optimisation que j'ai pu faire, c'est de remplace le "-o $(D_OBJ)/xml_tree.o" par "-o $@" pour toutes les règles.
J'aimerais essayer de regrouper mes regèles par répertoires pour avoir qu'une seule commande par répertoire. Je ne sais pas trop ce qui est faisable et ce qui ne l'ai pas.
Toute suggestion est la bienvenue, quelle qu'elle soit.
Merci!!!
Partager