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