comstackr les dépendances d’en-têtes avec makefile

Je programme une application serveur client UDP dans le langage de programmation C; Je veux comstackr automatiquement 2 fichiers sources et 3 fichiers d’en-tête chaque fois que les dépendances changent.

La cible du makefile s’appelle “edit” :

edit : server_UDP.o client_UDP.o \ gcc -o edit server_UDP.o client_UDP.o \ client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h gcc -c client_UDP.c server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h gcc -c server_UDP.c 

Cela ne déclenche pas de recompilation lorsque je modifie quelques lignes de code dans wrapHeader.h.

Comment modifier les règles de modification de fichier en cas de modification de wrapHeader.h pour recomstackr server_UDP et client_UDP?

** remarque : wrapHeader.h est l’en-tête principal.

cliHeader_UDP.h: inclure “wrapHeader.h”

servHeader_UDP.h: inclure “wrapHeader.h”

Je pense que vous voulez créer des fichiers de dépendance.

Vous pouvez spécifier que le compilateur génère un fichier de dépendance pour vous avec les arguments ‘-MMD -MP’, qui créent un nouveau fichier portant le même nom que le fichier source, à l’exception de l’extension * .d, dans le même dossier que votre source. .

Le fichier de dépendance contient tous les en-têtes dont dépend le code, ce qui conduira à la compilation par GNU de votre fichier source si un en-tête qu’il utilise est modifié.

Un exemple de fichier makeestack activé pour le fichier de dépendance:

 # Makefile CC := gcc LD := g++ # The output executable. BIN := program # Toolchain arguments. CFLAGS := CXXFLAGS := $(CFLAGS) LDFLAGS := # Project sources. C_SOURCE_FILES := mysourcefile1.c src/myothersrc.c C_OBJECT_FILES := $(patsubst %.c,%.o,$(C_SOURCE_FILES)) # The dependency file names. DEPS := $(C_OBJECT_FILES:.o=.d) all: $(BIN) clean: $(RM) $(C_OBJECT_FILES) $(DEPS) $(BIN) rebuild: clean all $(BIN): $(C_OBJECT_FILES) $(LD) $(C_OBJECT_FILES) $(LDFLAGS) -o $@ %.o: %.c $(CC) -c -MMD -MP $< -o $@ $(CFLAGS) # Let make read the dependency files and handle them. -include $(DEPS) 

Cela devrait fonctionner pour votre situation:

 SOURCES := server_UDP.c client_UDP.c OBJECTS := $(patsubst %.c,%.o,$(SOURCES)) DEPS := $(OBJECTS:.o=.d) edit: $(OBJECTS) gcc -o edit $(OBJECTS) %.o: %.c gcc -c $< -o $@ -include $(DEPS) 

Vous n’avez pas dit que edit.c inclut vos deux en-têtes spécifiques, mais j’imagine que si, les liens avec les objects sont liés.

C’est exactement le scénario dans lequel makepp joue l’un de ses points forts: si vous suivez la convention voulant que chaque fichier .o soit lié, il existe une instruction include avec un nom correspondant (dans votre cas, ce serait client_UDP.h & server_UDP.h ) puis makepp va tout résoudre lui-même, en plus de détecter les fichiers d’en-tête comme des dépendances.

Cela fonctionne même de manière récursive, donc si vous aviez un wrapHeader.c (où il n’y a pas d’instruction include correspondante dans edit.c ), cela serait automatiquement compilé et lié.

Donc, vous n’avez pas besoin d’un makefile . Mais si vous voulez éviter d’appeler makepp edit chaque fois, vous pouvez créer un one-liner

 edit: 

Vous n’aurez besoin d’apprendre la syntaxe que si vous avez des exigences plus complexes. Mais si vous le faites, il n’y a pas de limite. En plus de faire presque tout ce que GNU peut faire, il y a beaucoup plus de choses utiles, et vous pouvez même étendre vos makefiles avec de la programmation Perl.