问题很简单。我试图写一个规则,给定所需文件的名称将能够定制其依赖项。
假设我有两个程序:calc_foo和calc_bar,它们生成一个输出依赖于参数的文件。我的目标名称为'target _ * _ *';例如,'target_foo_1'将通过运行'./calc_foo 1'生成。
问题是,如何编写一个makefile来为一系列参数生成两个程序的输出?
答案 0 :(得分:2)
如果只有几个程序,您可以为每个程序制定一个规则:
target_foo_%:
./calc_foo $*
如果要运行带有参数列表的程序:
foo_parameter_list = 1 2 green Thursday 23 bismuth
foo_targets = $(addprefix target_foo_,$(foo_parameter_list))
all: $(foo_targets)
如果你想为每个程序设置一组不同的参数,但有一些共同点,你可以将常见的参数分开:
common_parameter_list = 1 2 green Thursday
foo_parameter_list = $(common_parameters) 23 bismuth
bar_parameter_list = $(common_parameters) 46 111
如果事实证明你有比你想象的更多的程序,但仍想使用这种方法,你只想自动化它:
# add programs here
PROGRAMS = foo bar baz
# You still have to tailor the parameter lists by hand
foo_parameter_list = 1 2 green Thursday 23 bismuth
# everything from here on can be left alone
define PROGRAM_template
$(1)_targets = $(addprefix target_$(1)_,$($(1)_parameter_list))
target_$(1)_%:
./calc_$(1) $$*
all: $(1)_targets
endef
$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))
答案 1 :(得分:0)
这似乎或多或少地要求你做什么 - 假设你正在使用GNU Make。
BAR_out = target_bar_
BAR_list = 1 2 3 4 5 6 7 8 9
BAR_targets = $(addprefix ${BAR_out},${BAR_list})
FOO_out = target_foo_
FOO_list = 11 12 13 14 15 16 17 18 19
FOO_targets = $(addprefix ${FOO_out},${FOO_list})
all: ${BAR_targets} ${FOO_targets}
${BAR_targets}:
calc_bar $(subst ${BAR_out},,$@)
${FOO_targets}:
calc_foo $(subst ${FOO_out},,$@)
它可以被清理,但我用命令测试了它:
echo "BAR $@" | tee target_bar_$@
sleep $@
echo "FOO $@" | tee target_foo_$@
sleep $@
显然,如果您想要一个不同的列表,可以在命令行中指定:
make -j4 FOO_LIST="1 2 3 4 5 6 33"