【发布时间】:2019-09-27 12:48:07
【问题描述】:
编辑我扩展了 Makefile。
获取以下makefile:
VERILATOR:=/usr/sbin/verilator
COMMONPREPARAMS:=-Wall
COMMONPOSTPARAMS:=--trace
# Multishot timer
MULTISHOT_TIMER_OBJDIR:=multishot_timer_dir
MULITSHOT_TIMER_VERILOG_FILES:=common/multishot_timer_tb.v common/multishot_timer.v
MULITSHOT_TIMER_TOPLEVEL:=multishot_timer_top.cpp
MULTISHOT_TIMER_TARGET:=$(MULTISHOT_TIMER_OBJDIR)/multishot
#incrementer
INCREMENTER_OBJDIR:=incrementer_dir
INCREMENTER_VERILOG_FILES:=common/incrementer.v
INCREMENTER_TOPLEVEL:=src/incrementer_top.cpp
INCREMENTER_TARGET:=$(INCREMENTER_OBJDIR)/incrementer
ALLTARGETS := $(MULTISHOT_TIMER_TARGET)
ALLOBJDIRS := $(MULTISHOT_TIMER_OBJDIR)
.PHONY: all multishot_timer incrementer
all: multishot_timer incrementer
multishot_timer: OBJDIR:=$(MULTISHOT_TIMER_OBJDIR)
multishot_timer: VERILOG_FILES:=$(MULITSHOT_TIMER_VERILOG_FILES)
multishot_timer: TOPLEVEL:=$(MULITSHOT_TIMER_TOPLEVEL)
multishot_timer: $(MULTISHOT_TIMER_TARGET)
incrementer: OBJDIR:=$(INCREMENTER_OBJDIR)
incrementer: VERILOG_FILES:=$(INCREMENTER_VERILOG_FILES)
incrementer: TOPLEVEL:=$(INCREMENTER_TOPLEVEL)
incrementer: $(INCREMENTER_TARGET)
$(ALLTARGETS): $(TOPLEVEL) $(VERILOG_FILES)
$(VERILATOR) $(COMMONPREPARAMS) -cc $(VERILOG_FILES) --exe $(TOPLEVEL) -o $@
我的实际问题是 $(ALLTARGETS) 的先决条件评估得太早,因此该规则永远不会有任何先决条件。
我想将 ALLTARGETS 规则的先决条件的评估推迟到目标先决条件评估之后,因为那是声明 $(TOPLEVEL) 等变量的地方。此外,我希望能够键入 all 然后启动多个不同的目标,每个目标都有自己的变量,例如 $(TOPLEVEL)。
这样做的一种方法是为 $(ALLTARGETS) 中的每个目标创建一个新规则,但由于每个目标的工作完全相同,我想只使用一个目标。有可能吗?
【问题讨论】: