У меня есть следующий make-файл, который я использую для создания программы (ядро, фактически), над которой я работаю. Это с нуля, и я изучаю процесс, поэтому он не идеален, но я думаю, что он достаточно мощный на данный момент для моего уровня опыта написания make-файлов.Как я могу заставить Makefile автоматически пересобирать исходные файлы, содержащие измененный файл заголовка? (В C/C++)
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
Моя главная проблема с этим Makefile в том, что, когда я изменить заголовок файла, что один или несколько файлов C включают в себя файлы C не перестраиваются. Я могу исправить это довольно легко, имея все мои файлы заголовков зависимостями для всех моих файлов C, но это может привести к полной перестройке проекта в любое время, когда я изменил/добавил файл заголовка, что было бы не очень изящным.
То, что я хочу, это только файлы C, которые включают файл заголовка, который я изменяю, чтобы быть перестроенным, и для того, чтобы весь проект был связан снова. Я могу сделать ссылку, заставив все файлы заголовков быть зависимыми от цели, но я не могу понять, как сделать файлы C недействительными, когда их включенные файлы заголовков более новые.
Я слышал, что у GCC есть некоторые команды, чтобы сделать это возможным (так что makefile может каким-то образом определить, какие файлы нужно перестраивать), но я не могу на всю жизнь найти реальный пример реализации, чтобы посмотреть на , Может ли кто-нибудь опубликовать решение, которое позволит это поведение в make-файле?
EDIT: Я должен уточнить, я знаком с концепцией ввода индивидуальных целей и наличия каждой цели. Это требует, чтобы я редактировал make-файл каждый раз, когда я включаю файл заголовка где-то, что немного больно. Я ищу решение, которое может самостоятельно определять зависимости заголовка файла, что я вполне уверен, что видел в других проектах.
Возможно, я ошибаюсь, но я думаю, что GCC фактически добавил функцию, чтобы попытаться обойти эту проблему. Проверьте http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html в частности -MP. – 2013-10-21 01:44:29