Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

Строка-инструкция make-файла для получения значений переменных

Отредактировано

2К открытий2К показов

Если вы используете GNU, то перед отладкой в make-файл вам следует добавить одну строку. И она настолько полезна, что вам следует делать это все время и в каждом make-файле, который вы создаете.

			print-%: ; @echo $*=$($*)
		

Эта строчка позволяет быстро получать значение любой переменной в make-файле. Например, вы захотите знать значение переменной с именем SOURCE_FILES, тогда вам просто нужно ввести: make print-SOURCE_FILES Если вы используете GNU Make 3.82 или выше, то вам даже не нужно изменять саму сборку, а ввести это:

			make --eval="print-%: ; @echo $*=$($*)" print-SOURCE_FILES
		

Таким образом вы получите значение SOURCE_FILES. --eval добавляет нашу строку в make-файл, без изменений самого make-файла, что является весьма удобным способом, в случае, если нужно сохранить сборку без изменений.

Как это работает

Строка:

			print-%: ; @echo $*=$($*)
		

— определяет шаблон, по которому вместо знака % может стоять искомая нами переменная (% – символ подстановки). Поэтому, когда вы запросите распечатку SOURCE_FILES, то это правило будет выполнено, а под % будет подразумеваться наша переменная SOURCE_FILES. @echo $*=$($*) – команда, которая выполняется под командой print-%. Точка с запятой используется для того, чтобы отделить обе команды друг от друга, и избавиться от необходимости писать это в две строки. Однако в более традиционном виде это выглядит так:

			print-%: 
    @echo $*=$($*)
		

Как мы видим, использование точки с запятой слегка все упрощает. Автоматическая переменная $* соответствует % в print-% (при выполнении print-SOURCE_FILES, наша переменная $* будет соответствовать SOURCE_FILES). Таким образом, $* содержит имя переменной, которую мы хотим вывести. А $($*) получает значение переменной, имя которой хранится в $*. Например, $* получает имя SOURCE_FILES, а затем GNU Make получает значение, хранящееся в $(SOURCE_FILES). Сохранение содержимого одной переменной в другой переменной может оказаться очень полезным методом для многих make-файлов.

Перевод статьи «The one line you should add to every makefile»

2К открытий2К показов