Проблема Makefile с условным обозначением, используемым в части правила define, используемой в командах
-
04-07-2019 - |
Вопрос
У меня есть раздел makefile, который имеет такую структуру:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
Я здесь сильно упрощаю, все echo на самом деле являются нетривиальными блоками команд, и там больше условностей, но это отражает суть моей проблемы.
По техническим причинам, в которые я не хочу вдаваться прямо сейчас, мне нужно избавиться от этого вложенного файла, но поскольку echo представляют собой нетривиальные объемы кода, я не хочу просто копировать и вставлять тело bob вместо вложенного файла.
В идеале я хотел бы сделать что-то вроде этого
define BOB_BODY
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
К сожалению, условные обозначения, похоже, обманывают меня, они выдают "ifdef:Команда не найдена" ошибки, я пытался обойти это с помощью различных комбинаций eval и call, но, похоже, не могу найти способ заставить это работать.
Как мне заставить это работать?и правильно ли вообще это подходит к проблеме?
Решение
Способ, которым я исправил это, заключается в использовании вместо этого условных обозначений bash, что на самом деле имеет определенный смысл, поскольку мы играем с командами, а не устанавливаем правила.
Таким образом, мое идеальное решение сверху становится чем-то вроде
define BOB_BODY
@if [[ -n "$(DEBUG)" ]]; then \
echo running; \
fi;
@echo chug chug chug
@if [[ -n "$(DEBUG)" ]]; then \
echo done; \
fi
endef
боб:$(BOB_BODY)
бобит:@echo "до"
$(BOB_BODY)
@echo "после"
Другие советы
Вы можете просто изменить порядок ifdef/define:
ifdef DEBUG
define BOB_BODY
@echo running
@echo chug chug chug
@echo done
endef
else
define BOB_BODY
@echo chug chug chug
endef
endif
Обновить
define CHUG
@echo chug chug chug
endef
ifdef DEBUG
define BOB_BODY
@echo running
$(CHUG)
@echo done
endef
else
define BOB_BODY
$(CHUG)
endef
endif