Вы можете распечатать переменные, когда читается make-файл (при условии, что GNU make, поскольку вы соответствующим образом пометили этот вопрос), используя этот метод (с переменной с именем «var»):
$(info $$var is [${var}])
Вы можете добавить эту конструкцию в любой рецепт, чтобы увидеть, что make перейдет в оболочку:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
Теперь, что здесь происходит, это то, что make хранит весь recipe ( $(info $$var is [${var}])echo Hello world
) как одну рекурсивно расширенную переменную. Когда make решает запустить рецепт (например, когда вы указываете его на сборку all
), он расширяет переменную и затем передает каждую результирующую строку отдельно в оболочку.
Итак, в болезненных деталях:
- Расширяется
$(info $$var is [${var}])echo Hello world
- Для этого сначала расширяется
$(info $$var is [${var}])
$$
становится буквальным $
${var}
становится :-)
(скажем)
- Побочный эффект заключается в том, что
$var is [:-)]
появляется на стандартном
- Расширение
$(info...)
хотя пусто
- Марка остается с
echo Hello world
echo Hello world
Сначала сделайте распечатки на stdout, чтобы вы знали, что будет запрашивать оболочка
- Оболочка печатает
Hello world
на стандартный вывод.
Согласно руководству GNU Make, которое также указано 'bobbogo' в ответе ниже, вы можете использовать info / warning / error для отображения текста.
Чтобы напечатать переменные,
'error' остановит выполнение make после отображения строки ошибки
источник
от "Мистер Сделать пост" https://www.cmcrossroads.com/article/printing-value-makefile-variable
Добавьте следующее правило в ваш Makefile:
Затем, если вы хотите узнать значение переменной makefile, просто:
и он вернется:
источник
Если вы просто хотите какой-то вывод, вы хотите использовать
$(info)
его самостоятельно. Вы можете сделать это в любом месте Makefile, и он покажет, когда эта строка будет оценена:Будет выводить
VAR="<value of VAR>"
всякий раз, когда процесс обрабатывает эту строку. Это поведение очень зависит от позиции, поэтому вы должны убедиться, что$(info)
расширение происходит ПОСЛЕ того, что все, что можно изменить$(VAR)
, уже произошло!Более общим вариантом является создание специального правила для печати значения переменной. Вообще говоря, правила выполняются после назначения переменных, поэтому это покажет вам значение, которое фактически используется. (Тем не менее, для правила возможно изменить переменную .) Хорошее форматирование поможет прояснить, на что установлена переменная, и
$(flavor)
функция сообщит вам, что это за переменная. Итак, в этом правиле:$*
расширяется до основы, что%
шаблон соответствует правилу.$($*)
расширяется до значения переменной, имя которой дано$*
.[
И]
четко разграничить расширение переменной. Вы также можете использовать"
и"
или аналогичные.$(flavor $*)
говорит вам, что это за переменная. ПРИМЕЧАНИЕ:$(flavor)
принимает имя переменной , а не ее расширение. Так что, если вы скажетеmake print-LDFLAGS
, вы получите$(flavor LDFLAGS)
, что вы хотите.$(info text)
обеспечивает вывод. Сделать отпечаткиtext
на его стандартный вывод как побочный эффект расширения. Расширение$(info)
хотя пусто. Вы можете думать об этом как@echo
, но важно, что он не использует оболочку, поэтому вам не нужно беспокоиться о правилах цитирования оболочки.@true
это просто, чтобы предоставить команду для правила. Без этого make также выдастprint-blah is up to date
. Я чувствую,@true
делает это более ясным, что это должно быть неоперативным.Запустив его, вы получите
источник
@echo $ (NDK_PROJECT_PATH) - хороший способ сделать это. Я не думаю, что ошибка происходит оттуда. Обычно эта ошибка появляется, когда вы неправильно набрали намерение: я думаю, у вас есть пробелы, в которых вы должны иметь вкладку.
источник
Все версии
make
требуют, чтобы командные строки имели отступ с табуляции (не пробел) в качестве первого символа в строке. Если бы вы показали нам все правило вместо двух рассматриваемых строк, мы могли бы дать более четкий ответ, но это должно быть что-то вроде:где первый символ во второй строке должен быть TAB.
источник
Бегать
make -n
; он показывает вам значение переменной ..Makefile ...
Команда:
Вывод:
источник
--just-print
то же самое в « Вместо казни»Это
makefile
сгенерирует сообщение об ошибке «отсутствует разделитель»:Перед вкладкой есть вкладка
@echo "All done"
(хотяdone:
правило и действие в значительной степени излишни), но не перед@echo PATH=$(PATH)
.Проблема в том, что в начале строки
all
должно быть двоеточие:
или равно=
чтобы указать, что это целевая строка или строка макроса, и у него нет ни одного, поэтому разделитель отсутствует.Действие, отражающее значение переменной, должно быть связано с целью, возможно, фиктивной или PHONEY-целью. И эта целевая линия должна иметь двоеточие. Если вы добавите
:
послеall
в примереmakefile
и замените начальные пробелы в следующей строке на вкладку, это будет работать разумно.У вас, вероятно, есть аналогичная проблема около линии 102 в оригинале
makefile
. Если вы показали 5 непустых строк без комментариев перед ошибочными операциями эха, вероятно, было бы возможно завершить диагностику. Однако, поскольку вопрос был задан в мае 2013 года, маловероятно, что неполныйmakefile
доступ все еще доступен (август 2014 года), поэтому этот ответ не может быть официально подтвержден. Он может использоваться только для иллюстрации вероятного способа возникновения проблемы.источник
Нет необходимости изменять Makefile.
источник
Проблема в том, что эхо работает только под блоком исполнения. т.е. что-нибудь после "хх:"
Таким образом, все, что находится выше первого блока выполнения, является просто инициализацией, поэтому никакая команда выполнения не может быть использована.
Так что создайте исполнительный блок
источник
Это может быть сделано общим способом и может быть очень полезно при отладке сложного make-файла. Следуя той же методике, которая описана в другом ответе , вы можете вставить следующее в любой make-файл:
Затем вы можете просто сделать «make print», чтобы вывести значение любой переменной:
источник
Вы можете создать правило vars в вашем файле make, например:
Здесь есть несколько более надежных способов вывести все переменные: gnu make: перечислить значения всех переменных (или «макросов») в конкретном прогоне .
источник
Если вы не хотите изменять сам Makefile, вы можете использовать
--eval
для добавления новой цели, а затем выполнить новую цель, напримерmake --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
Вы можете вставить необходимый символ табуляции в командной строке, используя
CTRL-V, TAB
пример Makefile сверху:
источник
make: *** missing separator. Stop.
make --eval='print-tests: ; @echo TESTS $(TESTS)' print-tests
если вы используете android make (mka)
@echo $(NDK_PROJECT_PATH)
не будет работать и выдает ошибку,*** missing separator. Stop."
используйте этот ответ, если вы пытаетесь напечатать переменные в android makeэто сработало для меня
источник
Я обычно повторяю с ошибкой, если я хотел увидеть значение переменной. (Только если вы хотите увидеть значение. Это остановит выполнение.)
источник