Передача опций дочерним задачам
Флаги, такие как «-s» и «-k», автоматически передаются дочерним make через переменную MAKEFLAGS. Эта переменная автоматически настраивается make для хранения буквенных обозначений флагов, полученных make. Таким образом, если вы используете «make -ks», то MAKEFLAGS получит значение «ks».
Вследствие этого, каждая дочерняя make получает значение для MAKEFLAGS в своей среде. В ответ, она обрабатывает флаги из этого значения, как если бы они были переданы в качестве аргументов. См. Сводку опций.
Значение MAKEFLAGS представляет собой, возможно, пустую группу символов, обозначающих однобуквенные опции без аргументов, за которыми следует пробел и любые опции, принимающие аргументы или имеющие длинные имена. Если у опции есть как однобуквенное, так и длинное обозначения, то всегда используется однобуквенное обозначение. Если на командной строке нет однобуквенных опций, то значение MAKEFLAGS начинается с пробела.
Аналогично, переменные, определённые на командной строке, передаются дочерним make через MAKEFLAGS. Слово в значении MAKEFLAGS, содержащее «=», make обрабатывает как определение переменной, так как будто оно появилось на командной строке. См. Переопределение переменных.
Опции «-C», «-f», «-o» и «-W» не включаются в MAKEFLAGS; эти опции не передаются.
Опция «-j» является специальным случаем (см. Параллельное выполнение). Если вы задаёте ей числовое значение «N», а ваша операционная система его поддерживает (большинство UNIX систем поддерживает; другие, как правило, нет), родительская make и все дочерние make будут взаимодействовать, чтобы гарантировать, что одновременно выполняется только «N» задач между ними всеми. Обратите внимание, что любая задача, отмеченная как рекурсивна (см. Вместо выполнения рецептов), не учитывается в общем количестве задач (иначе у нас могло бы быть «N» дочерних make задач, и не осталось бы места для реальной работы!)
Если ваша операционная система не поддерживает указанное взаимодействие, то «-j» не добавляется в MAKEFLAGS, поэтому дочерние make выполняются в режиме, не поддерживающем параллельную обработку. Если опция «-j» передавалась дочерним make задачам, вы бы получили значительно больше параллельно выполняемых задач, чем запросили. Если вы укажете «-j» без числового аргумента, то есть с указанием на максимальное количество параллельных задач, это также передаётся, так как несколько бесконечностей не больше одной.
Если вы не хотите передавать другие флаги, вам нужно изменить значение MAKEFLAGS, например, следующим образом:
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
Определения переменных из командной строки фактически появляются в переменной MAKEOVERRIDES, а MAKEFLAGS содержит ссылку на эту переменную. Если вы хотите передавать флаги обычно, но не хотите передавать определения переменных из командной строки, вы можете сбросить MAKEOVERRIDES до пустого значения, как показано ниже:
MAKEOVERRIDES =
Это обычно не нужно делать. Однако некоторые системы имеют небольшой фиксированный предел размера среды, и включение такого объёма информации в значение MAKEFLAGS может его превысить. Если вы видите сообщение об ошибке «Arg list too long», это может быть проблема. (Для строгого соответствия POSIX.2, изменение MAKEOVERRIDES не влияет на MAKEFLAGS если специальная цель «.POSIX» появляется в файле makefile. Вероятно, вас это не волнует.)
Аналогичная переменная MFLAGS также существует для обеспечения обратной совместимости. Она имеет то же значение, что и MAKEFLAGS, за исключением того, что она не содержит определения переменных командной строки, и всегда начинается с дефиса, если она не пуста (MAKEFLAGS начинается с дефиса только если она начинается с опции, у которой нет однобуквенного обозначения, например, «--warn-undefined-variables»). MFLAGS традиционно использовалась явно в команде рекурсивного make вызова, как показано ниже:
subsystem:
cd subdir && $(MAKE) $(MFLAGS)
Но теперь MAKEFLAGS делает такое использование излишним. Если вы хотите, чтобы ваши файлы makefile были совместимы со старыми программами make, используйте эту технику; она будет работать и с более современными версиями make.
Переменная MAKEFLAGS также может быть полезна, если вы хотите, чтобы определённые опции, такие как «-k» (см. Сводку опций), устанавливались каждый раз, когда вы запускаете make. Просто поместите значение для MAKEFLAGS в свою среду. Вы также можете установить MAKEFLAGS в файле makefile, чтобы указать дополнительные флаги, которые должны быть активны для этого makefile. (Обратите внимание, что вы не можете использовать MFLAGS таким образом. Эта переменная установлена только для обеспечения обратной совместимости; make не интерпретирует значение, которое вы для неё устанавливаете.)
Когда make интерпретирует значение MAKEFLAGS (из среды или из файла makefile), она сначала добавляет дефис в начало, если значение им не начинается. Затем она разбивает значение на слова, разделённые пробелами, и обрабатывает эти слова как опции, заданные на командной строке (за исключением того, что «-C», «-f», «-h», «-o», «-W» и их длинные варианты игнорируются; и нет ошибки для неверной опции).
Если вы поместите MAKEFLAGS в свою среду, убедитесь, что не включены опции, которые значительно повлияют на действия make и подорвут цель makefile и самого make. Например, опции «-t», «-n» и «-q», если помещены в одну из этих переменных, могут иметь катастрофические последствия и, безусловно, будут иметь, по крайней мере, неожиданные, а, вероятно, и раздражающие последствия.
Если вы хотите использовать другие реализации make помимо GNU make, и, следовательно, не хотите добавлять специфичные для GNU make флаги в переменную MAKEFLAGS, вы можете добавить их в переменную GNUMAKEFLAGS вместо этого. Эта переменная анализируется непосредственно перед MAKEFLAGS, точно так же, как и MAKEFLAGS. Когда make строит MAKEFLAGS для передачи в рекурсивный make, она будет включать все флаги, даже те, которые взяты из GNUMAKEFLAGS. В результате, после обработки GNUMAKEFLAGS GNU make устанавливает эту переменную в пустую строку, чтобы избежать дублирования флагов при рекурсии.
Лучше всего использовать GNUMAKEFLAGS только с флагами, которые не будут существенно изменять поведение ваших makefile. Если ваши makefile все равно требуют GNU make, просто используйте MAKEFLAGS. Такие флаги, как «--no-print-directory» или «--output-sync», могут быть подходящими для GNUMAKEFLAGS.
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/Options_002fRecursion.html