2011-05-20 20 views
8

我想并行化一个旧的Makefile。临界区并行make文件

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

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

Makefile很麻烦,我不想在这里发布它。

+1

哪个版本的make? – 2011-05-20 10:05:36

回答

3

你可以把所生成文件的规则,在一个单独的Makefile,做这样的事情:

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

然而,GNU制作,这将是默认平行。你需要压制它,而手册并不完全清楚你将如何做到这一点。也许下面的一些组合会工作,这取决于你想支持哪个做的实现:

  • 传递-j1标志:

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

    generated-sources : 
         $(MAKE) -f Makefile.Generators MAKEFLAGS= 
    
  • Makefile.Generators中的以下行抑制并行执行:

    .NOTPARALLEL : 
    
+0

关于.NOTPARALLEL选项的注释:该目标将忽略指定的任何前置请求。包含这个目标的任何生成文件将被强制进行串行构建。因此,您可以将需要在单独的makefile中串行构建的东西添加到.NOTPARALLEL目标中。这与ClearCase构建工具Clearmake不同,它允许您指定一组将被视为与并行构建相互排斥的目标。 – 2011-08-08 18:27:46

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 
+0

问题是这些脚本是使用来自makefile内部的属性调用的,但它是正确的方向,谢谢 – Stasik 2011-05-20 11:12:08

+0

如果我有这样的东西呢? – Stasik 2011-05-20 11:12:57

+0

%.a:%.b ./script3.sh $ < – Stasik 2011-05-20 11:13:56