说我有以下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'.
为什么抱怨没有什么可以为所有人做的?
答案 0 :(得分:1)
你遇到的问题是因为你在工作目录中有一个目录graphics
(我从问题评论中得到了这个),当make遇到目标时
graphics :
作为all
的先决条件,它看到graphics
已经存在,没有任何先决条件比它更新(因为它没有任何),所以考虑到它到目前为止并没有任何建设它。由于all
没有自己的食谱,因此无法找到任何可以做的事情,只是告诉你没有任何事可做。
解决方案是将graphics
和all
声明为虚假目标:
.PHONY: all graphics
然后即使名为all
或graphics
的文件或目录比其依赖项更新,它们也会运行。
虚假目标的目的是制定不能正常生成文件的规则,即使这样的文件意外出现在Makefile的目录中,因此它通常用于目标all
, clean
,install
等等。您的graphics
目标不会生成文件graphics
,因此属于此类别。
参见GNU make手册中的this section(也适用于其他品牌)。