使用GNU make,是否可以在使用“--job”选项时创建一组永远不会同时调度的目标?
背景:
为了使其更具体,请考虑表单的makefile
p1: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
...rules...
p2: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
...rules...
p3: ...deps... # no parallelization conflicts (can run at the same time as p*, e*)
...rules...
e1: ...deps... # cannot run at same time as any other e*
...rules...
e2: ...deps... # cannot run at same time as any other e*
...rules...
e3: ...deps... # cannot run at same time as any other e*
...rules...我需要做的主要事情是确保e1、e2和e3永远不会被同时处理,因为它们在资源有限的嵌入式设备上执行一些工作。如果它们中的多个同时执行,它们就会崩溃。p2和p3可以与任何东西并行执行,包括任何e*作业。
请注意,实际的makefile有几千个目标,它们的依赖关系树大约有10层深,所以我希望有一种方法可以做到这一点:(a)不需要串行运行make,(b)保留在makefile中编码依赖关系树的好处。
发布于 2009-02-23 17:38:55
您的一个选择是使用"flock“在独占锁下运行"e”规则。详情见man flock(1)。例如,而不是
e2: deps
my_cmd foo bar你可以拥有
e2: deps
flock .embedded-device-lock -c my_cmd foo bar然后发生的是,所有的"e“目标都由make并行启动(可能),但实际的命令将串行执行。
发布于 2009-02-23 17:48:38
这不是一个完美的解决方案,但您可以使用一个仅限订单的前提条件来对e*目标进行特定的排序:
e1: ...deps...
...commands...
e2: ...deps... | e1
...commands...
e3: ...deps... | e2 e1
...commands...管道符号'|‘后面的前提条件是仅限顺序的:它们不会强制(比方说)在e1或e2发生更改时更新e3,但它们确实要求e1和e2的所有命令在启动e3的命令之前完成运行。
这样做的缺点是,它为这些互斥的先决条件强加了特定的顺序,而不是让make选择顺序,但在实践中,您可能可以手动确定一个合理的顺序。
https://stackoverflow.com/questions/578521
复制相似问题