我的生成文件:
FULL_VERSION ?= 1.2.3
MINOR_VERSION := $(shell echo "${FULL_VERSION%.*}")
test:
echo $(MINOR_VERSION)
跑步make test
什么也得不到,我想要得到1.2
。
我知道我可以通过 sed/grep 获取它,但我正在寻找一个更优雅的解决方案,似乎没有什么比 bash 参数扩展更简单了
答案1
您需要首先将值存储在 shell 变量中:
MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")
(假设$(FULL_VERSION)
不包含单引号)
现在说来电sh
,不行bash
。${var%pattern}
是一个标准sh
运算符(来自ksh
)。
如果你想使用bash
特定的运算符,你需要告诉make
callbash
而不是sh
with
SHELL = bash
但请注意,许多系统默认情况下没有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.}