首页 文章

GNU make:单个规则中的多个目标[重复]

提问于
浏览
26

可能重复:GNU Makefile规则从单个源文件生成一些目标

如果我有这样的Makefile规则:

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

output: a b c
    cat a b c > output

我跑 make -j9 output

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 times ,每个依赖关系一次运行"output"!

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

2 回答

  • 28

    您的 a b c: 规则告诉Make这是如何构建这些目标的 any ,而不是如何构建它们的 all . Make不够聪明,无法分析命令,并推断一旦运行规则将构建所有这三个命令 . 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
    
  • 7

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

    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目标应该非常具体 .

相关问题