让我用一个例子来说明它。
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
但这不会在制作多个目标时停止制作。
答案 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模式规则是非终端的。这可能是一次巨大的性能打击。正如手册所说的那样,匹配任何规则"它们非常有用,但制作它们可能需要花费大量时间来考虑它们。"