我想做这样的事情:
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
价格昂贵,而且其他用途也很晚,所以我真的想保存它的输出。
感谢。
答案 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:=”添加到列表中,因此整个文件可以按原样提取。