我使用下面的makefile來構建我正在開發的程序(實際上是一個內核)。它從零開始,我正在學習這個過程,所以它並不完美,但我認爲它足夠強大,在這一點上我的經驗寫作makefile。如何讓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
我與此生成的文件主要問題是,當我修改頭文件中的一個或多個C文件包括的C文件不重建。我可以通過讓所有頭文件成爲所有C文件的依賴關係來很容易地解決這個問題,但是如果任何時候改變/添加頭文件,那麼這將有效地導致項目的完全重建,這不會很優雅。
我想要的只是包含包括的C文件,我更改的頭文件被重建,並且整個項目再次鏈接。我可以通過使所有頭文件成爲目標的依賴關係來進行鏈接,但我無法弄清楚如何在包含的頭文件更新時使C文件失效。
我聽說GCC有一些命令可以使這成爲可能(因此makefile可以以某種方式找出哪些文件需要重建),但我不能在我的生活中找到一個實際的實現示例來看看。有人可以發佈一個解決方案,將在makefile中啓用此行爲嗎?
編輯:我應該澄清,我熟悉將個別目標放入並具有每個target.o需要頭文件的概念。這要求我每次在某處添加頭文件時都要編輯makefile,這有點痛苦。我正在尋找一個解決方案,它可以自行獲取頭文件依賴項,我相當肯定我在其他項目中看到過。
我可能會誤解,但我認爲GCC實際上增加了一項功能來嘗試解決sed問題。請特別注意http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html。 – 2013-10-21 01:44:29