私のビルドファイル:
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
知らせる必要があります。make
bash
sh
SHELL = bash
ただし、多くのシステムにはデフォルトでMakefileがインストールされていないため、bash
Makefileを移植できなくなります(ただし、一部のシステムには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.}