如何打破GNU Make shell函数调用多行

时间:2018-01-16 15:15:55

标签: makefile

这是正确的代码,但它很长

$(shell if [ ! -f .oldmodel ] || [ "$(MODEL)" != `cat .oldmodel` ] ; then echo $(MODEL) > .oldmodel ; fi )

我试过

$(shell if [ ! -f .oldmodel ] || [ "$(MODEL)" != `cat .oldmodel` ] ; \
    then echo $(MODEL) > .oldmodel ; fi )

但是有一个错误

  

common.mak:21:***缺少分隔符。停止。

奇怪的是,生成了.oldmodel,它的内容是正确的,下次调用make时,不再出现错误。

任何人都可以解释这一点。

1 个答案:

答案 0 :(得分:0)

看起来你正试图以错误的方式实现某些目标。请考虑以下解决方案:

ifeq ($(MODEL),)
    MODEL := $(shell cat .oldmodel 2>/dev/null)
endif

stuff_to_do: \.oldmodel
    mkdir -p $(MODEL)

\.oldmodel: $(if $(shell echo '$(MODEL)' | cmp $@ 2>/dev/null), phony,)
    @if [ -z "$(MODEL)" ]; then echo "error: MODEL is not set" && exit 1; fi
    echo '$(MODEL)' > $@

clean::
    rm -rf $(MODEL)
    rm -f .oldmodel

stuff_to_do是您使用$(MODEL)变量的规则。 请注意,.oldmodel规则的先决条件是phony或为空,具体取决于.oldmodel文件内容和$(MODEL)的相等性。此phony被视为一些不存在的文件/规则,因此当phony存在时,会导致.oldmodel重建。