如何从文件中读取目标名称,向它们附加一些字符串,并从中创建make规则?

时间:2017-12-06 13:46:07

标签: bash shell makefile gnu-make

我希望有文件,当我可以列出名称(行中的一个)时,这样当调用make时,会立即从这些名称生成规则并附加一些字符串。

示例:

文件内容:

target1
target2
target3

要连接的字符串:my_task _

由此我希望有3条规则:

my_task_target1:
    <some things to do>

my_task_target2:
    <some things to do>

my_task_target3:
    <some things to do>

我知道,当我拥有包含所有这些目标名称的数组时,我可以像this回答一样执行此操作,但我需要从文件中读取数据。

我希望它是这样的,因为我将拥有许多目标,并且每个目标都有不同的任务列表。每个任务都有自己的文件和目标列表。最后,我还将创建在目标之后使用名称但没有前缀的规则,并且此规则将包含分配给某个目标的所有任务,以便我可以调用单独的任务,以及使用一个make调用目标所需的所有任务命令。

我怎样才能做到这一点?或者也许有更好的方法来做我想做的事情?

1 个答案:

答案 0 :(得分:3)

以下Makefile动态创建从文件list读取的目标:

# the file with the targets
targets-file := list

# the string to concatenate
prefix := my_tasks_

# read the targets from the file indicated by the variable targets-file 
targets != cat "$(targets-file)"

# concatenate the string to each target
targets := $(addprefix $(prefix),$(targets))

.PHONY: all
all: $(targets)

# function for creating a target
define create_target
$(eval $1:; @echo "some things to do for $$@")
endef

# create the targets
$(foreach target,$(targets),$(call create_target,$(target)))

考虑到文件list的内容是:

target1
target2
target3

通过上面的Makefile运行make

$ make
some things to do for my_tasks_target1
some things to do for my_tasks_target2
some things to do for my_tasks_target3