如何扩展此 Makefile 以使用通配符?
How do I expend this Makefile to use wildcards?
我想将 this tutorial 中的以下 Makefile 用于更通用的目标。例如,如果我键入 make foo
,那么我希望从 foo.v
和 foo.cpp
构建一个可执行文件 foo
,其过程类似于制作 maskbus
.
.PHONY: all
all: maskbus
obj_dir/Vmaskbus.cpp: maskbus.v
verilator -Wall -cc maskbus.v
obj_dir/Vmaskbus__ALL.a: obj_dir/Vmaskbus.cpp
make -C obj_dir -f Vmaskbus.mk
maskbus: maskbus.cpp obj_dir/Vmaskbus__ALL.a
g++ -I/usr/share/verilator/include -I obj_dir \
/usr/share/verilator/include/verilated.cpp \
maskbus.cpp obj_dir/Vmaskbus__ALL.a \
-o maskbus
.PHONY: clean
clean:
rm -rf obj_dir/ maskbus
这是我试过的方法
.PHONY: all
stuff: $(basename $(wildcard *.v))
all: stuff
obj_dir/%.cpp: %.v
verilator -Wall -cc $<
obj_dir/V%__ALL.a: obj_dir/V%.cpp
make -C obj_dir -f Vmaskbus.mk
stuff: $@.cpp obj_dir/V$@__ALL.a
g++ -I/usr/share/verilator/include -I obj_dir \
/usr/share/verilator/include/verilated.cpp \
$@.cpp obj_dir/V$@__ALL.a \
-o $@
.PHONY: clean
clean:
rm -rf obj_dir/ $(stuff)
请注意,我在第二条规则中未更改名称 Vmaskbus
,因为我不知道如何从包含 %
的规则中提取正确的 "basename"。但是,当我 运行 make foo
时,甚至没有执行该规则,因此后续命令由于缺少 obj_dir/Vfoo__ALL.a
而失败。一些调查表明变量 stuff
是空的,但我确定我在当前目录中同时拥有 foo.v
和 foo.cpp
。
我自己想出来了:
.PHONY: all clean
stuff := $(basename $(wildcard *.v))
all: $(stuff)
obj_dir/V%.cpp: %.v
verilator -Wall -cc $<
obj_dir/V%__ALL.a: obj_dir/V%.cpp
make -C obj_dir -f V$*.mk
$(stuff): %: %.cpp obj_dir/V%__ALL.a
g++ -I /opt/local/share/verilator/include \
-I obj_dir \
-o $@ \
/opt/local/share/verilator/include/verilated.cpp \
obj_dir/V$*__ALL.a \
$*.cpp
clean:
rm -rf obj_dir/ $(stuff)
我想将 this tutorial 中的以下 Makefile 用于更通用的目标。例如,如果我键入 make foo
,那么我希望从 foo.v
和 foo.cpp
构建一个可执行文件 foo
,其过程类似于制作 maskbus
.
.PHONY: all
all: maskbus
obj_dir/Vmaskbus.cpp: maskbus.v
verilator -Wall -cc maskbus.v
obj_dir/Vmaskbus__ALL.a: obj_dir/Vmaskbus.cpp
make -C obj_dir -f Vmaskbus.mk
maskbus: maskbus.cpp obj_dir/Vmaskbus__ALL.a
g++ -I/usr/share/verilator/include -I obj_dir \
/usr/share/verilator/include/verilated.cpp \
maskbus.cpp obj_dir/Vmaskbus__ALL.a \
-o maskbus
.PHONY: clean
clean:
rm -rf obj_dir/ maskbus
这是我试过的方法
.PHONY: all
stuff: $(basename $(wildcard *.v))
all: stuff
obj_dir/%.cpp: %.v
verilator -Wall -cc $<
obj_dir/V%__ALL.a: obj_dir/V%.cpp
make -C obj_dir -f Vmaskbus.mk
stuff: $@.cpp obj_dir/V$@__ALL.a
g++ -I/usr/share/verilator/include -I obj_dir \
/usr/share/verilator/include/verilated.cpp \
$@.cpp obj_dir/V$@__ALL.a \
-o $@
.PHONY: clean
clean:
rm -rf obj_dir/ $(stuff)
请注意,我在第二条规则中未更改名称 Vmaskbus
,因为我不知道如何从包含 %
的规则中提取正确的 "basename"。但是,当我 运行 make foo
时,甚至没有执行该规则,因此后续命令由于缺少 obj_dir/Vfoo__ALL.a
而失败。一些调查表明变量 stuff
是空的,但我确定我在当前目录中同时拥有 foo.v
和 foo.cpp
。
我自己想出来了:
.PHONY: all clean
stuff := $(basename $(wildcard *.v))
all: $(stuff)
obj_dir/V%.cpp: %.v
verilator -Wall -cc $<
obj_dir/V%__ALL.a: obj_dir/V%.cpp
make -C obj_dir -f V$*.mk
$(stuff): %: %.cpp obj_dir/V%__ALL.a
g++ -I /opt/local/share/verilator/include \
-I obj_dir \
-o $@ \
/opt/local/share/verilator/include/verilated.cpp \
obj_dir/V$*__ALL.a \
$*.cpp
clean:
rm -rf obj_dir/ $(stuff)