使用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的末尾,而不是开头。