我有一段具有这种结构的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的主体submake的地方。
理想情况下,我想做的就是这样的事情
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:Command not found”错误,我尝试用eval和call的各种组合解决这个问题,但似乎无法找到一种方法来实现它工作
如何使这项工作?甚至是解决问题的正确方法?
答案 0 :(得分: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"
答案 1 :(得分: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