О, я вижу проблему. Ваш первый пример был слишком урезанным: вы пропустили .PHONY
, что и является причиной проблемы.
Проблема root в том, что вы присваиваете свои переменные назначения символам TAB. Таблицы являются специальными для создания и должны только использоваться для отступа строк рецепта, а не назначений make-файлов.
Имея это:
.PHONY: default clean
ifeq "$Z" "1"
CXXFLAGS += -std=c++17
endif
где CXXFLAGS
присвоение имеет отступ с табуляции, вы фактически помещаете присвоение переменной в рецепт для цели .PHONY
, как если бы вы написали это:
.PHONY: default clean
CXXFLAGS += -std=c++17
Помните, что пустые строки, строки комментариев и условные операторы типа ifeq
не останавливают рецепт. Только строка без рецепта останавливает рецепт.
Хотя .PHONY
является псевдо-целью и ее рецепт никогда не запускается, он все же является целью, и вы все равно можете создать рецепт для него.
Измените все назначения переменных make-файла, чтобы они делались с пробелами, а не с символами табуляции, и у вас не возникнет проблем.