代码之家  ›  专栏  ›  技术社区  ›  Chris

gnumake:如何使一个规则有多个触发器在并行模式下运行一次?

  •  0
  • Chris  · 技术社区  · 5 年前
    A/a A/b A/c ... A/n:
      ./do-something.sh # creates all n-files in one run
    

    all: A/a A/b A/c ... A/n
    

    在单线程中运行良好 make 但是当我跑的时候 make -j 16 例如,16次独立运行 ./do-something.sh 得到繁殖。

    有没有一种虚假的方式来抑制这种情况,并告诉make规则应该运行一次?

    1 回复  |  直到 5 年前
        1
  •  3
  •   MadScientist    5 年前

    在gnumake中,如果您可以将规则构造为模式规则,那么它的行为是这样的(一次调用创建所有目标) automatically 一直如此。

    如果您不能将规则构造为模式规则(目标没有任何公共子字符串),那么您可以使用Christopher提到的kludge,除非它们忘记了 touch 命令,并且对真正的目标应该有一个无操作命令:

    craft-A:
           ./do-something.sh A
           @touch $@
    
    A/a A/b A/... A/inf: craft-A ;
    

    或者您可以转到支持 &: grouped target 功能,并写入:

    A/a A/b A/c ... A/n &:
            ./do-something.sh # creates all n-files in one run
    
        2
  •  1
  •   Chris    5 年前

    嗯,一如既往, make 让人觉得有些聪明,这是没有实现的原因:

    craft-A:
      ./do-something.sh A
    A/a A/b A/... A/inf: craft-A
    
    all: A/... 
    
    $: make -j 100 all
    

    作品。但是,can被踢下了道路:规则不是幂等的。的确如此 答案是,但是要使它幂等而没有一个混乱似乎是非常困难的。