Tôi có makefile sau mà tôi sử dụng để xây dựng một chương trình (thực tế là một hạt nhân) mà tôi đang làm việc. Nó từ đầu và tôi đang tìm hiểu về quy trình, vì vậy nó không hoàn hảo, nhưng tôi nghĩ rằng nó đủ mạnh vào thời điểm này đối với mức độ kinh nghiệm viết trang điểm của tôi.
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
Vấn đề chính của tôi với makefile này là khi tôi sửa đổi tệp tiêu đề mà một hoặc nhiều tệp C bao gồm, các tệp C không được tạo lại. Tôi có thể khắc phục điều này khá dễ dàng bằng cách đặt tất cả các tệp tiêu đề của tôi là tệp phụ thuộc cho tất cả các tệp C của tôi, nhưng điều đó có hiệu quả sẽ gây ra việc xây dựng lại hoàn toàn dự án bất kỳ khi nào tôi thay đổi / thêm tệp tiêu đề, điều này sẽ không được tốt cho lắm.
Điều tôi muốn là chỉ những tệp C bao gồm tệp tiêu đề mà tôi thay đổi được xây dựng lại và toàn bộ dự án được liên kết lại. Tôi có thể thực hiện liên kết bằng cách làm cho tất cả các tệp tiêu đề là phụ thuộc của đích, nhưng tôi không thể tìm ra cách làm cho tệp C bị vô hiệu khi tệp tiêu đề được bao gồm của chúng mới hơn.
Tôi đã nghe nói rằng GCC có một số lệnh để thực hiện điều này (vì vậy makefile bằng cách nào đó có thể tìm ra tệp nào cần được xây dựng lại) nhưng tôi không thể tìm thấy một ví dụ triển khai thực tế để xem xét. Ai đó có thể đăng một giải pháp sẽ kích hoạt hành vi này trong makefile không?
CHỈNH SỬA: Tôi nên làm rõ, tôi đã quen với khái niệm đưa các mục tiêu riêng lẻ vào và có mỗi mục tiêu. Để yêu cầu các tệp tiêu đề. Điều đó yêu cầu tôi phải chỉnh sửa tệp makefile mỗi khi tôi đưa tệp tiêu đề vào đâu đó, điều này hơi khó khăn. Tôi đang tìm kiếm một giải pháp có thể tự tạo ra các phụ thuộc tệp tiêu đề, điều mà tôi khá chắc chắn là tôi đã thấy trong các dự án khác.