【问题标题】:Critical section in parallel make file并行生成文件中的关键部分
【发布时间】:2011-05-20 10:03:16
【问题描述】:

我正在尝试并行化旧的 Makefile。

事实上,我需要确保在编译过程开始之前调用某些生成器脚本不是并行的

生成器总是在编译之前被调用。有什么方法可以在 makefile 中建立一个有点关键的部分?

Makefile 很乱,我不想在这里发布。

【问题讨论】:

    标签: c makefile parallel-processing


    【解决方案1】:

    您可以将生成文件的规则放在单独的 Makefile 中,然后执行以下操作:

    generated-sources :
            $(MAKE) -f Makefile.Generators
    

    但是,使用 GNU Make,默认情况下这将是并行的。您需要抑制它,并且手册并不完全清楚您将如何做到这一点。也许以下一些组合会起作用,具体取决于您希望支持的 make 实现:

    • 传递-j1 标志:

      generated-sources :
              $(MAKE) -j1 -f Makefile.Generators
      
    • 抑制MAKEFLAGS 选项:

      generated-sources :
              $(MAKE) -f Makefile.Generators MAKEFLAGS=
      
    • Makefile.Generators 中使用以下行禁止并行执行:

      .NOTPARALLEL :
      

    【讨论】:

    • 关于 .NOTPARALLEL 选项的注释:该目标将忽略指定的任何先决条件。任何包含此目标的 makefile 都将被强制串行构建。因此,您可以将需要串行构建的内容放在单独的 makefile 中并添加 .NOTPARALLEL 目标。这与 ClearCase 构建工具 Clearmake 的不同之处在于它允许您指定一组目标,这些目标将被视为与并行构建互斥。
    【解决方案2】:

    您可以制定一个运行所有脚本的规则,然后确保所有其他规则都依赖于该规则。

    all: ${SOURCES} scripts
    
    scripts: last_script
    
    
    first_script:
        ./script1.sh
    
    second_script: first_script
        ./script2.sh
    
    last_script: second_script
        ./script3.sh
    
    source1.o: source1.c scripts
        gcc source1.c -c -o source1.o
    

    【讨论】:

    • 问题是这些脚本是用makefile内部的属性调用的,但这是正确的方向,谢谢
    • 如果我有这样的东西怎么办?
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多