Параллельный вывод - PullRequest
3 голосов
/ 22 марта 2011

При запуске сгенерированного CMake Makefile с несколькими процессами (make -jN) выходные данные часто путаются так:

[  8%] [  8%] [  9%] Building CXX object App/CMakeFiles/App.dir/src/File1.cpp.o
Building CXX object App/CMakeFiles/App.dir/src/File2.cpp.o
Building CXX object App/CMakeFiles/App.dir/src/File3.cpp.o

Я не уверен, но я думаю, что это поведение также тамдля Makefiles, не сгенерированных CMake.Я бы сказал, что это происходит, когда несколько процессов пишут в stdout одновременно.

Я знаю, что я, вероятно, педантичен, но есть ли какое-нибудь (простое) решение этой проблемы?;)

Ответы [ 5 ]

9 голосов
/ 23 марта 2011

Если вы используете GNU make, вы можете сделать это, переопределив SHELL так, что команды будут обернуты тривиальной утилитой, обеспечивающей атомарность информации, выводимой на стандартный вывод. Вот более подробное описание, включая пример источника для утилиты-оболочки.

5 голосов
/ 27 марта 2011

Я пытался заставить людей CMake это исправить, но, видимо, они этого не хотят.Смотри http://www.cmake.org/Bug/view.php?id=7062.

2 голосов
/ 01 апреля 2014

Конкретная ошибка CMake, связанная с чередованным выводом make с использованием -jN с N> 1, равна CMake ошибка 0012991: «Беспорядок вывода параллельной сборки» . Он все еще открыт в состоянии «backlog», ожидая исправления.

Эта ошибка на самом деле достаточно раздражает, поэтому есть веская причина перейти на ниндзя вместо make . Плюс тот факт, что Ninja быстрее, чем make . Ninja также использует соответствующее количество параллельных заданий в зависимости от количества имеющихся процессорных ядер. Также здорово, что Ninja, по умолчанию, очень тихий: весь процесс происходит на одной строке в терминале, если процесс сборки не генерирует сообщения или если шаг сборки не выполняется. Если этап сборки завершается неудачно, Ninja печатает полную командную строку, которая его вызвала, и отображает вывод. Это действительно приятно, поскольку выделяет любые предупреждения или сообщения об ошибках. Хотя в настоящее время нет цветного вывода терминала: это было бы хорошим улучшением, но для меня преимущества Ninja по сравнению с make огромны.

0 голосов
/ 17 июля 2018

Вот простой рабочий пример использования оболочки для Make. Я не уверен, поощряю ли я его использование, но это идея.

# Makefile
SHELL = /tmp/test/wrapper

test: test1 test2

test1:
    $(eval export TARGET=$@)
    env

test2:
    $(eval export TARGET=$@)
    env

и это:

#!/usr/bin/env bash
# wrapper
bash $@ | sed -e "s/^/${TARGET} /"
0 голосов
/ 22 марта 2011

Sun (теперь Oracle) dmake, доступные в Linux, и Solaris позаботится об этом. См. здесь и там .

...