GNU make:单个规则中的多个目标

时间:2011-08-16 16:07:48

标签: makefile gnu-make

  

可能重复:
  GNU Makefile rule generating a few targets from a single source file

如果我有这样的Makefile规则:

a b c:
    echo "Creating a b c"
    touch a b c

output: a b c
    cat a b c > output

我运行 make -j9输出

make看到3个依赖项(a,b,c),查找如何生成它们:(上面的“a b c”规则),但接下来会发生什么?如果没有意识到“a b c”规则只需要运行一次来​​创建所有3个目标吗?

这就是实际做的事情:

[pavel@orianna test]$ make -j9 output -n
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c
echo "Creating a b c"
touch a b c                                                                                                                                                                                                                                                                    
cat a b c > output                                                                                                                                                                                                                                                             
[pavel@orianna test]$

相同的食谱运行 3次,每次依赖一次以规则“输出”!

有谁知道它为什么会这样?

2 个答案:

答案 0 :(得分:29)

您的a b c:规则告诉您,这是如何构建任何这些目标,而不是如何构建所有。 Make不够聪明,无法分析命令,并推断一旦运行规则将构建所有三个命令。让(知道output规则)知道它必须重建abc,这就是它的作用。它为a运行一次规则,一次为b,一次为c

如果您想单独重建它们,请执行以下操作:

a b c:
    echo "Creating $@"
    touch $@

如果您想一次性重建它们,请执行以下操作:

.PHONY: things
things:
    echo "Creating a b c"
    touch a b c

output: things
    cat a b c > output

或更好:

THINGS = a b c
.PHONY: things
things:
    echo "Creating $(THINGS)"
    touch $(THINGS)

output: things
    cat $(THINGS) > output

答案 1 :(得分:8)

a b c是三个不同的目标/目标,没有任何先决条件。我想说它会在被要求时建立目标。

a b c:
    echo "Creating a b c"
    touch a b c

您要求make构建具有b c作为先决条件的目标命名输出。 因此,目标a b c按顺序构建,最后构建输出。

现在,在你的情况下,当调用任何一个目标时,所有目标都会被构建。因此,为避免冗余构建,您必须向目标a,b,c添加先决条件。仅当'a'不存在时才构建目标'a'。类似地,'b'和'c'

a b c: $@
    echo "Creating a b c"
    touch a b c

然而,这是不可取的。理想情况下,Makefile目标应该非常具体。