当前位置: 首页 > 知识库问答 >
问题:

制作平行完成屏障

南宫海超
2023-03-14

我有一个Makefile的目标与几个作业运行是并行的-j选项。

all: header
    mkdir -p $(STAGEDIR)
    @echo STAGEDIR = $(STAGEDIR)
    [ -z "$(dir_1_y)" ] || $(MAKE) -j$(HOST_NCPU) $(sort $(dir_1_y)) || exit $$?
    [ -z "$(dir_1_y)" ] || $(SET_STAGEDIR)
    [ -z "$(dir_2_y)" ] || $(MAKE) -j$(HOST_NCPU) $(sort $(dir_2_y)) || exit $$?
    [ -z "$(dir_2_y)" ] || $(SET_STAGEDIR)

完成这些工作可能需要不同的时间。我是否有办法确保在进入构建过程的下一阶段之前完成所有这些工作?

共有2个答案

莫乐
2023-03-14

你可能想得太高了。Make希望您只提供真正的基于文件的依赖项,它将准确地执行要求它做的事情。

例如,您可能会认为您的构建是这样的:

  • 构建库
  • 编译应用对象
  • 通过链接应用对象和库创建可执行文件

简单。事实是,这里的障碍是人为的。您没有理由不能在编译一个lib对象的同时编译一个app对象。或者在创建库时编译一些应用程序对象。

细粒度依赖关系是您的朋友。

${objects}: %.o: %.c ; Recipe for creating $@ from $<
lib1.a: l1.o l2.o ; Recipe for creating lib out of objects
lib2.a: l3.o l4.o ; Recipe for creating lib out of objects
executable: lib1.a lib2.a o5.o ; Recipe for linking

在这里,我们将实际文件作为依赖项和目标。最大并行性、错误检查和剔除工作。这是一个NoDy示例,但是考虑一个更大的系统,其中构建包括运行测试。当您进行更改时,您只想重新运行一小部分测试。您还希望在编译其他代码时运行一些测试。

是的,您必须正确处理依赖关系,但这就是make的全部要点。如果您不能做到这一点,那么可以使用批处理文件,每次都从头开始构建。

金飞
2023-03-14

使用您当前的食谱,所有的工作都在下一行开始之前完成。是否使用-j完全无关紧要。

另外,我不知道您是否意识到,您拥有的不是生成文件。它实际上是一个伪装成makefile的shell脚本,使用Make没有任何好处。没有理由保持这种状态。

只需忘记“makefile”并使用shell脚本:

mkdir -p $STAGEDIR
echo STAGEDIR = $(STAGEDIR)
[ -z "$(dir_1_y)" ] || make -j$HOST_NCPU $(sort $dir_1_y) || exit $?
[ -z "$(dir_1_y)" ] || $(SET_STAGEDIR) 
[ -z "$(dir_2_y)" ] || $(MAKE) -j$HOST_NCPU $(sort $dir_2_y) || exit $?
[ -z "$(dir_2_y)" ] || $(SET_STAGEDIR)

当你这样做的时候,一切都会变得更容易管理,包括你最初的问题中的事情。Make提供了特定的优势,但与shell脚本相比难度增加了。如果你根本不利用这些优势,那么应对困难就毫无意义。

 类似资料:
  • 我正在为数组中的每个UIView设置动画,我想知道所有动画何时完成。例如:我用一个简单的缩放动画在ViewController上显示10个UIView,每个UIView都有一个小延迟。在所有10个动画完成后,我想在完成块中再做一个动画。 我如何知道所有动画何时完成?

  • 问题内容: 我正在尝试使用在使用Python自动完成无聊的东西的第3章末尾找到的项目中的准则编写Collat​​z程序。我正在使用python 。以下是项目概述: 编写一个名为的函数,该函数具有一个名为number的参数。如果数字是偶数,则应打印并返回该值。如果数字为奇数,则应打印并返回。然后编写一个程序,让用户键入一个整数,并不断调用该数字,直到函数返回该值为止。 该程序的输出可能类似于以下内容

  • 我使用的是Symfony的作曲家,我发现在我安装或更新任何新的包后,通过运行它会将东西复制到相应的文件夹,但在完成这个过程之前会抛出一些错误。 加载具有包信息更新依赖项的composer存储库-安装KNPLAB/knp组件(开发主机163308e)克隆163308ed3442e7e9ec4a45ff912664e366954c82 安装knplabs/knp-page inator-bundle(

  • 我试图将一个完整的链接到我的Rx链中,当我这样做时,链永远不会在onError或onComplete中完成。 当我单步执行代码时,我的可完成代码就会被执行。我甚至可以添加日志记录并看到它登录到它自己的doOn完成() 下面将记录“我已完成”,但不会进入错误或完成回调。 如果我改为使用flatMap并使用andThen返回布尔可观测值,它将起作用 我尝试在flatMapCompletable版本中添

  • 它是100%保证的线程,首先得到wait_for_completion_timeout会唤醒第一次调用完成?也许我错了,但是我看了下面的场景:线程A调用wait_for_completion_timeout并进入睡眠。当完成被调用时,它醒来并完成执行在函数do_wait_for_common。现在假设另一个线程B调用wait_for_completion_timeout. x- 然后继续睡觉。所以