Makefile 将Make配置为在目标不正确的情况下立即失败

Makefile 将Make配置为在目标不正确的情况下立即失败,makefile,Makefile,我正在使用Make启动verilog编译器的多个版本。我只使用Make来利用-j标志。我的文件看起来像这样 allfpga: fpga0 fpga1 fpga2 fpga3 fpga4 fpga5 fpga6 fpga0: cd fpgas/$(@)/build && $(MAKE) fpga1: cd fpgas/$(@)/build && $(MAKE) fpga2: cd fpgas/$(@)/build && $(

我正在使用Make启动verilog编译器的多个版本。我只使用Make来利用-j标志。我的文件看起来像这样

allfpga: fpga0 fpga1 fpga2 fpga3 fpga4 fpga5 fpga6

fpga0:
    cd fpgas/$(@)/build && $(MAKE)
fpga1:
    cd fpgas/$(@)/build && $(MAKE)
fpga2:
    cd fpgas/$(@)/build && $(MAKE)
fpga3:
    cd fpgas/$(@)/build && $(MAKE)
fpga4:
    cd fpgas/$(@)/build && $(MAKE)
fpga5:
    cd fpgas/$(@)/build && $(MAKE)
fpga6:
    cd fpgas/$(@)/build && $(MAKE)
我调用
make-j2 allfpga
make-j2 fpga0 fpag3 fpga5 fpga6中的一个

但是,如果在第二个make target中出现输入错误(如我给出的命令中),系统将愉快地花费数分钟构建,然后提前停止


我的问题是,如果一些目标不是真实的,我如何让make在一开始就停止

没有什么好办法可以让你“预先筛选”所有要求的目标。Make无法知道目标是否可构建,直到它尝试构建它(例如,它可以使用模式规则或其他东西基于其他目标创建)

但是,您可以这样做:

ALLFPGAS := fpga0 fpga1 fpga2 fpga3 fpga4 fpga5 fpga6

# Get any command line goal which is not one of ALLFPGAS
unknown := $(filter-out $(ALLFPGAS),$(MAKECMDGOALS))

# If there are any, bail!
$(if $(unknown),$(error Unknown FPGA: $(unknown)))

allfpga: $(ALLFPGAS)

$(ALLFPGAS):
        cd fpgas/$@/build && $(MAKE)

.PHONY: allfpga $(ALLFPGAS)

谢谢仅供参考,
filter out
是真正的命令还是留给我构建的命令?这是一个标准的GNU make函数: