也有上市的子目錄用gmake命令的方式只有命令,而無需使用任何shell命令:
test:
@echo $(filter %/, $(wildcard lib/*/))
這將列出所有子目錄尾隨'/'
。要刪除它,你可以使用替代模式:
subdirs = $(filter %/, $(wildcard lib/*/))
test:
@echo $(subdirs:%/=%)
然後到實際創建你可以使用一個小竅門每個子目錄執行的makefile規則 - 假目標在一個不存在的目錄。我認爲,在這種情況下的例子告訴比任何解釋更多:
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
基本上,目標'all'
列出了所有的子目錄作爲先決條件。例如,如果LIB_DIRS
包含lib/folder1 lib/folder2
,則擴張應該是這樣的:
all: make-rule/lib/folder1 make-rule/lib/folder2
然後「製作」,爲了執行規則'all'
,嘗試將每個前提與現有的目標相匹配。在這種情況下,目標是'make-rule/%:'
,它使用'$*'
在'make-rule/'
之後提取字符串,並將其用作配方中的參數。例如,第一個先決條件將被匹配,這樣的擴展:
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)
哇,謝謝。奇蹟般有效! – Zed 2009-12-19 15:04:47
爲什麼你沒有定義'$(clean_LIBS)'爲虛假?例如。 '.PHONY:$(LIBS)$(clean_LIBS)',那麼我認爲你不需要'force'。 – 2010-06-22 15:51:01
@dma_k:你說得很好。我沒有測試過你的建議,但你的推理聽起來對我來說很合適。實際上,這聽起來很像GNU Make手冊在這裏所建議的內容(請參閱關於subdirs的內容):http://www.gnu.org/software/make/manual/make.html#Phony-Targets – mrkj 2010-06-24 15:04:34