J'ai le makefile suivant que j'utilise pour construire un programme (un noyau, en fait) sur lequel je travaille. C'est à partir de zéro et j'apprends le processus, donc ce n'est pas parfait, mais je pense que c'est assez puissant à ce stade pour mon niveau d'expérience dans l'écriture de makefiles.
AS = nasm
CC = gcc
LD = ld
TARGET = core
BUILD = build
SOURCES = source
INCLUDE = include
ASM = assembly
VPATH = $(SOURCES)
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
-nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS = -f elf
#CFILES = core.c consoleio.c system.c
CFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES = assembly/start.asm
SOBJS = $(SFILES:.asm=.o)
COBJS = $(CFILES:.c=.o)
OBJS = $(SOBJS) $(COBJS)
build : $(TARGET).img
$(TARGET).img : $(TARGET).elf
c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img
$(TARGET).elf : $(OBJS)
$(LD) -T link.ld -o $@ $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o $@
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o $@ $<
#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf
Mon principal problème avec ce makefile est que lorsque je modifie un fichier d'en-tête qu'un ou plusieurs fichiers C incluent, les fichiers C ne sont pas reconstruits. Je peux résoudre ce problème assez facilement en faisant en sorte que tous mes fichiers d'en-tête soient des dépendances pour tous mes fichiers C, mais cela entraînerait effectivement une reconstruction complète du projet chaque fois que je modifierais / ajouterais un fichier d'en-tête, ce qui ne serait pas très gracieux.
Ce que je veux, c'est que seuls les fichiers C qui incluent le fichier d'en-tête que je modifie soient reconstruits et que l'ensemble du projet soit à nouveau lié. Je peux faire le lien en faisant en sorte que tous les fichiers d'en-tête soient des dépendances de la cible, mais je ne peux pas comprendre comment rendre les fichiers C invalides lorsque leurs fichiers d'en-tête inclus sont plus récents.
J'ai entendu dire que GCC a quelques commandes pour rendre cela possible (afin que le makefile puisse d'une manière ou d'une autre déterminer quels fichiers doivent être reconstruits) mais je ne peux pas pour la vie de moi trouver un exemple d'implémentation réel à regarder. Quelqu'un peut-il publier une solution qui permettra ce comportement dans un makefile?
EDIT: Je devrais clarifier, je suis familier avec le concept de mettre les cibles individuelles et d'avoir chaque target.o exiger les fichiers d'en-tête. Cela m'oblige à modifier le fichier makefile chaque fois que j'inclus un fichier d'en-tête quelque part, ce qui est un peu pénible. Je recherche une solution qui puisse dériver les dépendances du fichier d'en-tête par elle-même, ce que je suis assez certain d'avoir vu dans d'autres projets.