4

我有一段具有这种结构的makefile:


bob:
ifdef DEBUG
    @echo running
endif
    @echo chug chug chug
ifdef DEBUG
    @echo done
endif    

bobit:
    @echo "before"
    @make bob
    @echo "after"

我在这里大大简化了,所有的回声实际上都是不平凡的命令块,还有更多的条件内容,但这抓住了我问题的本质。

出于技术原因,我现在不想进入,我需要摆脱那个 submake,但是因为 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 的各种组合来解决这个问题,但似乎无法找到让它工作的方法。

我该如何进行这项工作?它甚至是解决问题的正确方法吗?

4

2 回答 2

2

我解决这个问题的方法是改用 bash 条件,这实际上是有一定意义的,因为我们是在玩命令而不是制定规则。

所以我从上面的理想解决方案变成了


define BOB_BODY
    @if [[ -n "$(DEBUG)" ]]; then \
        echo running; \
    fi;
    @echo chug chug chug
    @if [[ -n "$(DEBUG)" ]]; then \
        echo done; \
    fi
endef

bob: $(BOB_BODY)

bobit: @echo "before" $(BOB_BODY) @echo "after"

于 2008-10-24T10:30:20.700 回答
0

您可以简单地更改 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
于 2011-10-05T20:49:09.797 回答