ฉันมี makefile ต่อไปนี้ที่ใช้สร้างโปรแกรม (จริงๆแล้วเคอร์เนล) ที่ฉันกำลังทำงาน ตั้งแต่เริ่มต้นและฉันกำลังเรียนรู้เกี่ยวกับกระบวนการดังนั้นมันจึงไม่สมบูรณ์แบบ แต่ฉันคิดว่ามันมีประสิทธิภาพเพียงพอสำหรับระดับประสบการณ์การเขียน 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
ปัญหาหลักของฉันกับ makefile นี้คือเมื่อฉันแก้ไขไฟล์ส่วนหัวที่มีไฟล์ C ตั้งแต่หนึ่งไฟล์ขึ้นไปไฟล์ C จะไม่ถูกสร้างขึ้นมาใหม่ ฉันสามารถแก้ไขสิ่งนี้ได้อย่างง่ายดายโดยให้ไฟล์ส่วนหัวทั้งหมดของฉันเป็นที่อ้างอิงสำหรับไฟล์ C ทั้งหมดของฉัน แต่นั่นจะทำให้เกิดการสร้างโครงการใหม่อย่างสมบูรณ์ทุกครั้งที่ฉันเปลี่ยน / เพิ่มไฟล์ส่วนหัวซึ่งจะไม่เป็นประโยชน์
สิ่งที่ฉันต้องการคือเฉพาะไฟล์ C ที่มีไฟล์ส่วนหัวที่ฉันเปลี่ยนเพื่อสร้างใหม่และสำหรับโครงการทั้งหมดที่จะเชื่อมโยงอีกครั้ง ฉันสามารถทำการเชื่อมโยงได้โดยทำให้ไฟล์ส่วนหัวทั้งหมดขึ้นต่อกันของเป้าหมาย แต่ฉันไม่สามารถหาวิธีทำให้ไฟล์ C ไม่ถูกต้องได้เมื่อไฟล์ส่วนหัวที่รวมไว้นั้นใหม่กว่า
ฉันได้ยินมาว่า GCC มีคำสั่งบางอย่างที่จะทำให้สิ่งนี้เป็นไปได้ (ดังนั้น makefile จึงสามารถระบุได้ว่าไฟล์ใดต้องสร้างใหม่) แต่ฉันไม่สามารถหาตัวอย่างการใช้งานจริงให้ดูได้ตลอดชีวิต ใครสามารถโพสต์วิธีแก้ปัญหาที่จะเปิดใช้งานพฤติกรรมนี้ใน makefile ได้หรือไม่
แก้ไข: ฉันควรชี้แจงฉันคุ้นเคยกับแนวคิดในการใส่เป้าหมายแต่ละรายการและมีแต่ละเป้าหมายต้องการไฟล์ส่วนหัว นั่นทำให้ฉันต้องแก้ไข makefile ทุกครั้งที่รวมไฟล์ส่วนหัวไว้ที่ไหนสักแห่งซึ่งเป็นเรื่องที่น่าปวดหัว ฉันกำลังมองหาวิธีแก้ปัญหาที่สามารถได้รับการอ้างอิงไฟล์ส่วนหัวด้วยตัวมันเองซึ่งฉันค่อนข้างมั่นใจว่าฉันเคยเห็นในโครงการอื่น ๆ