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 也找不到任何可做的事情,只是告诉你没有什么可做的。
解决方案是将 graphics
和 all
声明为虚假目标:
.PHONY: all graphics
那么它们将是 运行,即使名为 all
或 graphics
exist/are 的文件或目录比它们的依赖项更新。
虚假目标的目的是使不生成文件的规则即使意外出现在 Makefile 目录中也能正常工作,因此通常用于目标 all
, clean
、install
等等。您的 graphics
目标未生成文件 graphics
,因此属于此类。
另请参阅 GNU make 手册中的 this section(也适用于其他 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'.
为什么都在抱怨无计可施?
你 运行 遇到的问题是因为你在工作目录中有一个目录 graphics
(我从问题评论中得到这个),当 make 遇到目标时
graphics :
作为 all
的先决条件,它看到 graphics
已经存在,none 的先决条件比它更新(因为它没有),并且所以认为它是最新的并且不做任何构建它。由于 all
没有自己的配方,因此 make 也找不到任何可做的事情,只是告诉你没有什么可做的。
解决方案是将 graphics
和 all
声明为虚假目标:
.PHONY: all graphics
那么它们将是 运行,即使名为 all
或 graphics
exist/are 的文件或目录比它们的依赖项更新。
虚假目标的目的是使不生成文件的规则即使意外出现在 Makefile 目录中也能正常工作,因此通常用于目标 all
, clean
、install
等等。您的 graphics
目标未生成文件 graphics
,因此属于此类。
另请参阅 GNU make 手册中的 this section(也适用于其他 make)。