获取“make:'目标'无法执行任何操作”的错误

时间:2011-07-19 17:27:06

标签: makefile gnu-make

让我用一个例子来说明它。

mkdir test
cd test
touch target
make target

这将导致:make: Nothing to be done for 'target'.

所以 make 告诉我无事可做。这是因为 make 没有找到制作target的规则,但因为target已经存在 make 告诉我没有任何事情可做。

现在,我不希望这样。我希望 make 在找不到target的规则时给我一个错误,即使target已经存在。

我尝试了以下内容:

echo '.DEFAULT:
        echo make: *** No rule to make target `$@'.  Stop.
        false'> Makefile

但这不会在制作多个目标时停止制作

4 个答案:

答案 0 :(得分:7)

问题是,make假定目标名称也是一个由给定命令构建的文件。

但有时这不是真的(例如想到“干净”)。 要告诉make某些目标不构建此文件,您需要使它们“虚假”。将以下行放入Makefile:

.PHONY: target

答案 1 :(得分:2)

如果你想一想,你最终会得到一个鸡蛋和鸡蛋的情况(或无限回归)。假设你设法有一个规则,说'你必须有一个规则来创建 目标 才能合法',那么你就拥有了对于其他文件 X ,“目标 依赖于X ”的规则。那是写的:

target: X
        command to build target from X

但是你会回到起点:你还需要一个规则来创建 X 。你怎么能这样做?你可能有一个不依赖的规则,并在需要时神奇地创建文件 X

X:
        command to build X from nothing

如果没有这样的规则,你就会有无限的回归。

因此,make旨在确保文件存在且是最新的。如果文件存在且没有规则(隐式或显式)来指定它是如何制作的,那么该文件是最新的。你不想做什么。

答案 2 :(得分:0)

obj -m:=smsc911x.o
KDIR=/home/rajasekarm/Desktop/project/dvsdk/psp/linux-2.6.37-psp04.02.00.07.sdk

目标:

make -C  ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- $(KDIR) M=$(PWD) moduiles
clean :
make -C $(KDIR) ARCH=arm CROSS_COMPILE=/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin- M=$(PWD) clean

〜输入make后,它没有为目标

做任何事情
here -->/home/rajasekarm/Desktop/project/dvsdk/linux-devkit/bin is my cross compiler path

答案 3 :(得分:0)

实际上这听起来像是一个完全合理的(如果被误导;-))请求。您必须使用带有空配方的规则明确列出每个源文件。

你走了:

Makefile: ;

.PHONY: dodgy
dodgy%: dodgy; $(error You must provide a rule for $*)
%: dodgy% ;

布丁的证明:

$ rm aa
$ make aa
Makefile:4: *** You must provide a rule for aa.  Stop.
$ touch aa
$ make aa
Makefile:4: *** You must provide a rule for aa.  Stop.

请注意,行Makefile: ;是必需的。毕竟, make 尝试做的第一件事就是重建Makefile。

另请注意,catch-all模式规则是非终端的。这可能是一次巨大的性能打击。正如手册所说的那样,匹配任何规则"它们非常有用,但制作它们可能需要花费大量时间来考虑它们。"