Если перебрать .VARIABLES и печать каждого, любая истинная переменная может быть напечатана правильно со следующим правилом:переменные печати, включая функции из Makefile и/или переменной интроспекции
print_variables: $(foreach V,$(.VARIABLES),print-$(V)) .phony_explicit
print-%: .phony_explicit; @echo "$* = \"$($*)\""
.PHONY: .phony_explicit ...
0- или 1-линии функция будет по-прежнему работать, но больше не приведет к Syntax error: Unterminated quote string
. Только одна многострочная функция разрушит все правило print_variables
. В качестве обходного пути я добавил ;\
в каждую строку в определениях моих функций, но это не будет исправлять существующие многострочные функции (либо через include из этого makefile, либо через другие make-файлы, включая этот.) Что я могу сделать? Есть ли контейнер только функциональных переменных или способ проверить, является ли переменная определением функции?
Добавление 'phony_explicit' в' .PHONY' означает, что добавление 'phony_explicit' к любой другой цели делает этот целевой фальшивый. (Другими словами, это позволяет вам сделать phoniness предпосылкой для вашей цели, а не сделать вашу цель предпосылкой для '.PHONY'.) В результате голословность цели объявляется в том же самом месте, что и сама цель. В противном случае вам придется либо прыгать взад-вперед к вашей цели .PHONY, читая/записывая фальшивые цели в другом месте, либо перенаправляйте «.PHONY» рядом с каждой применимой целью. Я не знаю более элегантного решения. Спасибо за вашу помощь! –
Кстати, 'print-F: echo 'F =" $ (subst $ (NL) ,;, $ (F)) "'', вы имели в виду добавить точку с запятой или новую строку после 'print-F: '? Кроме того, вот где я верю, что узнал этот фальшивый трюк. http://stackoverflow.com/a/38803814/1043529 –
Я просто добавляю '.PHONY' рядом с каждой целью; дополнительная линия меня не беспокоит. Но YMMV. Я не хотел добавлять новую строку; вы не можете сделать это с эхом, но это дает мне представление: вы можете использовать printf. Я уточню свой ответ. – MadScientist