Saya memiliki makefile berikut yang saya gunakan untuk membangun program (sebenarnya kernel) yang sedang saya kerjakan. Ini dari awal dan saya belajar tentang prosesnya, jadi ini tidak sempurna, tapi saya pikir ini cukup kuat pada titik ini untuk tingkat pengalaman saya menulis makefiles.
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
Masalah utama saya dengan makefile ini adalah bahwa ketika saya memodifikasi file header yang disertakan satu atau lebih file C, file C tidak dibangun kembali. Saya dapat memperbaikinya dengan cukup mudah dengan membuat semua file header saya menjadi dependensi untuk semua file C saya, tetapi itu secara efektif akan menyebabkan pembangunan kembali proyek secara lengkap setiap kali saya mengubah / menambahkan file header, yang tidak akan terlalu anggun.
Yang saya inginkan hanya untuk file C itu menyertakan file header yang saya ubah untuk dibangun kembali, dan untuk seluruh proyek untuk ditautkan lagi. Saya dapat melakukan penautan dengan membuat semua file header menjadi dependensi dari target, tetapi saya tidak dapat menemukan cara membuat file C menjadi tidak valid ketika file header yang disertakan lebih baru.
Saya pernah mendengar bahwa GCC memiliki beberapa perintah untuk memungkinkan hal ini (sehingga makefile entah bagaimana dapat mengetahui file mana yang perlu dibangun kembali) tetapi saya tidak dapat seumur hidup saya menemukan contoh implementasi yang sebenarnya untuk dilihat. Dapatkah seseorang memposting solusi yang akan mengaktifkan perilaku ini di makefile?
EDIT: Saya harus mengklarifikasi, saya akrab dengan konsep menempatkan target individu dan memiliki setiap target.o memerlukan file header. Itu mengharuskan saya untuk mengedit makefile setiap kali saya menyertakan file header di suatu tempat, yang agak merepotkan. Saya mencari solusi yang dapat memperoleh dependensi file header sendiri, yang saya cukup yakin pernah saya lihat di proyek lain.