Проблема Makefile с условным обозначением, используемым в части правила define, используемой в командах

StackOverflow https://stackoverflow.com/questions/228567

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top