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 modifie/ajoute un fichier d'en-tête, ce qui ne serait pas très gracieux.
Ce que je veux, c'est que seulement les fichiers C que inclure le fichier d'en-tête que je modifie doit être reconstruit, et le projet entier doit être lié à nouveau. Je peux effectuer la liaison en faisant en sorte que tous les fichiers d'en-tête soient des dépendances de la cible, mais je n'arrive pas à trouver comment faire en sorte que les fichiers C soient invalidés lorsque les fichiers d'en-tête inclus sont plus récents.
J'ai entendu dire que GCC avait des commandes pour rendre cela possible (de sorte que le makefile puisse d'une manière ou d'une autre déterminer quels fichiers doivent être reconstruits) mais je n'arrive pas à trouver un exemple d'implémentation réelle à regarder. Quelqu'un peut-il poster une solution permettant d'activer ce comportement dans un fichier makefile ?
EDIT : Je devrais clarifier, je suis familier avec le concept de mettre les cibles individuelles et d'avoir chaque cible.o nécessitant les fichiers d'en-tête. Cela m'oblige à modifier le makefile à chaque fois que j'inclus un fichier d'en-tête quelque part, ce qui est un peu pénible. Je cherche une solution qui puisse dériver les dépendances des fichiers d'en-tête par elle-même, ce que je suis pratiquement certain d'avoir vu dans d'autres projets.