Makefile 使用分隔符拆分gnu make中的字符串

Makefile 使用分隔符拆分gnu make中的字符串,makefile,gnu,Makefile,Gnu,我有以下代码的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_

我有以下代码的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
我需要替换IFS=。使用gnu make中的一些等效命令,您能帮我解决这个问题吗?谢谢

.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=/' >$@

将依赖项添加到发布文件。

问题在于,您正在将值读入名为
major
minor
等的shell变量中,但随后您正在打印具有相同名称的Make变量。shell无法设置Make变量

要修复现有代码,您需要将
$
字符重复为
$
,因此将输出设置为
$
到shell,shell将解释它们(您每次都说“major”,并且缺少一些分号):


这将创建
etc/release
文件,如果它不存在,这不是原始文件所做的(当然,原始文件可能没有做想要做的事情),但是
if[-f${}/etc/release]
可能起到了某种作用,尽管我不知道是什么!
.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=/' >$@
     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; \
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 ;\