Spec-Zone.ru › GNU Make

Функция вызова

Функция call уникальна тем, что её можно использовать для создания новых параметризованных функций. Вы можете записать сложное выражение в качестве значения переменной, а затем использовать call для его расширения с различными значениями.

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

$(call variable,param,param,…)

При расширении make этой функции, она присваивает каждому param временные переменные $(1), $(2), и т.д. Переменная $(0) будет содержать variable. Максимальное количество аргументов параметров не ограничено. Минимального тоже нет, но использовать call без параметров не имеет смысла.

Затем variable расширяется как переменная make в контексте этих временных присваиваний. Таким образом, любая ссылка на $(1) в значении variable будет ссылаться на первый param в вызове call.

Обратите внимание, что variable — это имя переменной, а не ссылка на неё. Поэтому обычно вы не используете символ ‘$’ или скобки при его написании. (Однако вы можете использовать ссылку на переменную в имени, если вы хотите, чтобы имя не было константой.)

Если variable является именем встроенной функции, встроенная функция всегда вызывается (даже если переменная с таким именем make также существует).

Функция call расширяет аргументы param перед их присвоением временным переменным. Это означает, что значения variable, содержащие ссылки на встроенные функции, которые имеют специальные правила расширения, такие как foreach или if, могут не работать так, как вы ожидаете.

Некоторые примеры могут прояснить это.

Эта макрос просто меняет порядок своих аргументов:

reverse = $(2) $(1)

foo = $(call reverse,a,b)

Здесь foo будет содержать ‘b a’.

Этот немного интереснее: он определяет макрос для поиска первого вхождения программы в PATH:

pathsearch = $(firstword $(wildcard $(addsuffix /$(1),$(subst :, ,$(PATH)))))

LS := $(call pathsearch,ls)

Теперь переменная LS содержит /bin/ls или что-то подобное.

Функция call может быть вложенной. Каждый рекурсивный вызов получает свои локальные значения для $(1), и т.д., которые маскируют значения call более высокого уровня. Например, вот реализация функции map:

map = $(foreach a,$(2),$(call $(1),$(a)))

Теперь вы можете map функцию, которая обычно принимает только один аргумент, например origin, к нескольким значениям в одном шаге:

o = $(call map,origin,o map MAKE)

и получите o, содержащее что-то вроде ‘file file default’.

Окончательное предупреждение: будьте внимательны при добавлении пробелов в аргументы функции call. Как и в других функциях, любые пробелы, содержащиеся во втором и последующих аргументах, сохраняются; это может привести к неожиданным последствиям. В целом, безопасно удалить все лишние пробелы при предоставлении параметров функции call.

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

Spec-Zone.ru

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