Spec-Zone.ru › GNU Make

Функция foreach

Функция foreach похожа на функцию let, но сильно отличается от других функций. Она вызывает повторное использование одного фрагмента текста, каждый раз с выполнением различных подстановок. Функция foreach напоминает команду for в оболочке sh и команду foreach в C-оболочке csh.

Синтаксис функции foreach:

$(foreach var,list,text)

Первые два аргумента, var и list, расширяются прежде всего; обратите внимание, что последний аргумент, text, не расширяется одновременно. Затем для каждого слова расширенного значения list переменная с именем, определённым расширенным значением var, устанавливается на это слово, и расширяется text. Предполагается, что text содержит ссылки на эту переменную, поэтому её расширение будет разным каждый раз.

Результат заключается в том, что text расширяется столько раз, сколько существует разделенных пробелами слов в list. Множественные расширения text конкатенируются с пробелами между ними, чтобы получить результат выполнения функции foreach.

В этом простом примере переменная ‘files’ устанавливается на список всех файлов в каталогах в списке ‘dirs’:

dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))

Здесь text это ‘$(wildcard $(dir)/*)’. При первом повторении значение ‘a’ находится для dir, поэтому он производит тот же результат, что и ‘$(wildcard a/*)’; второе повторение производит результат ‘$(wildcard b/*)’; а третье – результат ‘$(wildcard c/*)’.

Этот пример имеет тот же результат (кроме установки ‘dirs’), что и следующий пример:

files := $(wildcard a/* b/* c/* d/*)

Когда text сложный, можно улучшить читаемость, присвоив ему имя с дополнительной переменной:

find_files = $(wildcard $(dir)/*)
dirs := a b c d
files := $(foreach dir,$(dirs),$(find_files))

Здесь мы используем переменную find_files таким образом. Мы используем обычный ‘=’ для определения рекурсивно-расширяющейся переменной, так что её значение содержит фактический вызов функции, который должен быть повторно расширен под управлением foreach; просто расширяемая переменная не подойдёт, так как wildcard будет вызвана только один раз во время определения find_files.

Подобно функции let, функция foreach не оказывает постоянного влияния на переменную var; её значение и тип после вызова функции foreach такие же, как и до неё. Другие значения, которые берутся из list, действуют только временно, во время выполнения foreach. Переменная var – это просто расширяемая переменная во время выполнения foreach. Если var была не определена до вызова функции foreach, она остаётся не определённой после вызова. См. Два типа переменных.

Следует быть осторожным при использовании сложных выражений переменных, которые приводят к именам переменных, потому что многие странные вещи являются допустимыми именами переменных, но, вероятно, не тем, что вы имели в виду. Например,

files := $(foreach Esta-escrito-en-espanol!,b c ch,$(find_files))

может быть полезным, если значение find_files ссылается на переменную, имя которой ‘Esta-escrito-en-espanol!’ (es un nombre bastante largo, no?), но это, скорее всего, ошибка.

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/Foreach-Function.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API