这是正确的代码,但它很长
$(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生成了,它的内容是正确的,下次调用时,不再有错误。
谁能解释一下。
看起来你试图以错误的方式实现一些目标。请考虑以下解决方案:
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
或空,具体取决于文件内容和$(MODEL)
.oldmodel
相等性。此phony
被视为一些不存在的文件/规则,因此当phony
存在时,它会导致重建.oldmodel
。