GNU make规则实现多目标

4
我正在尝试让GNU make从单个输入中产生多个输出。我可以演示的最简单的例子是:
a b : test
    cp $< $@

我认为应该将文件test复制到文件名ab,但实际只创建了文件a,这与此处列出的指令相矛盾:http://www.gnu.org/software/automake/manual/make/Multiple-Targets.html。我错在哪里了吗?
谢谢, Tom
3个回答

9
如果您运行一个依赖于a的规则,它将使用$<作为test$@作为a来运行您的规则。如果您运行一个依赖于b的规则,则$@将代替b 。如果您在当前规则之上添加规则,则会像下面这样:
all: a b

它将运行 ab 的规则,即相同的规则两次。否则,如果您的规则是文件中的第一个规则,则仅使用第一个目标 a 运行它。


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”。

0

对@MichaelMrozek答案的一个小澄清。

这个:

a b : test
    cp $< $@

与以下完全相同:

a : test
    cp $< $@
b : test
    cp $< $@

a是文件中的第一个目标,因此它是默认目标。只有a的规则会运行,因为没有依赖于b

就像@MichaelMrozek所说,您可以添加另一条规则,或者您可以运行

make a b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接