我正在尝试让GNU make从单个输入生成多个输出。我能证明的最简单的例子是:
a b : test
cp $< $@
我相信,应该将文件test
复制到文件名a
和b
。但是,它只会使文件a
,在我看来与此处列出的说明相反:
http://www.gnu.org/software/automake/manual/make/Multiple-Targets.html
我做错了吗?
谢谢, 汤姆
答案 0 :(得分:9)
如果您运行的规则取决于a
,则会将$<
test
和$@
作为a
运行您的规则。如果您运行的规则取决于b
,$@
将改为b
。如果您制定的规则高于当前规则,例如:
all: a b
它将运行a
和b
的规则,这是两次相同的规则。否则,如果您的规则是文件中的第一个,则它将仅使用第一个目标运行它,即a
答案 1 :(得分:0)
对@MichaelMrozek的回答做了一个小小的澄清。
此:
a b : test
cp $< $@
完全相同:
a : test
cp $< $@
b : test
cp $< $@
a 是文件中的第一个目标,因此它是默认目标。只有 a 的规则才会运行,因为它不依赖于 b 。
像@MichaelMrozek所说,你可以添加另一条规则,或者你可以运行
make a b
答案 2 :(得分:0)
一切都好。手册说:
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
相当于
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
所以你的Makefile也等同于
a : test
cp $< $@
b : test
cp $< $@
当你输入命令'make'时,程序默认构建第一个目标,即'a'。