0

我正在尝试调试以下代码:

TESTS=$(shell cat yoursourcefile)
all: $(TESTS)

%: compile_design
compile $@_tb.vhd >> log_file.log
simulate $@

我收到了这个错误:

makefile_tb.vhd >> log_file.log

好像 makefile 是一个目标

当我在 % 之前添加一个或更多字符时,此错误消失:

T%: compile_design
compile $@_tb.vhd >> log_file.log
simulate $@

这可行,但意味着我所有的目标都以“T”开头,但情况并非总是如此。我的问题是: % 这里的功能到底是什么?如何摆脱这个错误?

按照建议,我添加了

makefile: ; $@:

最后,所以我现在有:

TESTS=$(shell cat yoursourcefile) 
all: $(TESTS)

%: compile_design 
compile $@_tb.vhd >> log_file.log
simulate $@

makefile: ; $@: 

然后当我这样做时:

make all

我得到 [all] error2 all_tb.vhd >> log_file.log

但 all_tb.vhd 不存在!

4

1 回答 1

1

%: compile_design规则是“匹配任何内容”模式规则。它说“嘿,如果你想构建任何名称的任何文件,那么你可以通过运行这些命令来完成。哦,顺便说一句,如果你有一个想要构建的文件并且它比compile_design文件更旧,那么你需要重建它”。通常,您希望避免 match-anything 规则,但如果您的目标名称确实没有特定模式,则不能。

当您T在它之前添加它时,它会告诉make,而不是任何文件,该规则只能构建以.开头的文件T

make 尝试重建 makefile 的原因是 GNU make 有一个特殊功能,允许它重新制作自己的 makefile。因此,在它读取它的 makefile 之后,它会尝试重新制作它。通常这没有效果,因为没有规则来构建一个 makefile,但是在这里你已经添加了一个规则,你告诉 make can build any。添加T会使模式不匹配Makefile,因为Makefile它不是以 . 开头的T

您要做的最简单的事情是为 makefile 定义一个显式规则:make 总是选择一个显式规则(如果存在)而不是像模式规则这样的隐式规则:

Makefile: ; @:

这会创建一个不执行任何操作的显式规则(是什么都不:执行的 shell 内置命令)。

于 2013-09-18T12:06:13.700 回答