У меня есть следующий make файл, который я использую для сборки программы (на самом деле ядро), над которой я работаю. Это с нуля, и я изучаю процесс, поэтому он не идеален, но я думаю, что его достаточно мощный на данный момент для моего уровня опыта написания make файлов.
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 [email protected] $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o [email protected]
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o [email protected] $<
#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf
Моя основная проблема с этим make файлом заключается в том, что когда я изменяю заголовочный файл, содержащий один или несколько файлов C, файлы C не перестраиваются. Я могу исправить это довольно легко, имея все мои файлы заголовков зависимостями для всех моих файлов C, но это может привести к полной перестройке проекта в любое время, когда я изменил/добавил файл заголовка, что было бы не очень изящным.
То, что я хочу, это только для файлов C, которые включают файл заголовка, который я изменяю, чтобы быть перестроенным, и для того, чтобы весь проект был связан снова. Я могу сделать ссылку, заставив все файлы заголовков быть зависимыми от цели, но я не могу понять, как сделать файлы C недействительными, когда их включенные заголовочные файлы являются более новыми.
Я слышал, что GCC имеет некоторые команды, чтобы сделать это возможным (так что makefile может каким-то образом определить, какие файлы нужно перестраивать), но я не могу на всю жизнь найти реальный пример реализации. Может ли кто-нибудь опубликовать решение, которое позволит это поведение в make файле?
РЕДАКТИРОВАТЬ: Я должен уточнить, я знаком с концепцией включения отдельных целей и наличия каждого target.o, требующих файлы заголовков. Это требует, чтобы я редактировал make файл каждый раз, когда я включаю файл заголовка где-то, что немного больно. Я ищу решение, которое может самостоятельно определять зависимости заголовка файла, что я вполне уверен, что видел в других проектах.