Ngoài ra còn có một cách để liệt kê thư mục con với gmake lệnh duy nhất, mà không sử dụng bất kỳ lệnh shell:
test:
@echo $(filter %/, $(wildcard lib/*/))
này sẽ liệt kê tất cả các thư mục con với trailing '/'
. Để loại bỏ nó, bạn có thể sử dụng các mô hình thay thế:
subdirs = $(filter %/, $(wildcard lib/*/))
test:
@echo $(subdirs:%/=%)
Sau đó, để thực sự tạo các quy tắc thực hiện makefiles trong mỗi thư mục con bạn có thể sử dụng một thủ thuật nhỏ - một mục tiêu giả mạo trong một thư mục không tồn tại. Tôi nghĩ trong trường hợp này, một ví dụ sẽ cho biết nhiều hơn bất kỳ lời giải thích nào:
FULL_DIRS =$(filter %/, $(wildcard lib/*/))
LIB_DIRS =$(FULL_DIRS:%/=%)
DIRS_CMD =$(foreach subdir, $(LIB_DIRS), make-rule/$(subdir))
make-rule/%:
cd $* && $(MAKE)
all: DIRS_CMD
Về cơ bản, mục tiêu là tất cả các thư mục con làm điều kiện tiên quyết. Ví dụ, nếu LIB_DIRS
chứa lib/folder1 lib/folder2
sau đó mở rộng sẽ trông như thế này:
all: make-rule/lib/folder1 make-rule/lib/folder2
Then 'make', để thực hiện quy tắc 'all'
, cố gắng để phù hợp với từng điều kiện tiên quyết với mục tiêu hiện có. Trong trường hợp này, mục tiêu là 'make-rule/%:'
, sử dụng '$*'
để trích xuất chuỗi sau 'make-rule/'
và sử dụng nó làm đối số trong công thức. Ví dụ, điều kiện tiên quyết đầu tiên sẽ được xuất hiện và mở rộng như thế này:
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)
Wow, cảm ơn. Làm việc như một say mê! – Zed
Tại sao bạn chưa định nghĩa '$ (clean_LIBS)' là giả mạo? Ví dụ. '.PHONY: $ (LIBS) $ (clean_LIBS)', sau đó tôi nghĩ bạn không cần 'force'. –
@dma_k: Bạn có một điểm tuyệt vời. Tôi đã không thử nghiệm đề xuất của bạn, nhưng lý do của bạn có vẻ đúng với tôi. Trong thực tế, nó có vẻ rất giống với những gì GNU Make manual đang gợi ý ở đây (xem bit trên subdirs): http://www.gnu.org/software/make/manual/make.html#Phony-Targets – mrkj