怎么办“make <subdir> <target>”?</target> </subdir>

时间:2011-07-15 05:41:02

标签: makefile

我想要一个可以调用的makefile:

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

但我不希望它在子目录上调用时尝试解析clean

以下是我的makefile示例:

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

除了调用make <subdir>的{​​{1}}之外,所有调用都运行良好,但之后又尝试分别解析目标make -C <subdir> clean。如何让make停止处理以后的目标?

两个答案: 谢谢你的解释。了解什么是什么,什么不打算做什么是有帮助的。我不会再这样做了。

2 个答案:

答案 0 :(得分:3)

是的,你可以做到这一点,但这将是一个丑陋的黑客,完全违背Make的设计方式。

传递给Make的目标集是一组目标,而不是带语法的结构化命令。 Make预计将构建它们。如果makefile包含目标foo的配方,那么Make应该以某种方式构建目标foo,无论它是作为Make foo还是Make foo bar调用还是{ {1}}。你试图做的事情打破了Make的可接受行为,所以你应该尝试不同的方法。

如果您仍想这样做,可以这样做:

Make bar foo

答案 1 :(得分:2)

我完全同意Beta关于滥用make的声明。实现您想要的另一种方法是引入清除子目录的明确目标。这样,您可以拨打make clean_<subdir>

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

clean:
    @echo cleaning a b and c

$(SUBDIRS):
    make - C $@

$(addprefix clean_, $(SUBDIRS)): clean_%:
    make -C $* clean