GNU为多个目标制定规则

时间:2010-05-20 17:08:54

标签: makefile

我正在尝试让GNU make从单个输入生成多个输出。我能证明的最简单的例子是:

a b : test
    cp $< $@
我相信,

应该将文件test复制到文件名ab。但是,它只会使文件a,在我看来与此处列出的说明相反:

http://www.gnu.org/software/automake/manual/make/Multiple-Targets.html

我做错了吗?

谢谢, 汤姆

3 个答案:

答案 0 :(得分:9)

如果您运行的规则取决于a,则会将$< test$@作为a运行您的规则。如果您运行的规则取决于b$@将改为b。如果您制定的规则高于当前规则,例如:

all: a b

它将运行ab的规则,这是两次相同的规则。否则,如果您的规则是文件中的第一个,则它将仅使用第一个目标运行它,即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'。