在makefile中获取当前作业编号

3

有没有一种方法可以获取当前作业编号以在makefile规则中使用?

让我给你一点背景。我正在使用一个在多个文件上运行的工具。自然地,我使用并行作业来加快速度。真正的问题在于,这个工具会产生多个线程,我想让它们在单个核心上运行——因为那样速度更快。我做了一些测试,发现那样运行更快。

我需要作业编号来设置进程亲和性到CPU核心。


如果您的版本高于4.2,请检查可能的答案:https://dev59.com/0anka4cB1Zd3GeqPJysr - Yingchun
1个回答

1
由于make不跟踪作业编号,因此无法获取“作业编号”。在单个构建中,基本上所有make实例共享一组相同的标记。当make想要启动作业时,它会获取一个标记。完成作业后,make将标记添加回列表中。如果尝试获取标记但没有可用的标记,则会休眠直到有可用的标记。标记没有可区分的特征,因此无法有“作业编号”。
要了解GNU make如何处理并行构建的更多信息,请阅读http://make.mad-scientist.net/jobserver.html 我不太确定这对你有什么帮助。Make不知道任何关于线程的信息,它只启动进程。如果单个进程由多个线程组成,则make仍将其视为单个作业。
编辑:假设您在单个非递归调用make中,您可以按如下方式执行:
COUNT :=

%.foo :
        $(eval COUNT += x)
        @echo "$@: Number of rules run is $(words $(COUNT))"

all: a.foo b.foo c.foo d.foo

我很担心这个问题。我浏览了Makefile源代码,但没有看到任何与我的需求相关的内容。 也许你有其他建议 - 比如如何为每个工具运行获取唯一ID?我在考虑像$RANDOM这样的东西 - 但是随机有多随机呢;) - Wojciech
我仍然不明白为什么你需要这个,但为什么不直接使用PID呢?那是一个系统范围内的唯一值。 - MadScientist
是的,PID就像你所说的那样是唯一的。我没有提到我需要连续唯一的ID - 所以同一CPU核心上运行2个进程的情况不会发生。 - Wojciech
我不知道如何在递归构建环境中实现这一点。如果您只是在单个非递归的 makefile 中,则可以在规则中使用 $(eval ...) 来修改每次调用时的变量,从而让您“计数”。 - MadScientist
有一个非常好的情况需要作业ID:提取失败作业的日志。 可以在命令输出前缀作业ID,以便解开“make”所有交错输出。 --output-sync = target会有所帮助,但速度太慢,而且错误不在日志的末尾。 另一种情况是在作业运行时监视作业的执行,并在运行时切换不同作业的日志。 - Victor Sergienko
输出同步不会(也不应该)减慢make的速度。尽管输出被延迟到命令完成后才显示,但额外的输出同步处理时间不应该明显。对于你所说的作业ID,PID可以正常工作。 - MadScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接