如何执行 "make <subdir> <target>"?

4

I would like a makefile where I can call:

'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 -C <subdir> cleanmake <subdir> clean外,所有调用都正常工作,但随后尝试分别解析目标clean。如何让make停止处理后续目标?
对于两个答案: 谢谢您的解释。了解应该做什么和不应该做什么非常有帮助。我不会再尝试这样做了。
2个回答

3

叹气

是的,你可以这样做,但这将是一种丑陋的hack,完全违反Make设计的方式。

你传递给Make的目标集合是一组目标,而不是结构化的具有语法的命令。Make预期建立它们所有。如果makefile包括一个针对目标foo的recipe,那么Make应该按照某种方式构建目标foo,而不管它是否被作为Make fooMake foo barMake bar foo调用。你试图做的打破了Make的接受行为,因此你应该尝试不同的方法。

如果你还想这么做,你可以像这样做:

SUBDIRS := a b c

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

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

clean :
        @echo cleaning
endif

2

我完全同意Beta对于滥用make的观点。另一种实现你想要的方式,是为清理子目录引入显式目标。这样,例如,你可以调用make clean_<subdir>

SUBDIRS := a b c
all:
    @echo 正在构建a、b和c
clean: @echo 正在清理a、b和c $(SUBDIRS): make -C $@ $(addprefix clean_, $(SUBDIRS)): clean_%: make -C $* clean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接