web-dev-qa-db-ja.com

Makefileでbashパラメータ展開を使用することは可能ですか?

私のメイクファイル:

FULL_VERSION ?= 1.2.3
MINOR_VERSION := $(Shell echo "${FULL_VERSION%.*}")

test:
    echo $(MINOR_VERSION)

make testを実行しても何も起こりません。1.2を取得します。

私はそれをsed/grep経由で取得できることを知っていますが、よりエレガントなソリューションを探しています、bashパラメータ展開より簡単なものはないようです

3
csandanov

最初に値をシェル変数に格納する必要があります。

_MINOR_VERSION := $(Shell v='$(FULL_VERSION)'; echo "$${v%.*}")
_

$(FULL_VERSION)が単一引用符を含まないと仮定)

これでshではなくbashが呼び出されます。 _${var%pattern}_は標準のsh演算子です(kshから派生)。

bash固有の演算子を使用する場合は、makeではなくbashを呼び出すようにshに指示する必要があります。

_Shell = bash
_

ただし、多くのシステムにはbashがデフォルトでインストールされていないため、Makefileが移植不可能になることに注意してください(ただし、一部のシステムにはGNU makeどちらでも、すでにいくつかのGNUismsを使用しています))。

6

組み込み関数でこれを行うことができます(GNU makeを使用していると仮定):

VER=1.2.3
MINORVERTMP=$(subst ., ,${VER})
MINORVER=$(Word 1,${MINORVERTMP}).$(Word 2,${MINORVERTMP})


all:
    @echo ${MINORVER}

bmake(BSD make) を使用できる場合、より多くの(そしておそらくより単純な)可能性があります。

VER=1.2.3

all: test1 test2

test1:
    # simple regular expression-based replace like sed
    @echo $@: ${VER:C,([^\.]*)\.([^\.]*).*,\1.\2,}

test2:
    # replace all dot to spaces (S),
    # print first and second element (:[1..2])
    # with dot separator (ts.)
    @echo $@: ${VER:S,., ,g:[1..2]:ts.}
2
uzsolt