создать несколько целей в командной строке make - PullRequest
0 голосов
/ 26 мая 2020

Предположим, у меня есть файл make и много целей MyTarget1,MyTarget2,MyTarget3,...,MyTarget100.

Если я хочу скомпилировать все цели с использованием 12 потоков, я могу просто использовать make -j12 all.

Теперь Я хочу скомпилировать подмножество всех целей, предположим, MyTarget1, MyTarget2, MyTarget3, MyTarget4.

Я знаю, что компиляция каждой цели по очереди должна работать. Таким образом, 12 потоков работают с MyTarget1, подождите, работайте над MyTarget2, подождите, ... Если MyTarget не имеет высокого параллизма, например, это небольшая цель, такая как helloworld, время некоторого потока будет впустую. Мне не нравится его низкий параллелизм.

Мне нужно решение с высоким параллелизмом, например make -j12 all, которое из 12 потоков может работать с разными целями в определенный момент.

Как я могу реализовать это?

Я хочу что-то вроде

make -j12 MyTarget1,MyTarget2,MyTarget3,MyTarget4

Ссылка

следуйте ссылке, уже указанной в решении CMake, теперь мне интересно, можно ли это реализовать напрямую используя make.

Спасибо за ваше время.

1 Ответ

2 голосов
/ 26 мая 2020

Это ограничение 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

Итак, как вы можете видеть, каждая цель передается во вспомогательный make-файл, но, поскольку этот верхний 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

Для произвольных целей вы можете успешно вызвать суб-файл make напрямую:

$ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...