我正在尝试调试以下代码:
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不存在!
答案 0 :(得分:1)
%: compile_design
规则是"match-anything" pattern rule。它说“嘿make,如果你想用任何名字构建任何文件,那么你可以通过运行这些命令来实现。哦,顺便说一句,如果你有一个文件,你想要构建它比compile_design
文件旧,然后你需要重建它“。通常,您希望避免匹配任何规则,但如果您的目标名称确实没有特定模式,则不能。
当您在它之前添加T
时,它会告诉make而不是任何文件,该规则只能构建以T
开头的文件。
make的原因是尝试重建makefile是因为GNU make具有allows it to remake its own makefiles的特殊功能。因此,在读取其makefile之后,它将尝试重新制作它。通常这没有效果,因为没有规则来构建makefile,但是在这里你已经添加了一条规则,你已经告诉make可以构建任何东西。添加T
可使模式与Makefile
匹配,因为Makefile
不以T
开头。
您最简单的事情是为makefile定义一个显式规则:make总是选择一个显式规则(如果存在),而不是像模式规则这样的隐式规则:
Makefile: ; @:
这会创建一个不执行任何操作的显式规则(:
是不执行任何操作的shell内置命令。)