我有一个我正在努力发布的项目实际上包含3个子项目,所有这些都需要一次编译。我的makefile看起来大致如下:
all: a b c
a:
@cd a && make
b:
@cd b && make
c:
@cd c && make
项目A和B都编译得很好但是对于第3个项目,它告诉我虽然切换到C目录并且运行make实际上是编译代码但没有什么可做的。
更具体一点:上例中的Project C实际上是Mozilla的SpiderMonkey。 A和B是我编写的代码/ makefile,而C只是Mozilla网站上SpiderMonkey的原始副本。它的实际编译命令是:
make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
在我的主Makefile中,我有:
spidermonkey:
@cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
运行“make spidermonkey”输出“make:'spidermonkey'没什么可做的。”如何让make运行命令?
编辑: 我已经尝试将以下行添加到我的makefile中:
.PHONY: spidermonkey
除了将spidermonkey规则重命名为sm,但仍然没有变化。
编辑: 我的错!当我应该有一个标签时,我有空格。卫生署!
答案 0 :(得分:4)
您可能在顶层有一个名为“spidermonkey”的文件或目录。认为这是它应该创造的东西,因为它已经存在,所以停止。
编写makefile时要遵循的最重要的规则之一是每个目标应创建一个与目标同名的文件。换句话说,如果你有
a:
<some command>
该命令应生成一个名为“a”的文件。
不生成文件但只作为占位符的规则称为虚假目标,它们应该像这样声明:
.PHONY: a
Make将始终假设必须重新制作。
此外,作为一般规则不要使用“make”来递归调用make,请使用$(MAKE)代替。
编辑:将“伪”改为“假”
答案 1 :(得分:1)
仅检查与规则目标相同的文件(或目录)是否存在,如果存在(并且它比依赖项更新),那么从make的角度来看,没有其他任何事情要做。
所以你的问题是你有一个spidermonkey规则(没有依赖关系)以及一个名为spidermonkey的目录,然后make认为“目标已经完成,我无需做”。要使make能够执行您想要的操作,请重命名spidermonkey规则(或目录)。
顺便说一下递归制作,这不是一个好主意, 见Recursive Make Considered Harmful。