ZephLe 04/10/2015 à 20:30
Du tout non. Pour info je crois que j'avais posé une question similaire sur yAronet mais comme je ne suis pas 0² je ne sais plus où il est, alors voilà en résumé quel était mon problème :
Une des façons de procéder pour cette histoire de dépendance est de générer, pour chaque fichier source (.c / .cpp), un fichier qui contienne les dépendances de ce fichier. Pour info ça n'est pas la seule façon de faire, on pourrait aussi tout centraliser dans un gros fichier "dépendances", mais je préférais faire comme ça. Mon souci était que je ne voulais pas avoir un fichier de dépendance qui soit créé à côté de chaque fichier source (par exemple toto.d pour toto.c), donc je voulais les mettre dans un sous-dossier à part. Ça impliquait de créer ce sous-dossier et d'y recréer toute la hiérarchie de mes .c / .cpp, ce qui est facile à faire sous Unix avec "mkdir -p" mais moins sous Windows qui ne propose pas de commande équivalente, du coup il faut ajouter un peu de code. Bref, passons cette dernière contrainte, voilà où j'en étais arrivé à part cette dernière étape qui rend les choses plus compliquées et dont tu n'as peut-être pas besoin. J'ai viré toutes les règles inutiles ici et ajouté quelques commentaires, en espérant que ce soit compréhensible :# Une dépendance existe pour chaque fichier source, et se trouve dans un sous-dossier
#obj/ (variable $(OBJ)) par rapport à mes sources qui sont dans src/ (variable $(SRC))
DEPENDENCIES = $(addprefix $(OBJ)/,$(patsubst %.c,%.d,$(SOURCES)))
# Idem pour les fichiers objet
OBJECTS = $(addprefix $(OBJ)/,$(patsubst %.c,%.o,$(SOURCES)))
# Construire l'exécutable à partir des fichiers objet
$(TARGET): $(OBJECTS)
$(LD) -o "$@" $(OBJECTS) $(LDFLAGS)
# On importe toutes les règles de dépendance générées, ce qui permet de provoquer la
# recompilation d'un .c en .o dès que l'une de ses dépendances a été touchée
-include $(DEPENDENCIES)
# Pour générer un fichier de dépendance à partir d'un fichier source, on crée son dossier
# parent puis on utilise GCC
$(OBJ)/%.d: $(SRC)/%.c
mkdir -p "${@D}"
$(CC) $(CFLAGS) -MM -MP -MF "$@" -MT "$(@:.d=.o)" "$<"
# Ensuite, pour générer un fichier objet à partir d'un fichier source et de ses
# dépendances, re-GCC (cette fois le dossier existe déjà)
$(OBJ)/%.o: $(SRC)/%.c $(OBJ)/%.d
$(CC) $(CFLAGS) -c "$<" -o "$@"Note : j'utilise quelques transformations qui n'existent peut-être que dans gnumake mais pas dans make, à vérifier.