如何扩展此 Makefile 以使用通配符?

How do I expend this Makefile to use wildcards?

我想将 this tutorial 中的以下 Makefile 用于更通用的目标。例如,如果我键入 make foo,那么我希望从 foo.vfoo.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.vfoo.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)