make: 没有什么可以为“所有人”做的。在只调用另一个 Makefile 的目标上

make: Nothing to be done for `all'. on Target That Just Calls Another Makefile

假设我有以下 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'.

为什么都在抱怨无计可施?

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

graphics :

作为 all 的先决条件,它看到 graphics 已经存在,none 的先决条件比它更新(因为它没有),并且所以认为它是最新的并且不做任何构建它。由于 all 没有自己的配方,因此 make 也找不到任何可做的事情,只是告诉你没有什么可做的。

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

.PHONY: all graphics

那么它们将是 运行,即使名为 allgraphics exist/are 的文件或目录比它们的依赖项更新。

虚假目标的目的是使不生成文件的规则即使意外出现在 Makefile 目录中也能正常工作,因此通常用于目标 allcleaninstall 等等。您的 graphics 目标未生成文件 graphics,因此属于此类。

另请参阅 GNU make 手册中的 this section(也适用于其他 make)。