Вопрос или проблема
Да, я прочитал
Передача параметров в под-‘make’
но я хочу установить параметр для этого make, а не для под-make,
и установить его в Makefile, а не через командную строку.
$ cat Makefile
MAKEFLAGS = --warn-undefined-variables
zz: $(yy); xx
$ make -n # видите, это не сработало!:
xx
$ make -n --warn-undefined-variables # нужно сделать вместо этого.
Makefile:2: warning: неопределенная переменная 'yy'
xx
$ make --version
GNU Make 4.3
У других также была такая же проблема.
Из файла новостей GNU Make, касающегося изменений в проекте для выпуска 4.4.1:
Версия 4.4.1 (26 фев 2023)
Этот релиз в основном является исправлением ошибок.
Полный список исправленных ошибок в этой версии доступен здесь:
https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=110&set=custom
* ВНИМАНИЕ: Обратная несовместимость!
В предыдущих выпусках не было четко определено, когда изменения в MAKEFLAGS,
сделанные внутри makefile, будут видны. Этот выпуск гарантирует, что они будут видны
немедленно, даже при вызове функций $(shell ...). Также присвоения переменных
из командной строки теперь всегда присутствуют в MAKEFLAGS, даже при парсинге
makefile.
Реализация предоставлена Дмитрием Гончаровым <[email protected]>
Также для релиза 4.4 (возможно, связано):
Версия 4.4 (31 окт 2022)
Полный список исправленных ошибок в этой версии доступен здесь:
https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=109&set=custom
[...]
* Если переменная MAKEFLAGS изменена в makefile, она будет переанализирована
немедленно, а не после того, как все makefile будут прочитаны. Обратите внимание, что
хотя все параметры анализируются немедленно, некоторые специальные эффекты не появятся
до тех пор, пока все makefile не будут прочитаны.
Поскольку вы используете GNU Make 4.3, изменения в переменной MAKEFLAGS
не будут немедленно видны в Makefile.
Ответ или решение
Как установить MAKEFLAGS=–warn-undefined-variables для текущего Makefile
Если вы хотите установить опцию MAKEFLAGS=--warn-undefined-variables
в своём Makefile, но не можете добиться этого с ожидаемым результатом на версии GNU Make 4.3, стоит обратить внимание на изменения, введенные в более поздних версиях, таких как 4.4. К сожалению, в вашей версии Make (4.3) изменения в переменной MAKEFLAGS
не применяются немедленно, что и приводит к вашей проблеме.
Проблема
Как вы уже заметили, использование:
MAKEFLAGS = --warn-undefined-variables
внутри вашего Makefile не даст ожидаемого результата, так как GNU Make 4.3 не распознаёт изменения MAKEFLAGS
сразу же. Вместо этого вам необходимо использовать --warn-undefined-variables
при вызове make
, чтобы увидеть предупреждения об несуществующих переменных, таких как yy
.
Решение
С учётом ограничений версии 4.3, вот несколько возможных путей решения проблемы:
-
Обновление версии GNU Make: Если это возможно, рекомендуется обновиться до версии 4.4.1 или выше. В этих версиях изменения в
MAKEFLAGS
становятся видимыми немедленно, что позволяет вам задать переменные в Makefile. -
Определение флага при вызове make: Если обновление версии невозможно, используйте аргументы командной строки при вызове make. Например:
make --warn-undefined-variables
-
Использование переменных внутри Makefile: Убедитесь, что вы используете локальные переменные (например,
CFLAGS
,CPPFLAGS
и т.д.) для задания аналогичных предупреждений. Теперь мы рассмотрим возможность использования$(info ...)
внутри makefile для проверок. Например:zz: $(yy) @$(info Warning: 'yy' is not defined) xx
Такой подход позволит вам установить более информативные сообщения об ошибках.
Пример Makefile
Представим, как могло бы выглядеть ваше Makefile с альтернативными сообщениями:
zz: $(yy)
@if [ -z "$(yy)" ]; then \
echo "Warning: undefined variable 'yy'"; \
fi; \
xx
Заключение
Как видно, для применения опции --warn-undefined-variables
в вашей текущей версии GNU Make 4.3 существует несколько ограничений. Оптимальным решением будет обновление до последней версии, что даст вам доступ ко всем улучшениям и исправлениям. В противном случае рекомендуется использовать командные аргументы при запуске или дополнительные проверки в Makefile для обработки потенциальных ошибок.
В современных условиях появления новых версий с улучшением функциональности, регулярное обновление ПО станет не только необходимостью, но и важным шагом для повышения эффективности работы с Makefile и минимизации ошибок.