考虑以下Makefile
prereqrule:
@echo "Executing prereqrule"
submakerule:
@echo "Executing submakerule"
check: prereqrule
+@$(MAKE) submakerule
我从另一个目录运行检查规则。第一种方法是第二种方法不起作用。
$ make -C MakefileQuestion check
Executing prereqrule
Executing submakerule
使用-f
$ make -f MakefileQuestion/Makefile check
Executing prereqrule
make[1]: *** No rule to make target `submakerule'. Stop.
make: *** [check] Error 2
-f
版本在生成的子制作调用中找不到子制片的原因是什么?
我知道一种方法“修复”这个。使用$THIS_FILE
参数。
THIS_FILE := $(lastword $(MAKEFILE_LIST))
workingcheck: prereqrule
+@$(MAKE) -f $(THIS_FILE) submakerule
适用于两种方法
$ make -C MakefileQuestion workingcheck
Executing prereqrule
Executing submakerule
$ make -f MakefileQuestion/Makefile workingcheck
Executing prereqrule
Executing submakerule
我最感兴趣为什么 -f
方法不起作用。 make
针对两个用例(-C
和-f
)的实现有何不同,以便第二个需要传递给子制作的-f $THIS_FILE
?
答案 0 :(得分:0)
MAKE
变量的值是调用make的文件名。它不包含任何其他参数,例如-f
或-t
。如果确实如此,你将无法运行任何其他的递归make命令,除了你在第一个地方运行,这没有任何意义。
-C
有效,因为它会告诉shell首先更改目录。这使得可以在不明确提供目录的情况下运行后续make
。
答案 1 :(得分:0)
我想我明白现在发生了什么。我对make有一个更基本的困惑。
以下规则
check: prereqrule
+@$(MAKE) submakerule
导致
/Applications/Xcode.app/Contents/Developer/usr/bin/make submakerule
从pwd
执行。
由于运行目录不包含任何Makefile,因此打印出该错误。
与此相似。
~/DirWithoutMakefile$ make check
make: *** No rule to make target `check'. Stop.
传递-f $(THIS_FILE)
使用正确的makefile而不是pwd
中找不到任何makefile。