我有一个makefile,它执行构建过程的几个步骤,但是即使在某些步骤中发生错误,它仍然继续构建。这是预期的行为吗?还是我做错了什么?
all:
cd projects/project1/; $(MAKE); cd ../..
cd projects/project2/; $(MAKE); cd ../..
cd projects/project3/; $(MAKE); cd ../..
答案 0 :(得分:2)
我认为配方行的返回代码源自该配方行中最后执行的命令-在您的情况下,这是cd ../..
,即使紧前面的递归Makefile可能已失败,它也不会失败。因此,对于主makefile,此行返回ok,并且不会停止。好消息:因为每条配方行都在外壳中执行(sh
!除非您明确地告诉make,否则bash
除外),这意味着终端cd ../..
完全可以在执行它的外壳中使用此后立即关闭。删除它,您的makefile应该会表现出所需的效果。
顺便说一句,您应该编写cd subdir && $(MAKE)
或$(MAKE) -C subdir
,以便也可以捕获不存在的目录。
您可能会考虑使用非递归方式来编写makefile。 Google提出“将递归视为有害”,并决定所描述的问题是否引起人们的注意……