작업중인 프로그램 (실제로 커널)을 빌드하는 데 사용하는 다음 메이크 파일이 있습니다. 처음부터 프로세스에 대해 배우고 있으므로 완벽하지는 않지만이 시점에서 메이크 파일 작성 경험 수준에 비해 충분히 강력하다고 생각합니다.
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
이 메이크 파일의 주요 문제는 하나 이상의 C 파일이 포함 된 헤더 파일을 수정할 때 C 파일이 다시 빌드되지 않는다는 것입니다. 내 모든 헤더 파일이 내 모든 C 파일에 대한 종속성이되도록함으로써이 문제를 아주 쉽게 해결할 수 있지만, 헤더 파일을 변경 / 추가 할 때마다 프로젝트를 완전히 재 빌드 할 수 있습니다.
내가 원하는 것은 내가 변경 한 헤더 파일 을 포함 하는 C 파일 만 다시 빌드하고 전체 프로젝트를 다시 링크하는 것입니다. 모든 헤더 파일을 대상의 종속성으로 설정하여 연결을 수행 할 수 있지만 포함 된 헤더 파일이 더 최신 일 때 C 파일을 무효화하는 방법을 알 수 없습니다.
GCC에이를 가능하게하는 몇 가지 명령이 있다고 들었지만 (메이크 파일이 어떤 파일을 재 빌드해야하는지 알아낼 수 있음) 실제 구현 예제를 볼 수는 없습니다. 누군가 메이크 파일에서이 동작을 가능하게하는 솔루션을 게시 할 수 있습니까?
편집 : 명확해야합니다. 개별 대상을 넣고 각 target.o에 헤더 파일이 필요하다는 개념에 익숙합니다. 어딘가에 헤더 파일을 포함 할 때마다 makefile을 편집해야하는데, 이는 약간의 고통입니다. 헤더 파일 종속성을 자체적으로 파생 할 수있는 솔루션을 찾고 있는데, 다른 프로젝트에서 본 것이 상당히 확실합니다.