2011-08-22 32 views
5

Tôi đã viết một Makefile thực hiện một số thế hệ phụ thuộc và tôi thấy mình phải lặp lại quy tắc vì codebase (cũ) chứa hỗn hợp các tệp .cpp.cc. Có vẻ hơi khó coi. Có cách nào để chỉ định rằng các điều kiện tiên quyết của một mục tiêu có thể là các tệp .cpp hoặc .cc?Tránh sao chép GNU Thực hiện quy tắc

Vì vậy, thay vì phải:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

Tạo một cái gì đó mà không có sự trùng lặp như:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

Hoặc là dư thừa này được thực thi chỉ là một yếu tố không may của GNU Make của thiết kế?

+0

nếu bạn sử dụng GNU autotools bạn có thể có thể sử dụng macro m4 – Kevin

Trả lời

3

tùy chọn đầu tiên, sử dụng một biến để xác định cơ thể cai trị một lần, và tái sử dụng nó khi cần thiết:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

tùy chọn Thứ hai, sử dụng $(eval) để tự động tạo ra các quy tắc:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

Tùy chọn một là chính xác những gì tôi đang tìm kiếm. – Alastair

1

này nên làm việc:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

Một ý tưởng:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

ý tưởng khác là để làm cho GNU làm tạo ra hai quy tắc mẫu. Có essentally hai cách để làm điều này:

  • ghi chúng vào makefiles (%-cc.mk hoặc tương tự) mà bạn bao gồm trong makefile thực tế của bạn với tuyên bố GNU làm của include
  • tạo và đánh giá chúng inline với make của GNU $(eval)$(call) functions

Giống như hầu hết mọi thứ khác trong chuỗi công cụ phát triển C/Unix, những kỹ thuật này về cơ bản là một hình thức tiền xử lý, giúp chúng dễ hiểu với mức giá thực sự khó sử dụng (rất nhiều gấp đôi hoặc gấp ba lần thoát, thực sự khó khăn để theo dõi những gì được mở rộng khi; gỡ lỗi có thể là một nỗi đau hoàng gia, ít nhất là trong kinh nghiệm của tôi).

Vì vậy, hãy đặt trước chúng cho các trường hợp sử dụng phức tạp hơn (trong đó Stack Overflow liệt kê một vài trường hợp).

+0

Không có tùy chọn nào trong số đó dường như dẫn đến một tệp makefile ngắn gọn hơn. Tôi có lẽ sẽ chỉ dính vào hình thức ban đầu. Cảm ơn lời đề nghị của bạn mặc dù. – Alastair

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