1

以下のコードを含む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 の同等のコマンドを使用して、これを手伝ってもらえますか? ありがとう。

4

2 に答える 2

2

major問題は、値をなどと呼ばれるシェル変数に読み込んでいるのに、minorMake 変数を同じ名前で出力していることです。シェルは Make 変数を設定できません。

$既存のコードを修正するには、文字を繰り返す必要がある$$ため、Make$はそれらを解釈するシェルに a を出力します (また、毎回「メジャー」と言っており、セミコロンがいくつかありません)。

     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しかし、make 内でそれを行うには、 andword関数を使用できます。

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 ;\
于 2013-11-12T00:09:21.850 に答える