Makefile: директива ifeq сравнивает специальную переменную с константой не работает - PullRequest
4 голосов
/ 02 декабря 2009

У меня небольшая проблема с моим Makefile. Я хочу, чтобы сделать, чтобы изменить команды относительно рабочего каталога. Я добавил условную директиву в правило, проверяющее каталог текущей цели ($ (* D)).

Дело в том, что make всегда переходит ко второй ветви моего теста, даже когда мой файл находится в mySpecialDirectory и echo действительно выводит "mySpecialDirectory".

.c.o .cpp.o .cc.o:
ifeq ($(*D),mySpecialDirectory)  
   @echo "I'm in mySpecialDirectory! \o/"
   $(CC) $(DEBUG_FLAGS) $(MYSPECIALFLAGS) -c $< -o $@
else  
   @echo "Failed! I'm in $(*D)"
   $(CC) $(DEBUG_FLAGS) $(NOTTHATSPECIALFLAGS) -c $< -o $@
endif

1 Ответ

7 голосов
/ 02 декабря 2009

Это ожидаемое поведение.

Условные заявления

Все экземпляры условного синтаксиса анализируются сразу, полностью; сюда входят формы 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.

Надеюсь, это поможет!

...