为什么用-f选项调用makefile会破坏调用sub-make的规则?

时间:2017-10-02 16:48:34

标签: makefile gnu-make

考虑以下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

2 个答案:

答案 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。