我想要一个可以调用的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停止处理以后的目标?
两个答案: 谢谢你的解释。了解什么是什么,什么不打算做什么是有帮助的。我不会再这样做了。
答案 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