Makefileでbashパラメータ拡張を使用できますか?

Makefileでbashパラメータ拡張を使用できますか?

私のビルドファイル:

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

test:
    echo $(MINOR_VERSION)

私は走ってmake test何も得られず、それを望んでいます1.2

sed / grepを介して取得できることを知っていますが、よりエレガントなソリューションを探しており、bashパラメータ拡張よりも単純なものはありません。

答え1

まず、シェル変数に値を保存する必要があります。

MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")

$(FULL_VERSION)一重引用符が含まれていないと仮定)

これで電話をかけてもsh機能しませんbash${var%pattern}は標準sh演算子です(からksh)。

特定の代理人を使用するには、withの代わりに電話をbash知らせる必要があります。makebashsh

SHELL = bash

ただし、多くのシステムにはデフォルトでMakefileがインストールされていないため、bashMakefileを移植できなくなります(ただし、一部のシステムにはGNUがなく、makeすでにいくつかのGNUismを使用しています)。

答え2

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

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


all:
    @echo ${MINORVER}

使えるならbmake(BSD製作)より多くの(おそらくより単純な)可能性があります:

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.}

関連情報