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

时间:2016-06-15 17:48:41

标签: makefile gnu-make

我想做这样的事情:

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)抱怨在尝试定义target.list时找不到$(targets)。有办法解决这个问题吗?

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

targets = $(shell some_command)

但真正的单词情况比简单的cat更复杂,而some_command价格昂贵,而且其他用途也很晚,所以我真的想保存它的输出。

感谢。

1 个答案:

答案 0 :(得分:1)

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

include target.list

all: $(targets)

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

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

当Make看到它必须include target.list,并且有重建该文件的规则时,它会尝试这样做,然后重新开始。并且target.list的规则将“targets:=”添加到列表中,因此整个文件可以按原样提取。