Makefile规则的依赖项列表中的修饰符

时间:2010-05-08 02:43:29

标签: macros makefile

问题很简单。我试图写一个规则,给定所需文件的名称将能够定制其依赖项。

假设我有两个程序:calc_foo和calc_bar,它们生成一个输出依赖于参数的文件。我的目标名称为'target _ * _ *';例如,'target_foo_1'将通过运行'./calc_foo 1'生成。

问题是,如何编写一个makefile来为一系列参数生成两个程序的输出?

2 个答案:

答案 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},,$@)

它可以被清理,但我用命令测试了它:

calc_bar

echo "BAR $@" | tee target_bar_$@
sleep $@

calc_foo

echo "FOO $@" | tee target_foo_$@
sleep $@

显然,如果您想要一个不同的列表,可以在命令行中指定:

make -j4 FOO_LIST="1 2 3 4 5 6 33"