make:没有什么可以为'all'做的。在目标上只调用另一个Makefile

时间:2015-01-26 05:26:35

标签: makefile gnu-make

说我有以下gnu makefile。

TOP := $(dir $(lastword $(MAKEFILE_LIST)))

all : graphics

graphics :
  pushd $(TOP)../graphics; \
  $(TOP)../tools/autotools_gen.sh; \
  ./configure; \
  $(MAKE) clean all; \
  $(TOP)../tools/autotools_clr.sh; \
  popd;

在一个名为build的文件夹中,我从一个目录中调用它,方式如下:

make --file ./build/Makefile all

我从make获得以下消息:

make: Nothing to be done for `all'.

为什么抱怨没有什么可以为所有人做的?

1 个答案:

答案 0 :(得分:1)

你遇到的问题是因为你在工作目录中有一个目录graphics(我从问题评论中得到了这个),当make遇到目标时

graphics :

作为all的先决条件,它看到graphics已经存在,没有任何先决条件比它更新(因为它没有任何),所以考虑到它到目前为止并没有任何建设它。由于all没有自己的食谱,因此无法找到任何可以做的事情,只是告诉你没有任何事可做。

解决方案是将graphicsall声明为虚假目标:

.PHONY: all graphics

然后即使名为allgraphics的文件或目录比其依赖项更新,它们也会运行。

虚假目标的目的是制定不能正常生成文件的规则,即使这样的文件意外出现在Makefile的目录中,因此它通常用于目标allcleaninstall等等。您的graphics目标不会生成文件graphics,因此属于此类别。

参见GNU make手册中的this section(也适用于其他品牌)。