GNU make:来自本身就是目标的文件内容的动态目标

GNU make: dynamic targets from the content of a file which itself is a target

我想做这样的事情:

target_list = target.list
targets = $(shell cat $(target_list)) # assume this yields a list of "*.o"
sources = $(subst .o,.c,$(targets))

all: $(target_list) $(targets)

$(target_list):
    some_command > $@

$(targets): %.o: %.c

然而,make(实际上是 cat)抱怨在尝试定义 $(targets) 时找不到 target.list。有办法解决这个问题吗?

我知道我可以在上面的示例中使用以下内容:

targets = $(shell some_command)

但实际情况比简单的 cat 更复杂,而且 some_command 很昂贵,而且后期还有其他用途,所以我真的很想保存它的输出。

谢谢。

如果 some_command 生成一个 space 分隔的目标文件名列表,这将起作用。 (如果格式是其他格式,我们可以解决它。)

include target.list

all: $(targets)

$(targets): %.o: %.c

target.list:
    some_command | sed 's/^/targets:=/' > $@

当 Make 发现它必须 include target.list,并且存在重建该文件的规则时,它将尝试这样做,然后重新开始。 target.list 的规则将 "targets:=" 添加到列表中,因此可以按原样拉入整个文件。