Macros Makefile规则中的修饰符';s依赖项列表

Macros Makefile规则中的修饰符';s依赖项列表,macros,makefile,Macros,Makefile,问题相当简单。我正在尝试编写一个规则,即给定所需文件的名称将能够定制其依赖项 假设我有两个程序:calc_foo和calc_bar,它们生成一个文件,输出取决于参数。我的目标将有一个名称“target_*.*”;例如,“target_foo_1”将通过运行“./calc_foo 1”生成 问题是,如何编写一个生成文件,为一系列参数生成两个程序的输出?这似乎或多或少满足了您的要求——假设您使用的是GNU Make 生成文件 它可能可以被清理,但我使用以下命令对其进行了测试: calc_bar ca

问题相当简单。我正在尝试编写一个规则,即给定所需文件的名称将能够定制其依赖项

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


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

这似乎或多或少满足了您的要求——假设您使用的是GNU Make

生成文件 它可能可以被清理,但我使用以下命令对其进行了测试:

calc_bar calc_foo 显然,如果需要不同的列表,可以在命令行上指定:

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

如果只有几个程序,则每个程序都有一个规则:

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))))

我不清楚你在追求什么。特别是,如何指定参数的范围?你确定使用shell脚本不会做得更好吗?“foo”目标的数量和“bar”目标的数量之间是否存在相关性?只有少数几个不同的程序。。我想用一组参数来运行它们,这些参数通常被指定为一个列表。这只是实际问题的简化,真的。问题是我在不同的机器上运行这个Makefile,这些机器具有不同数量的内核。每次运行都会花费大量时间,因此我希望使用我能获得的所有内核,而不必运行比内核更多的进程;在我看来,使用make-jp是一个不错的选择。此外,还有许多程序可以在不同的子目录中运行。。Makefile将递归地遍历它们,并保持进程总数不变,因此我宁愿使用Makefile,也不愿重新发明轮子。@Pavel Shved:Pavel!再次见到你真高兴!是的,这太糟糕了。我想我们可以在Make应该做但不应该做的事情列表中添加
target%\u%:\ calc$(*1)$(*2)
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))))