代码之家  ›  专栏  ›  技术社区  ›  Mr Fooz

GNU make中的互斥作业调度?

  •  4
  • Mr Fooz  · 技术社区  · 17 年前

    使用GNU make,当使用“-jobs”选项时,是否可以创建一组永远不会同时计划的目标?

    背景:

    为了使这一点更加具体化,请考虑窗体的Maple文件。

    p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
            ...rules...
    
    p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
            ...rules...
    
    p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
            ...rules...
    
    e1: ...deps... # cannot run at same time as any other e*
            ...rules...
    
    e2: ...deps... # cannot run at same time as any other e*
            ...rules...
    
    e3: ...deps... # cannot run at same time as any other e*
            ...rules...
    

    我需要做的主要事情是确保e1、e2和e3不会同时处理,因为它们在资源有限的嵌入式设备上执行某些工作。如果它们中的多个同时执行,它们就会崩溃。p1、p2和p3可以与任何东西并行执行,包括任何e*作业。

    请注意,实际的makefile有几千个目标,它们的依赖关系树大约有10层深,因此我希望有一种方法可以做到这一点:(a)不需要连续运行make;(b)保留在makefile中编码依赖关系树的好处。

    2 回复  |  直到 17 年前
        1
  •  6
  •   Antti Huima    17 年前

    您可以选择使用“flock”在独占锁下运行“e”规则。有关详细信息,请参见人群(1)。例如,代替

    e2: deps
        my_cmd foo bar
    

    e2: deps
        flock .embedded-device-lock -c my_cmd foo bar
    

    然后,所有“e”目标都由make并行启动(可能),但实际命令将串行执行。

        2
  •  3
  •   David Z    17 年前

    这不是一个完美的解决方案,但您可以使用仅限订单的先决条件对e*目标实施特定的订单:

    e1: ...deps...
        ...commands...
    e2: ...deps... | e1
        ...commands...
    e3: ...deps... | e2 e1
        ...commands...
    

    管道符号“|”后的先决条件仅为顺序:如果e1或e2已更改,它们不会强制(例如)更新e3,但它们确实要求e1和e2的所有命令在e3命令启动之前完成运行。

    make 选择订单,但实际上您可能可以手动计算出合理的订单。