2012-07-09 26 views
7

Một số ngày trước, tôi đã đăng câu trả lời trong ngăn xếp tràn về cách viết một công cụ phân cấp (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file). Câu trả lời đã bị xóa, do đó tôi giả định rằng nó đã hoàn toàn sai hoặc tắt chủ đề (hoặc cả hai).Làm thế nào để viết một Makefile phân cấp đơn giản?

Tôi muốn biết cách viết Makefile phân cấp. Đây là một Makefile gọi một vài Makefiles trong các thư mục con. Tôi giả định một cấu trúc thư mục như:

- project 
    |--module1 
     |--Makefile 
     |--... 
    |--module2 
    |--Makefile 
    |--module2.1 
    |--module2.2 
    |--... 
    |--module3 
    |--Makefile 
    |--... 
    |--etc 

Tôi cũng giả định rằng các thành viên dự án đã chỉ đồng ý chỉ khi một tập tối thiểu các tiêu makefile như: tất cả (mặc định), sạch sẽ, cài đặt, và như vậy. Vì vậy, các lệnh sau đây bao gồm cả làm cho lá cờ sẽ được truyền tới các module:

cd project 
make clean 
make -k 
make install 
#etc 

Điều gì là sai với Makefile dự án sau:

PACKAGES = \ 
    module1 \ 
    module2 \ 
    emodule3 

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES}) 

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): $(VIRTUAL_PACKAGES) 

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS) 

có, $ VIRTUAL_PACKAGES trong Makefile trông lẻ. Giải pháp thay thế trộn một vòng lặp for là một chút ngắn hơn nhưng tôi không chắc chắn nếu nó là tốt hơn (như tôi cần phải dựa vào bash): GÓI = \ module1 \ module2 \ emodule3

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p [email protected] || break; done 

Cảm ơn !

+0

Điều đó gán để 'tác FLAGS'? Bạn đang sử dụng phiên bản Make nào? – Beta

+0

Một giải pháp không đệ quy: http://stackoverflow.com/a/7321954/412080 –

+0

Có thể hoặc có thể không hữu ích cho bạn, nhưng để quản lý các dự án phức tạp, tôi thấy cách dễ dàng hơn của cmake. Nó thực sự dễ dàng để có một hệ thống phân cấp của CMakeLists.txt. Makefiles sẽ được tạo tự động. – Hindol

Trả lời

7

Có "con rồng" ở đây. Nó có thể được thực hiện, nhưng các hàm ý có thể phức tạp.

Google, "Đệ quy được coi là có hại". Bạn sẽ nhận được rất tốt (đơn giản) minh họa chính xác những gì bạn muốn (ví dụ, phân cấp-thực hiện), cộng với giải thích tốt về những cạm bẫy/mối quan tâm. Một số "phản hồi" sẽ thảo luận về "các phương pháp hay nhất" có thể có và các cách để giảm thiểu các vấn đề. Sau đó, bạn có thể quyết định xem các vấn đề được nêu có hấp dẫn cho ứng dụng của bạn hay không.

Các giấy bản gốc:

http://miller.emu.id.au/pmiller/books/rmch/

Một số liên kết khác:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html

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