Makefile问题:在规则的命令部分中使用define中使用的条件语句。

4

我有一个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的各种组合来解决此问题,但似乎无法找到解决方法。

我该如何让它工作?这是解决问题的正确方法吗?

2个回答

2
我解决这个问题的方法是使用bash条件语句,这其实很有道理,因为我们在处理命令而不是make规则。

So my ideal solution from above becomes something like


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 "之前" $(BOB_BODY) @echo "之后"


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

那种方法的问题在于它会复制“chug chug chug”部分,而在原始的makefile中,这部分有30行的内容。 - Gordon Wrigley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接