Не знаю, почему у вас сложилось впечатление, что условные отступы не поддерживаются.Кажется, они работают нормально, когда я использую их в следующем примере:
.PHONY: all
all:
CONFIGS :=
ifeq ($(CONFIG1),1)
$(info CONFIG1 selected)
CONFIGS += config1
all: config1
config1:
@echo $@
ifeq ($(CONFIG2),1)
$(info CONFIG2 selected)
CONFIGS += config2
all: config2
config2:
@echo $@
else
$(info CONFIG2 not selected)
endif
else
$(info CONFIG1 NOT selected)
endif
all:
@echo "all: $(CONFIGS)"
ПРИМЕЧАНИЕ : TABS в моем примере, вероятно, не выживет при копировании и вставке.Поэтому вам придется повторно вводить их для рецептов.
Тестовый прогон:
$ make
CONFIG1 NOT selected
all:
$ make CONFIG1=1
CONFIG1 selected
CONFIG2 not selected
config1
all: config1
$ make CONFIG1=1 CONFIG2=1
CONFIG1 selected
CONFIG2 selected
config1
config2
all: config1 config2
Но ...
Есть один случай, когдаОтступы могут привести к проблемам.Цитируя GNU make manual :
Рецепт - это действие, которое выполняет make
.Рецепт может иметь более одной команды, либо в одной строке, либо в отдельной строке. Обратите внимание: вам нужно ставить символ табуляции в начале каждой строки рецепта!Это мрак, который ловит неосторожных.
Поскольку GNU make занимает все строки с отступом TAB после того, как правило будет частью рецепта для правила, следующее не будет выполнено для make CONFIG1=1
:
.PHONY: all
all:
CONFIGS :=
config1:
# TAB in the following line
@echo $@
# the following lines are indented with TABs
ifeq ($(CONFIG1),1)
CONFIGS += config1
test1:
@echo $@
endif
ifeq ($(CONFIG1),1)
all: config1
endif
all:
# TAB in the following line
@echo "all: $(CONFIGS)"
$ make CONFIG1=1
config1
ifeq (1,1)
/bin/sh: -c: line 0: syntax error near unexpected token `1,1'
/bin/sh: -c: line 0: `ifeq (1,1)'
make: *** [Makefile:9: config1] Error 1
Решение
- организовать make-файл, чтобы сначала иметь условные выражения, а затем правила, то есть больше нет отступов TAB после правил, кроме рецептов, или
- всегда используйтеПРОБЕЛЫ для условного, переменного назначения и строк правил.
- установите
.RECIPEPREFIX
на непробельный символ , например, >
, и используйте его для обозначения строк рецепта. 1
Если у вас нет редактора, который показывает разницу между табуляцией и пробелами, альтернатива 2, вероятно, сведет вас с ума.Я бы предложил альтернативу 1 вместо ...
Следующие работы для make CONFIG2=1
:
.PHONY: all
all:
CONFIGS :=
config2:
# TAB in the following line
@echo $@
# the following lines are indented with SPACES
ifeq ($(CONFIG2),1)
CONFIGS += config2
test2:
# 2 TABs in the following line
@echo $@
endif
ifeq ($(CONFIG2),1)
all: config2
endif
all:
# TAB in the following line
@echo "all: $(CONFIGS)"
$ make CONFIG2=1
config2
all: config2
1 Вы можете испытать искушение:установите .RECIPEPREFIX
на SPACE следующим образом:
_empty :=
_space := $(_empty) $(_empty)
.RECIPEPREFIX := $(_space)
, а затем переключите свой редактор, чтобы использовать только пробелы.Но это усугубляет ситуацию, т. Е. Теперь make
не может отличить нормальный отступ от рецепта.Если вы попробуете это с приведенным выше примером, вы заметите, что теперь он завершается неудачно для любого вызова, который включает одно из отступных правил.