我的makefile包含以下代码:
.PHONY: $(PROJECTDIR)/projectroot
$(PROJECTDIR)/projectroot:
if [ -f $(@)/etc/release ]; then \
#$(RELEASE_VERSION) will have value something like 00.01.02.03
IFS=. read major minor micro build <<<"${RELEASE_VERSION}" \
echo major=${major} > $(@)/etc/release \
echo major=${minor} >> $(@)/etc/release; \
echo major=${micro} >> $(@)/etc/release; \
echo major=${build} >> $(@)/etc/release; \
fi
我期待$(@)/ etc / release获得如下内容:
major=00
minor=01
micro=02
build=03
我需要替换IFS =。在gnu make中有一些相同的命令,你能帮帮我一下吗?感谢。
答案 0 :(得分:2)
问题在于您将值读入名为major
,minor
等的shell变量中,但随后您将使用相同的名称打印Make变量。 shell无法设置Make变量。
要修复现有代码,您需要将$
个字符重复为$$
,以便向shell输出$
,这将解释它们(您也说“主要” “每一次,都缺少一些分号”:
IFS=. read major minor micro build <<<"${RELEASE_VERSION}" ; \
echo major=$${major} > $(@)/etc/release ;\
echo minor=$${minor} >> $(@)/etc/release; \
echo micro=$${micro} >> $(@)/etc/release; \
echo build=$${build} >> $(@)/etc/release; \
但要在内部进行,您可以使用subst
and word
函数:
REL_WORDS := $(subst ., ,${RELEASE_VERSION})
...
echo major=$(word 1,${REL_WORDS}) > $(@)/etc/release ;\
echo minor=$(word 2,${REL_WORDS}) >> $(@)/etc/release ;\
echo micro=$(word 3,${REL_WORDS}) >> $(@)/etc/release ;\
echo build=$(word 4,${REL_WORDS}) >> $(@)/etc/release ;\
答案 1 :(得分:1)
.PHONY: $(PROJECTDIR)/projectroot
$(PROJECTDIR)/projectroot: $(PROJECTDIR)/projectroot/etc/release
$(PROJECTDIR)/projectroot/etc/release:
echo "${RELEASE_VERSION}" | \
sed 's/^/major=/; s/\./\nminor=/; s/\./\nmicro=/; s/\./\nbuild=/' >$@
将依赖项添加到发布文件中。