使用分隔符在gnu make中拆分字符串

时间:2013-11-11 23:37:06

标签: 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_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中有一些相同的命令,你能帮帮我一下吗?感谢。

2 个答案:

答案 0 :(得分:2)

问题在于您将值读入名为majorminor等的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=/' >$@

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

相关问题