Mam następujący plik makefile, którego używam do budowania programu (właściwie jądra), nad którym pracuję. To jest od zera i uczę się o tym procesie, więc nie jest doskonały, ale myślę, że w tym momencie jest wystarczająco potężny, jak na mój poziom doświadczenia w pisaniu makefile.
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
Moim głównym problemem związanym z tym plikiem makefile jest to, że kiedy modyfikuję plik nagłówkowy, który zawiera jeden lub więcej plików C, pliki C nie są odbudowywane. Mogę to dość łatwo naprawić, mając wszystkie moje pliki nagłówkowe jako zależności dla wszystkich moich plików C, ale to skutecznie spowodowałoby całkowitą przebudowę projektu za każdym razem, gdy zmieniłem / dodałem plik nagłówkowy, co nie byłoby zbyt wdzięczne.
To, czego chcę, to tylko pliki C. zawierają zmieniony przeze mnie plik nagłówkowy, zostały odbudowane, a cały projekt został ponownie połączony. Mogę wykonać linkowanie, powodując, że wszystkie pliki nagłówkowe są zależnościami celu, ale nie mogę dowiedzieć się, jak unieważnić pliki C, gdy dołączone pliki nagłówkowe są nowsze.
Słyszałem, że GCC ma kilka poleceń, które to umożliwiają (więc plik makefile może w jakiś sposób dowiedzieć się, które pliki należy odbudować), ale nie mogę za całe życie znaleźć rzeczywistego przykładu implementacji do obejrzenia. Czy ktoś może opublikować rozwiązanie, które umożliwi takie zachowanie w pliku makefile?
EDYCJA: Powinienem wyjaśnić, jestem zaznajomiony z koncepcją umieszczania poszczególnych celów i posiadania każdego celu. Aby wymagać plików nagłówkowych. To wymaga ode mnie edytowania pliku makefile za każdym razem, gdy umieszczam gdzieś plik nagłówkowy, co jest trochę uciążliwe. Szukam rozwiązania, które może samodzielnie wyprowadzić zależności pliku nagłówkowego, co jestem pewien, że widziałem w innych projektach.