假设我有一个make文件,并且我有很多的目标文件 MyTarget1,MyTarget2,MyTarget3,...,MyTarget100
.
如果我想用12线程编译所有目标,我可以简单地使用 make -j12 all
.
现在我想编译所有目标的一个子集,假设是 MyTarget1, MyTarget2, MyTarget3, MyTarget4
.
我知道,编译每个目标必须一个一个地工作。这样一来,12个线程工作在 MyTarget1
等一下,工作上 MyTarget2
等等,... 如果... MyTarget
不要有一个高的parallism,例如它是一个小目标,如helloworld,一些线程的时间是浪费。我不喜欢它的低配角。
我希望有一个高配角的解决方案,例如 make -j12 all
在某一时刻,12个线程可以在不同的目标上工作。
我如何实现?
我想实现这样的功能
make -j12 MyTarget1,MyTarget2,MyTarget3,MyTarget4
循序渐进 CMake
的解决方案,现在我想知道是否可以直接使用 make
.
谢谢你的时间。
这是一个限制 CMake
. 产生的 Makefile
被明确列为不并行运行。例如
$ cat CMakeLists.txt
project(foo C)
add_custom_target(target1 ALL
COMMAND python3 -c "import time; time.sleep(5)"
VERBATIM
)
add_custom_target(target2 ALL
COMMAND python3 -c "import time; time.sleep(5)"
VERBATIM
)
生成的相关部分 Makefile
是。
$ cat Makefile
...
# Allow only one "make -f Makefile2" at a time, but pass parallelism.
.NOTPARALLEL:
...
# The main all target
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start /home/raspy/so-62013595/CMakeFiles /home/raspy/so-62013595/CMakeFiles/progress.marks
$(MAKE) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start /home/raspy/so-62013595/CMakeFiles 0
.PHONY : all
...
# Build rule for target.
target2: cmake_check_build_system
$(MAKE) -f CMakeFiles/Makefile2 target2
.PHONY : target2
...
# Build rule for target.
target1: cmake_check_build_system
$(MAKE) -f CMakeFiles/Makefile2 target1
.PHONY : target1
所以你可以看到,每个目标都会被传播到一个子makefile中,但是由于这个顶层文件 Makefile
被列为非并行,它将不允许同时构建多个目标。
$ make -j8 target1 target2 | ts
May 26 15:45:06 Built target target1
May 26 15:45:13 Built target target2 # <--- Built after target1 completed
对于任意的目标,你可能会直接调用sub-makefile成功。
$ make -j8 -f CMakeFiles/Makefile2 target1 target2 | ts
May 26 15:45:42 Built target target2
May 26 15:45:42 Built target target1 # <--- Built simultaneously with target2
不过YMMV。