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 !
Điều đó gán để 'tác FLAGS'? Bạn đang sử dụng phiên bản Make nào? – Beta
Một giải pháp không đệ quy: http://stackoverflow.com/a/7321954/412080 –
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