2011-07-15 48 views
4

我想一個makefile,我可以打電話:如何做「make <subdir><target>」?

'make'/'make <subdir>'/'make clean'/'make <subdir> clean' 

但我不希望它試圖在一個子目錄調用時解決clean

這裏是我的makefile的例子:除了make <subdir>乾淨這就要求make -C <subdir> clean,但隨後試圖解決還分別針對clean

SUBDIRS := a b c 
all : 
    @echo building a b and c 
clean : 
    @echo cleaning a b and c 
$(SUBDIRS) : 
    make - C [email protected] $(MAKECMDGOALS) 

所有呼叫工作。我該如何才能停止處理以後的目標?

對兩個答案: 感謝您的解釋。瞭解什麼是和什麼是沒有意義的是很有幫助的。我不會再試這個了。

回答

2

嘆息

是的,你可以做到這一點,但是這將是一個醜陋的黑客攻擊,並完全相反,使設計的工作方式。

您傳遞給Make的目標集合是一組目標,而不是具有語法的結構化命令。預計製造所有。如果makefile包含目標foo的配方,則Make應該以某種方式構建目標foo,而不管它是作爲Make foo還是Make foo barMake bar foo調用。你試圖做的事違反了Make的公認行爲,所以你應該嘗試一種不同的方法。

如果你還是想做到這一點,你可以做這樣的:

SUBDIRS := a b c 

.PHONY: clean 
ifneq ($(filter $(SUBDIRS), $(MAKECMDGOALS)),) 
$(SUBDIRS) : 
     @echo make - C [email protected] $(MAKECMDGOALS) 

clean: 
     @: # do nothing 
else 
all : 
     @echo default 

clean : 
     @echo cleaning 
endif 
1

我完全貝塔對濫用發言同意。實現你想要的另一種方法是引入明確的目標來清理子目錄。例如,您可以通過這種方式致電make clean_<subdir>

 
SUBDIRS := a b c 
all: 
    @echo building a b and c 

clean: 
    @echo cleaning a b and c 

$(SUBDIRS): 
    make - C [email protected] 

$(addprefix clean_, $(SUBDIRS)): clean_%: 
    make -C $* clean 
相關問題