参数化 Makefile 目标

Parametrize Makefile Targets

我有一个参数space,比如说A={1,2},B={u,v},我需要为[=中的每一对(a,b)创建一个文件12=]。 我需要生成的是一组 Makefile 目标,例如:

file_1_u.csv:
    ./run_program --A 1 --B u > file_1_u.csv
file_1_v.csv:
    ./my_program --A 1 --B v > file_1_u.csv
file_2_u.csv:
    ./run_program --A 2 --B u > file_1_u.csv
file_2_v.csv:
    ./my_program --A 2 --B v > file_1_u.csv

是否可以生成目标并且在每个生成的目标中使用相关参数?

PS.: 我知道可以使用变量创建目标,但是 $@ 只给出完整的目标名称(例如 file_1_u.csv)。相反,我需要单独 ab 将它们作为参数传递给 my_program.

看来您需要这样的东西:

define foo
test_$(1)_$(2) :
  ./my_program --A $(1) --B $(2) > file_$(1)_$(2).csv
endef

a=1 2
b=u v
$(foreach a_,$(a),$(foreach b_,$(b),$(eval $(call foo,$(a_),$(b_)))))

一般来说,在 makefile 中处理模式中的 1 个以上元素需要 eval、$$、includes 和其他非直接处理。

但是,在您的特定示例中,有一个明显的替换可以像这样使用:

A:=1 2
B:=u v
l:=$(foreach a, $(A), $(foreach b, $(B), $(a)_$(b)))

all: $(l:%=file_%.csv)

file_%.csv:
        ./run_program --A $(subst _, --B ,$*) > $@