Это ожидаемое поведение.
Условные заявления
Все экземпляры условного синтаксиса анализируются сразу, полностью; сюда входят формы ifdef, ifeq, ifndef и ifneq. Конечно, это означает, что автоматические переменные нельзя использовать в условных выражениях, поскольку автоматические переменные не устанавливаются до тех пор, пока не будет вызван командный сценарий для этого правила . Если вам нужно использовать автоматические переменные в условных выражениях, вы должны использовать условный синтаксис оболочки в собственном командном сценарии для этих тестов, а не создавать условные выражения.
$(*D)
- автоматическая переменная.
Вместо этого рассмотрите возможность:
.c.o .cpp.o .cc.o:
$(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@
Идея состоит в том, чтобы использовать $(subst)
в некотором тестировании на равенство, заменив mySpecialDirectory
пустой строкой. Затем, если расширение $(*D)
равно mySpecialDirectory
, оно полностью заменяется пустой строкой, а остальная часть $(if)
оценивается согласно:
$(if condition,then-part[,else-part])
Функция if обеспечивает поддержку условного расширения в функциональном контексте (в отличие от GNU делает условные выражения make-файла, такие как ifeq (см. Синтаксис условных выражений).
Первый аргумент, условие, сначала удаляет все предшествующие и конечные пробелы, а затем расширяется. Если он расширяется до любой непустой строки, то условие считается истинным. Если оно расширяется до пустой строки, условие считается ложным.
Обратите внимание на переворот в этом хаке между then-part
и else-part
.
Надеюсь, это поможет!