在make命令行中建立多个目标

问题描述 投票:0回答:1

假设我有一个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.

谢谢你的时间。

makefile
1个回答
2
投票

这是一个限制 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。

© www.soinside.com 2019 - 2024. All rights reserved.