私のメイクファイル:
FULL_VERSION ?= 1.2.3
MINOR_VERSION := $(Shell echo "${FULL_VERSION%.*}")
test:
echo $(MINOR_VERSION)
make test
を実行しても何も起こりません。1.2
を取得します。
私はそれをsed/grep経由で取得できることを知っていますが、よりエレガントなソリューションを探しています、bashパラメータ展開より簡単なものはないようです
最初に値をシェル変数に格納する必要があります。
_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を使用しています))。
組み込み関数でこれを行うことができます(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.}