Tôi có các makefile sau đây mà tôi sử dụng để xây dựng một chương trình (một hạt nhân, thực sự) mà tôi đang làm việc trên. Nó từ đầu và tôi đang học về quá trình, vì vậy nó không hoàn hảo, nhưng tôi nghĩ rằng nó đủ mạnh mẽ vào thời điểm này cho mức độ kinh nghiệm của tôi viết makefiles.Làm cách nào để có một tệp Makefile tự động tạo lại các tệp nguồn bao gồm tệp tiêu đề đã sửa đổi? (Trong C/C++)
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 [email protected] $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o [email protected]
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o [email protected] $<
#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 xây dựng lại. Tôi có thể sửa lỗi này khá dễ dàng bằng cách có tất cả các tệp header của tôi là 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 dựng lại hoàn toàn dự án bất cứ khi nào tôi thay đổi/thêm tệp tiêu đề.
Điều tôi muốn chỉ dành cho các tệp C mà bao gồm tệp tiêu đề 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ể cho tôi thấy một ví dụ triển khai thực tế để xem . Ai đó có thể gửi một giải pháp mà sẽ cho phép hành vi này trong một makefile?
EDIT: Tôi nên làm rõ, tôi quen thuộc với khái niệm đặt các mục tiêu riêng lẻ vào và có mỗi target.o yêu cầu các tệp tiêu đề. Điều đó đòi hỏi tôi phải chỉnh sửa các makefile mỗi khi tôi bao gồm một tập tin tiêu đề ở đâu đó, đó là một chút đau đớn. Tôi đang tìm một giải pháp có thể lấy được các phụ thuộc tập tin tiêu đề của riêng nó, mà tôi khá chắc chắn tôi đã nhìn thấy trong các dự án khác.
Tôi có thể bị nhầm lẫn, nhưng tôi nghĩ GCC đã thực sự thêm một tính năng để thử và giải quyết vấn đề đó. Xem http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html cụ thể -MP. –
Có, -MP tồn tại kể từ GCC 3, tồn tại trong clang và icc, và không có nhu cầu về sed. http://bruno.defraine.net/techtips/makefile-auto-dependencies-with-gcc/#comment-50775 – hmijail