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:=" 添加到列表中,因此可以按原样拉入整个文件。
我想做这样的事情:
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:=" 添加到列表中,因此可以按原样拉入整个文件。