子项目的主 Makefile 不会编译子项目

dav*_*off 3 makefile compilation

我有一个我正在努力发布的项目,它实际上包含 3 个子项目,所有这些都需要一次性编译。我的 makefile 大致如下所示:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make
Run Code Online (Sandbox Code Playgroud)

项目 A 和 B 都编译得很好,但对于第三个项目,它告诉我没有什么可做的,尽管切换到 C 目录并运行 make 实际上确实编译了代码。

更具体一点:上例中的项目 C 实际上是 Mozilla 的 SpiderMonkey。A 和 B 是我编写的代码/makefile,而 C 只是来自 Mozilla 网站的 SpiderMonkey 的原始副本。它的实际编译命令是:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Run Code Online (Sandbox Code Playgroud)

在我的主 Makefile 中,我有:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Run Code Online (Sandbox Code Playgroud)

运行“make spidermonkey”输出“make: Nothing to do to do `spidermonkey'。” 如何让 make 运行命令?

编辑:我尝试将以下几行添加到我的 makefile 中:

.PHONY: spidermonkey
Run Code Online (Sandbox Code Playgroud)

以及将spidermonkey规则重命名为sm,但仍然没有变化。

编辑:我的错!当我应该有一个选项卡时,我有空格。哦!

Jes*_*erE 5

您可能在顶层有一个名为“spidermonkey”的文件或目录。Make 认为这就是它应该创建的内容,并且既然它已经存在,就停止。

编写 makefile 时要遵循的最重要规则之一每个目标都应创建一个与目标同名的文件。换句话说,如果你有

 a:
       <some command>
Run Code Online (Sandbox Code Playgroud)

该命令应该生成一个名为“a”的文件。

不生成文件而仅作为占位符存在的规则称为phony targets,它们应该像这样声明:

 .PHONY: a
Run Code Online (Sandbox Code Playgroud)

Make 将始终假设 a 必须重新制作。

此外,作为一般规则,不要使用“make”来递归调用 make,而是使用 $(MAKE)

编辑:将“伪”更改为“假”