У мене є такий make-файл, який я використовую для побудови програми (власне ядра), над якою працюю. Це з нуля, і я дізнаюся про процес, тому він не ідеальний, але я думаю, що він досить потужний на даний момент для мого рівня досвіду написання графічних файлів.
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
Моя головна проблема з цим make-файлом полягає в тому, що коли я змінюю файл заголовка, який включає один або кілька файлів C, файли C не відновлюються. Я можу це досить легко виправити, встановивши, що всі мої файли заголовків є залежностями для всіх моїх файлів C, але це фактично призведе до повної перебудови проекту в будь-який час, коли я зміню / додаю файл заголовка, що буде не дуже витончено.
Я хочу, щоб було відновлено лише файли C, які містять файл заголовка, який я змінюю, і щоб весь проект був зв’язаний заново. Я можу зробити зв’язування, викликаючи всі файли заголовків залежностями цілі, але я не можу зрозуміти, як зробити файли C недійсними, коли включені файли заголовків новіші.
Я чув, що GCC має кілька команд, щоб зробити це можливим (так що make-файл може якимось чином зрозуміти, які файли потрібно переробляти), але я не можу протягом життя знайти реальний приклад реалізації, на який можна подивитися. Чи може хтось опублікувати рішення, яке дозволить таку поведінку у файлі make?
EDIT: Я повинен уточнити, я знайомий з концепцією введення окремих цілей і наявності кожної цілі. Потрібні файли заголовків. Це вимагає від мене редагування make-файлу кожного разу, коли я де-небудь включаю файл заголовка, що трохи болить. Я шукаю рішення, яке може самостійно вивести залежності файлу заголовка, що я впевнений, що бачив в інших проектах.