2013-03-14 29 views
5

Tôi sử dụng cờ -MM trong GCC để tạo phụ thuộc cho các đối tượng makefile cho các đối tượng. Hàm makefile trông giống như sau:Đường dẫn tạo phụ thuộc GCC makefile

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

Các nguồn được đặt trong thư mục src. Tuy nhiên, các tập tin autodep sẽ chứa các mục tiêu đối tượng mà không cần đường dẫn tương đối của họ:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

Làm thế nào tôi nên biến chúng thành này:

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

?

Tôi đã thử sử dụng cờ -MT, nhưng dường như loại bỏ hoàn toàn mục tiêu đối tượng.

Trả lời

6

-MT đặt toàn bộ tên mục tiêu. Nếu bạn muốn có một mục tiêu khác nhau cho từng nguồn, bạn cần một -MT lập luận khác nhau cho từng nguồn, có nghĩa là nhiều lời gọi của trình biên dịch và một vòng lặp foreach:

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

Cách khác, bạn có thể sử dụng sed để xoa bóp đầu ra

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

dễ dàng hơn vẫn là đặt sự phụ thuộc cho mỗi tập tin nguồn vào nó tập tin .d riêng và sử dụng -MMD cờ để tạo ra rằng khi bạn biên dịch tập tin nguồn:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
+0

Cảm ơn! Tôi sử dụng vòng lặp 'foreach' và nội dung của' autodep' là chính xác ngay bây giờ. Nhưng nó không thực sự có vẻ hiệu quả. Sử dụng ví dụ từ câu hỏi, nếu tôi thay đổi 'src/bar.h' và chạy' make' tôi chỉ nhận 'make: \' src/foo.o 'là cập nhật'. –

+0

Giải quyết nó bằng cách đặt '-include' sau' all: '. –

Các vấn đề liên quan