Отключение параллельной обработки
Если makefile полностью и точно определяет зависимости между всеми своими целями, то make корректно построит цели независимо от включения параллельной обработки. Это идеальный способ написания makefiles.
Однако иногда некоторые или все цели в makefile не могут выполняться параллельно, и нецелесообразно добавлять необходимые условия, чтобы проинформировать make. В этом случае makefile может использовать различные методы для отключения параллельной обработки.
Если специальная цель .NOTPARALLEL без зависимостей указана где-либо, то весь экземпляр make будет выполняться последовательно, независимо от настроек параллельной обработки. Например:
all: one two three one two three: ; @sleep 1; echo $@ .NOTPARALLEL:
Независимо от того, как make вызывается, цели one, two и three будут выполняться последовательно.
Если специальная цель .NOTPARALLEL имеет зависимости, то каждая из этих зависимостей будет рассматриваться как цель, и все зависимости этих целей будут выполняться последовательно. Обратите внимание, что только при построении этой цели зависимости будут выполняться последовательно: если какие-либо другие цели перечисляют те же зависимости и не находятся в .NOTPARALLEL, то эти зависимости могут выполняться параллельно. Например:
all: base notparallel base: one two three notparallel: one two three one two three: ; @sleep 1; echo $@ .NOTPARALLEL: notparallel
Здесь ‘make -j base’ выполнит цели one, two и three параллельно, а ‘make -j notparallel’ выполнит их последовательно. Если вы запустите ‘make -j all’, то они будут выполнены параллельно, поскольку base перечисляет их как зависимости и не сериализуется.
Цель .NOTPARALLEL не должна содержать команд.
Наконец, вы можете контролировать сериализацию определенных зависимостей более детально, используя специальную цель .WAIT. Когда эта цель появляется в списке зависимостей, и параллельная обработка включена, make не будет строить ни одну из зависимостей справа от .WAIT до тех пор, пока не будут завершены все зависимости слева от .WAIT. Например:
all: one two .WAIT three one two three: ; @sleep 1; echo $@
Если параллельная обработка включена, make попытается построить one и two параллельно, но не попытается построить three до тех пор, пока оба не будут завершены.
Как и в случае с целями, предоставляемыми .NOTPARALLEL, .WAIT вступает в силу только при построении цели, в списке зависимостей которой она появляется. Если те же зависимости присутствуют в других целях, без .WAIT, то они все равно могут выполняться параллельно. Из-за этого ни .NOTPARALLEL с целями, ни .WAIT не являются такими же надёжными для управления параллельной обработкой, как определение зависимости. Однако они просты в использовании и могут быть достаточными в менее сложных ситуациях.
Зависимость .WAIT не будет присутствовать ни в одной из автоматических переменных для правила.
Вы можете создать реальную цель .WAIT в своём makefile для переносимости, но это не требуется для использования этой функции. Если цель .WAIT создана, она не должна иметь зависимостей или команд.
Функция .WAIT также реализована в других версиях make и она определена в стандарте POSIX для make.
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-Disable.html