这是正确的代码,但它很长
$(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时,不再出现错误。
任何人都可以解释这一点。
答案 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
重建。