参数化 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
)。相反,我需要单独 a
和 b
将它们作为参数传递给 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 ,$*) > $@
我有一个参数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
)。相反,我需要单独 a
和 b
将它们作为参数传递给 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 ,$*) > $@