私が取り組んでいるプログラム(実際にはカーネル)をビルドするために使用する次の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
このメイクファイルの主な問題は、1つ以上のCファイルに含まれるヘッダーファイルを変更すると、Cファイルが再構築されないことです。すべてのヘッダーファイルをすべてのCファイルの依存関係にすることで、これを簡単に修正できますが、ヘッダーファイルを変更または追加すると、プロジェクトが完全に再構築されます。
私が欲しいのは、変更したヘッダーファイルを含む Cファイルのみをリビルドして、プロジェクト全体を再度リンクすることです。すべてのヘッダーファイルをターゲットの依存関係にすることでリンクを作成できますが、含まれているヘッダーファイルが新しい場合にCファイルを無効にする方法を理解できません。
GCCにはこれを可能にするコマンドがいくつかあると聞いたことがあります(そのため、makefileはどのファイルを再構築する必要があるかを何らかの形で把握できます)。メイクファイルでこの動作を可能にするソリューションを誰かが投稿できますか?
編集:私は明確にする必要があります、私は個々のターゲットを配置し、各target.oにヘッダーファイルを要求させるという概念に精通しています。そのため、ヘッダーファイルをどこかにインクルードするたびにメイクファイルを編集する必要がありますが、これは少し面倒です。ヘッダーファイルの依存関係を独自に導出できるソリューションを探しています。これは、他のプロジェクトで見たことがかなり確実です。