使用makefile,目标和%时出错

时间:2013-09-18 08:09:36

标签: makefile target

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

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不存在!

1 个答案:

答案 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内置命令。)