Вывод во время параллельного выполнения
При выполнении нескольких рецептов параллельно вывод каждого рецепта появляется сразу же после его генерации, в результате чего сообщения от разных рецептов могут чередоваться, иногда даже появляясь в одной строке. Это может затруднить чтение вывода.
Чтобы избежать этого, можно использовать опцию ‘--output-sync’ (‘-O’). Эта опция инструктирует make сохранить вывод от вызываемых им команд и напечатать его целиком после завершения команд. Кроме того, если есть несколько рекурсивных make вызовов, работающих параллельно, они будут взаимодействовать, чтобы только один из них генерировал вывод в данный момент.
Если включена печать текущей директории (см. Опция ‘--print-directory’), сообщения входа/выхода печатаются вокруг каждой группы вывода. Если вы предпочитаете не видеть эти сообщения, добавьте опцию ‘--no-print-directory’ к MAKEFLAGS.
Существует четыре уровня детализации при синхронизации вывода, задаваемые аргументом опции (например, ‘-Oline’ или ‘--output-sync=recurse’).
none-
Это значение по умолчанию: весь вывод отправляется непосредственно по мере его генерации, и никакая синхронизация не выполняется.
line-
Вывод каждой отдельной строки рецепта группируется и печатается, как только эта строка завершается. Если рецепт состоит из нескольких строк, они могут чередоваться со строками из других рецептов.
target-
Вывод всего рецепта для каждого целевого объекта группируется и печатается, как только целевой объект завершается. Это значение по умолчанию, если опция
--output-syncили-Oзадана без аргумента. recurse-
Вывод каждого рекурсивного вызова
makeгруппируется и печатается после завершения рекурсивного вызова.
Независимо от выбранного режима, общее время сборки останется неизменным. Единственное отличие заключается в том, как отображается вывод.
Режимы ‘target’ и ‘recurse’ оба собирают вывод всего рецепта целевого объекта и отображают его непрерывно по завершении рецепта. Разница между ними заключается в том, как обрабатываются рецепты, содержащие рекурсивные вызовы make (см. Рекурсивное использование make). Для всех рецептов, не содержащих рекурсивных строк, режимы ‘target’ и ‘recurse’ ведут себя одинаково.
Если выбран режим ‘recurse’, рецепты, содержащие рекурсивные make вызовы, обрабатываются так же, как и другие целевые объекты: вывод из рецепта, включая вывод из рекурсивных make, сохраняется и печатается после завершения всего рецепта. Это гарантирует, что вывод всех целевых объектов, построенных данным рекурсивным make экземпляром, сгруппируется вместе, что может сделать вывод более понятным. Однако это также приводит к длительным периодам во время сборки, когда вывод не виден, за которым следуют большие всплески вывода. Если вы не следите за сборкой по ходу ее выполнения, а вместо этого просматриваете журнал сборки после завершения, это может быть лучшим вариантом для вас.
Если вы наблюдаете за выводом, долгие периоды бездействия во время сборки могут быть разочаровывающими. Режим синхронизации вывода ‘target’ определяет, когда make будет вызван рекурсивно, используя стандартные методы, и не будет синхронизировать вывод этих строк. Рекурсивные make будут выполнять синхронизацию для своих целевых объектов, и вывод каждого из них будет отображаться немедленно по завершении. Имейте в виду, что вывод рекурсивных строк рецепта не синхронизируется (например, если рекурсивная строка выводит сообщение до запуска make, это сообщение не будет синхронизировано).
Режим ‘line’ может быть полезен для фронтендов, которые следят за выводом make для отслеживания начала и завершения рецептов.
Некоторые программы, вызываемые make, могут вести себя по-разному, если они определят, что они пишут вывод в терминал, а не в файл (часто описывается как режимы «интерактивный» против «неинтерактивный»). Например, многие программы, которые могут отображать цветной вывод, не будут делать этого, если они определят, что не пишут в терминал. Если ваш Makefile вызывает программу такого типа, использование опций синхронизации вывода заставит программу считать, что она работает в режиме «неинтерактивный», даже если вывод в конечном итоге попадет в терминал.
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Parallel-Output.html