Spec-Zone.ru › GNU Make

Функция eval

Функция eval очень специфична: она позволяет определять новые конструкции makefile, которые не являются константами; они являются результатом оценки других переменных и функций. Аргумент функции eval расширяется, а затем результаты этого расширения парсятся как синтаксис makefile. Результаты расширения могут определять новые make переменные, цели, неявные или явные правила и т.д.

Результат работы функции eval всегда пустая строка; таким образом, её можно разместить практически где угодно в makefile, не вызывая синтаксических ошибок.

Важно понимать, что аргумент eval расширяется дважды; сначала функцией eval, а затем результаты этого расширения снова расширяются, когда они парсятся как синтаксис makefile. Это означает, что вам может потребоваться предоставить дополнительные уровни экранирования для символов «$» при использовании eval. Функция value (см. Функцию значения) иногда может быть полезной в этих ситуациях, чтобы обойти нежелательные расширения.

Вот пример использования eval; этот пример сочетает в себе ряд концепций и других функций. Хотя использование eval в этом примере может показаться чрезмерно сложным по сравнению с непосредственным написанием правил, следует учитывать два момента: во-первых, определение шаблона (в PROGRAM_template) может потребоваться значительно более сложным, чем здесь; и, во-вторых, вы можете поместить сложную, «обобщённую» часть этого примера в другой файл makefile, а затем включить его во все отдельные файлы makefile. Теперь ваши отдельные файлы makefile будут довольно простыми.

PROGRAMS    = server client

server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol

client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol

# Everything after this is generic

.PHONY: all
all: $(PROGRAMS)

define PROGRAM_template =
 $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
 ALL_OBJS   += $$($(1)_OBJS)
endef

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

$(PROGRAMS):
        $(LINK.o) $^ $(LDLIBS) -o $@

clean:
        rm -f $(ALL_OBJS) $(PROGRAMS)

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

Spec-Zone.ru

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