并行处理 – 如何强制某一组目标总是顺序运行?

并行处理 – 如何强制某一组目标总是顺序运行?,第1张

概述有没有办法让gmake从一组并行运行两个目标呢? 我不想使用.NOTPARALLEL,因为它强制整个Makefile按顺序运行,而不仅仅是必需的部分. 我还可以添加依赖关系,以便依赖于另一个依赖,但是(除了是uglu),我需要构建所有这些,以构建最后一个,这是不必要的. 我需要这个的原因是(只有一个)我的Makefile的一部分调用ghc –make,它照顾它的依赖关系本身.而且不可能在两个不同的 有没有办法让gmake从一组并行运行两个目标呢?

我不想使用.NOTParaLLEL,因为它强制整个Makefile按顺序运行,而不仅仅是必需的部分.

我还可以添加依赖关系,以便依赖于另一个依赖,但是(除了是uglu),我需要构建所有这些,以构建最后一个,这是不必要的.

我需要这个的原因是(只有一个)我的Makefile的一部分调用ghc –make,它照顾它的依赖关系本身.而且不可能在两个不同的目标上并行运行它,因为如果两个目标共享一些依赖关系,则可以重写彼此的.o文件. (但是,ghc被顺序调用是很好的.)

更新:给出一个具体的例子.假设我需要在Makefile中编译两个程序:

> prog1依赖于prog1.hs和mylib.hs;
> prog2依赖于prog2.hs和mylib.hs.

现在,如果我调用了ghc --make prog1.hs,它检查它的依赖关系,将prog1.hs和mylib.hs编译成各自的对象和接口文件,并链接prog1.当我打电话给ghc –make prog2.hs的时候也是这样.所以如果两个命令并行运行,那么会覆盖另外一个命令,导致其失败.

然而,我需要prog1取决于prog2,反之亦然,因为它们应该可以单独编译. (实际上,它们非常大,包含很多模块,并且需要对它们进行编译,这些都会大大减慢开发速度.)

解决方法 嗯,可以做一些更多的信息,所以这只是一个刺在黑暗中.

Make不是真的支持这一点,但是你可以通过几种方式顺序实现两个目标.首先,一个真正用于递归的:

targ1: ; recipe1...targ2: ; recipe2...both-targets:    ${MAKE} targ1    ${MAKE} targ2

所以在这里你可以只是使-j双目标,一切都很好.尽管如此,因为make -j targ1 targ2仍然并行运行.您可以使用依赖关系:

targ1: ; recipe1...targ2: | targ1 ; recipe2...

现在让-j targ1 targ2做你想要的坏处?使targ2始终尝试首先构建targ1(顺序).这可能(或可能不)是您的一个展示.

编辑

另一个令人不满意的策略是明确看看$MAKECMDGOALS,其中列出了您在命令行中指定的目标.仍然是一个脆弱的解决方案,因为当人们使用Makefile内的依赖关系来构建事物(一个不合理的动作)时,它是破碎的.

假设你的makefile包含两个独立的目标targ1和targ2.基本上,它们保持独立,直到有人在命令行上指定它们都必须被构建为止.在这种特殊情况下,你打破这种独立性.考虑这个片段:

$(and $(filter targ1,${MAKECMDGOALS)),$(filter targ2,${MAKECMDGOALS}),$(eval targ1: | targ2))

乌尔克!这里发生了什么?

> make评估$(和)
>它首先必须扩展$(filter targ1,${MAKECMDGOALS})
> Iff targ1被指定,它继续展开$(filter targ2,${MAKECMDGOALS})
>还指定了Iff targ2,它继续扩展$(eval),强制targ1和targ2的序列化.

>请注意,$(eval)扩展为无(所有的工作都是作为副作用完成的),所以原来的$(和)总是扩展到没有什么,没有语法错误.

啊!

[现在我输入了这个,相当简单的prog2:| $(filter prog1,${MAKECMDGOALS})
发生在我身上好吧.]

YMMV等等.

我不熟悉ghc,但正确的解决方案是让两个ghc运行使用不同的构建文件夹,然后他们可以高兴的并行运行.

总结

以上是内存溢出为你收集整理的并行处理 – 如何强制某一组目标总是顺序运行?全部内容,希望文章能够帮你解决并行处理 – 如何强制某一组目标总是顺序运行?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存