Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
makefile一个编译调用,用于排除标题的多个源_Makefile - Fatal编程技术网

makefile一个编译调用,用于排除标题的多个源

makefile一个编译调用,用于排除标题的多个源,makefile,Makefile,对于verilog编译,一次编译多个verilog文件是有利的,它们被编译到一个数据库no.o文件中。我发现我可以创建如下规则: SOURCES := src1.v src2.v src3.v verilog.timestamp: $(SOURCES) hdr.vh xmvlog $(if $(filter-out $(SOURCES),$(?)),$(SOURCES),$(filter $(?),$(SOURCES))) 这只允许重新编译过时的文件,或者在标头过期时重新编译所有文件。

对于verilog编译,一次编译多个verilog文件是有利的,它们被编译到一个数据库no.o文件中。我发现我可以创建如下规则:

SOURCES := src1.v src2.v src3.v
verilog.timestamp: $(SOURCES) hdr.vh
    xmvlog $(if $(filter-out $(SOURCES),$(?)),$(SOURCES),$(filter $(?),$(SOURCES)))

这只允许重新编译过时的文件,或者在标头过期时重新编译所有文件。感觉很难看-有没有更好的方法来完成这项任务?

我不知道这是否更好,但是。。。修改标题后,您可以触摸源:

SOURCES := src1.v src2.v src3.v

verilog.timestamp: $(SOURCES) | hdr.vh
    xmvlog $?

$(SOURCES): hdr.vh
    @touch $@
请注意。

正如Beta所建议的那样,$?在这种情况下,自动变量非常方便,因为它会展开为除仅订购的先决条件之外的所有比目标系统更新的先决条件的列表。但我们仍然需要解决您的另一个问题:您的Verilog编译器不会为每个编译的Verilog源生成一个二进制文件。此外,如果自上次编译foo.v以来修改了foo.v或hdr.vh头文件,则需要重新编译Verilog源文件foo.v。有一种纯粹的生成方式,即使用空文件作为标记,每个Verilog源文件加上一个用于整个项目:

SOURCES := $(wildcard *.v)
TAGS    := $(patsubst %.v,.%.tag,$(SOURCES))

all: verilog.timestamp

.PHONY: all

$(TAGS): .%.tag: %.v hdr.vh
    touch $@

verilog.timestamp: $(TAGS)
    xmvlog $(patsubst .%.tag,%.v,$?)
    touch $@

clean::
    rm -f $(TAGS) verilog.timestamp
解释:为了构建所有默认和虚假目标,make将尝试构建verilog.timestamp。因此,它将查看$TAGS是否过期,即是否比相应的Verilog源文件或hdr.vh头文件旧。如果没有,它将停止。否则,它将:

构建过时的标记文件,只有它们,可能是并行的。只需触摸它们,这个Makefile是并行安全的。 构建verilog.timestamp。扩展配方时,在将其传递给shell之前,make将替换$patsubst.%.tag、%.v、$?由与刚刚重建的标记文件相对应的所有Verilog源文件创建,因此比Verilog.timestamp更新。最后,它将触及verilog.timestamp。 演示:

$ make clean
rm -f .src3.tag .src2.tag .src1.tag verilog.timestamp

$ make -j8
touch .src3.tag
touch .src2.tag
touch .src1.tag
xmvlog src3.v src2.v src1.v
touch verilog.timestamp

$ make -j8
make: Nothing to be done for 'all'.

$ touch src1.tag

$ make -j8
touch .src1.tag
xmvlog src1.v
touch verilog.timestamp

$ touch hdr.vh

$ make -j8
touch .src3.tag
touch .src2.tag
touch .src1.tag
xmvlog src3.v src2.v src1.v
touch verilog.timestamp
注:

$TAGS:..%。tag:%.v hdr.vh是一个 当然,如果您喜欢将标记文件与源树分离,可以将它们存储在专用子目录中:

SOURCES := $(wildcard *.v)
TAGSDIR := .tags
TAGS    := $(patsubst %.v,$(TAGSDIR)/.%.tag,$(SOURCES))

all: $(TAGSDIR)/verilog.timestamp

.PHONY: all

$(TAGS): $(TAGSDIR)/.%.tag: %.v hdr.vh | $(TAGSDIR)
    touch $@

$(TAGSDIR)/verilog.timestamp: $(TAGS) | $(TAGSDIR)
    xmvlog $(patsubst $(TAGSDIR)/.%.tag,%.v,$?)
    touch $@

$(TAGSDIR):
    mkdir -p $@

clean::
    rm -rf $(TAGSDIR)
在上一个版本中,|$TAGSDIR是一个