Üzerinde çalıştığım bir programı (aslında bir çekirdek) oluşturmak için kullandığım aşağıdaki makefile var. Sıfırdan ve süreci öğreniyorum, bu yüzden mükemmel değil, ancak bu noktada makefile yazma deneyimim için yeterince güçlü olduğunu düşünüyorum.
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
Bu makefile ile ilgili temel sorunum, bir veya daha fazla C dosyasının içerdiği bir başlık dosyasını değiştirdiğimde, C dosyalarının yeniden oluşturulmamasıdır. Tüm üstbilgi dosyalarımın tüm C dosyalarım için bağımlılıklar olmasını sağlayarak bunu oldukça kolay bir şekilde düzeltebilirim, ancak bu, bir başlık dosyasını değiştirdiğim / eklediğim her seferinde projenin tamamen yeniden oluşturulmasına neden olur ki bu çok zarif olmaz.
İstediğim, yalnızca değiştirdiğim başlık dosyasını içeren C dosyalarının yeniden oluşturulması ve tüm projenin yeniden bağlanması. Bağlamayı, tüm başlık dosyalarının hedefin bağımlılıkları olmasına neden olarak yapabilirim, ancak C dosyalarının dahil edilen başlık dosyaları daha yeni olduğunda nasıl geçersiz kılınacağını çözemiyorum.
GCC'nin bunu mümkün kılmak için bazı komutları olduğunu duydum (böylece makefile bir şekilde hangi dosyaların yeniden oluşturulması gerektiğini anlayabilir) ama hayatım boyunca bakacak gerçek bir uygulama örneği bulamıyorum. Birisi bir makefile bu davranışı sağlayacak bir çözüm gönderebilir mi?
DÜZENLEME: Açıklığa kavuşturmalıyım, bireysel hedefleri yerleştirme ve her bir hedefe sahip olma kavramına aşinayım. Başlık dosyalarını gerektiriyor. Bu, bir yere bir üstbilgi dosyası eklediğim her seferinde makefile'ı düzenlememi gerektiriyor, bu biraz acı verici. Başlık dosyası bağımlılıklarını kendi başına türetebilen bir çözüm arıyorum, diğer projelerde gördüğümden oldukça eminim.