使用GNU make,是否可以创建一组在使用"--jobs"选项时永远不会同时安排的目标?
为了使这更具体,请考虑表单的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从来没有在同一时间被处理,因为他们资源有限的嵌入式设备上的一些工作.如果它们中的多个同时执行,它们会崩溃.p1,p2和p3可以与任何东西并行执行,包括任何e*作业.
需要注意的是实际的Makefile有几千个指标与依赖关系树这里有大约10层深,所以我希望有一种方法可以做到这一点(一)不需要运行make串行和(b)保留的好处在makefile中编码依赖树.
一个选项是使用"flock"在独占锁下运行"e"规则.有关详细信息,请参阅man flock(1).例如,而不是
e2: deps my_cmd foo bar
你可以有
e2: deps flock .embedded-device-lock -c my_cmd foo bar
然后会发生的是,所有"e"目标都由make并行(可能)启动,但实际命令将按顺序执行.