使用makefile、目标和%

使用makefile、目标和%,makefile,target,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 $@_

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

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]错误2 all\u tb.vhd>>log\u file.log


但是所有的_tb.vhd都不存在

编译设计规则是。它说:“嘿,make,如果你想用任何名称构建任何文件,那么你可以通过运行这些命令来实现。哦,顺便说一句,如果你有一个要构建的文件,并且它比
compile\u design
文件旧,那么你需要重新构建它。”。通常,您希望避免匹配任何规则,但如果您的目标名称确实没有特定的模式,您就不能

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

make试图重建makefile的原因是GNUMake有一个特殊的特性。因此,在读取makefile之后,它将尝试重新生成它。通常这没有效果,因为没有构建makefile的规则,但是在这里您添加了一个规则,告诉make可以构建任何东西。添加
T
可以防止模式匹配
Makefile
,因为
Makefile
不是以
T
开头的

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

Makefile: ; @:

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

现在我有了:
makefile:;$@:TESTS=$(shell cat yoursourcefile)all:$(TESTS)%:compile_design compile$@_tb.vhd>>log_file.log simulate$@
我得到:
all_tb.vhd>>log_file.log
但all_tb.vhd不存在它是否重新生成目标all?我无法读取注释中的makefile,因为所有新行都丢失了。但是,默认情况下(除非您在命令行中另有指定),生成只作为makefile中的第一个目标(当然还有它的所有先决条件)。如果您将
makefile
的规则添加为第一个规则,那么除非您运行
makeall
,否则make将只生成该规则。将makefile规则放在makefile的末尾,而不是开头。