如何从 makefile 目标中大写 '$*' 值?
How to uppercase '$*' value from makefile target?
我有一堆目标,每个都有不同的shell如下:
BASH_VERSION := 4.4
FISH_VERSION := 3.0.0
…
ZSH_VERSION := 5.4.2-r1
.PHONY: dev-pure-on-bash
dev-pure-on-bash:
$(MAKE) dev-pure-on TARGET=bash VERSION="${BASH_VERSION}" ARGS="VERSION=${BASH_VERSION}"
.PHONY: dev-pure-on-elvish
dev-pure-on-elvish:
$(MAKE) dev-pure-on TARGET=elvish VERSION="${ELVISH_VERSION}" ARGS="VERSION=${ELVISH_VERSION}"
.PHONY: dev-pure-on-fish
dev-pure-on-fish:
$(MAKE) dev-pure-on TARGET=fish VERSION="${FISH_VERSION}" ARGS="VERSION=${FISH_VERSION}"
…
.PHONY: dev-pure-on-xonsh
dev-pure-on-xonsh:
$(MAKE) dev-pure-on TARGET=xonsh VERSION="${XONSH_VERSION}" ARGS="VERSION=${XONSH_VERSION}"
.PHONY: dev-pure-on-zsh
dev-pure-on-zsh:
$(MAKE) dev-pure-on TARGET=zsh VERSION="${ZSH_VERSION}" ARGS="VERSION=${ZSH_VERSION}"
.PHONY: dev-pure-on
dev-pure-on:
docker run \
--name run-pure-on-${TARGET} \
--rm \
--interactive \
--tty \
--volume=$$PWD:/home/pure/.pure/ \
pure-on-${TARGET}-${VERSION}
尝试
我尝试使用 pattern rule 但没有成功:
dev-pure-on-%:
$(MAKE) dev-pure-on TARGET=$* VERSION="${$*_VERSION}" ARGS="VERSION=${$*_VERSION}"
但是我需要 ${$*_VERSION}
中的 $*
是大写的
问题
如何将里面$*
的值大写并在另一个变量中使用?
请给 投上一票,这让我得以全面实施。
在我第一次尝试使用 tr
时,我错误地将代码放在目标主体中而不是目标之前(如 make
代码)。
解决方案
BASH_VERSION := 4.4
ZSH_VERSION := 5.4.2-r1
shell = $*
shell_name = $(shell echo '$*' | tr '[:lower:]' '[:upper:]')
shell_version = ${${shell_name}_VERSION}
.PHONY: dev-pure-on-%
dev-pure-on-%:
@echo ${shell} ${shell_version}
docker run \
--name run-pure-on-${shell} \
--rm \
--interactive \
--tty \
--volume=$$PWD:/home/pure/.pure/ \
pure-on-${shell}-${shell_version}
shell
不是必需的,但比 $*
更有意义
shell_name
是大写shell名字
shell_version
扩展 shell_name
然后扩展结果变量(例如 ZSH_VERSION
、BASH_VERSION
等)
用法
make dev-pure-on-bash
make dev-pure-on-zsh
正如 Matt 所建议的,你为什么不使用类似的东西:
UC = $(shell echo '$*' | tr '[:lower:]' '[:upper:]')
然后使用 $(UC)
代替 $*
。或者,如果您想更通用地执行此操作:
UC = $(shell echo '' | tr '[:lower:]' '[:upper:]')
然后使用 $(call UC,$*)
(或其他任何东西而不是 $*
)。
使用递归尝试使用特殊的 shell 设施似乎只是将字符串大写的开销很大。
我有一堆目标,每个都有不同的shell如下:
BASH_VERSION := 4.4
FISH_VERSION := 3.0.0
…
ZSH_VERSION := 5.4.2-r1
.PHONY: dev-pure-on-bash
dev-pure-on-bash:
$(MAKE) dev-pure-on TARGET=bash VERSION="${BASH_VERSION}" ARGS="VERSION=${BASH_VERSION}"
.PHONY: dev-pure-on-elvish
dev-pure-on-elvish:
$(MAKE) dev-pure-on TARGET=elvish VERSION="${ELVISH_VERSION}" ARGS="VERSION=${ELVISH_VERSION}"
.PHONY: dev-pure-on-fish
dev-pure-on-fish:
$(MAKE) dev-pure-on TARGET=fish VERSION="${FISH_VERSION}" ARGS="VERSION=${FISH_VERSION}"
…
.PHONY: dev-pure-on-xonsh
dev-pure-on-xonsh:
$(MAKE) dev-pure-on TARGET=xonsh VERSION="${XONSH_VERSION}" ARGS="VERSION=${XONSH_VERSION}"
.PHONY: dev-pure-on-zsh
dev-pure-on-zsh:
$(MAKE) dev-pure-on TARGET=zsh VERSION="${ZSH_VERSION}" ARGS="VERSION=${ZSH_VERSION}"
.PHONY: dev-pure-on
dev-pure-on:
docker run \
--name run-pure-on-${TARGET} \
--rm \
--interactive \
--tty \
--volume=$$PWD:/home/pure/.pure/ \
pure-on-${TARGET}-${VERSION}
尝试
我尝试使用 pattern rule 但没有成功:
dev-pure-on-%:
$(MAKE) dev-pure-on TARGET=$* VERSION="${$*_VERSION}" ARGS="VERSION=${$*_VERSION}"
但是我需要 ${$*_VERSION}
中的 $*
是大写的
问题
如何将里面$*
的值大写并在另一个变量中使用?
请给
在我第一次尝试使用 tr
时,我错误地将代码放在目标主体中而不是目标之前(如 make
代码)。
解决方案
BASH_VERSION := 4.4
ZSH_VERSION := 5.4.2-r1
shell = $*
shell_name = $(shell echo '$*' | tr '[:lower:]' '[:upper:]')
shell_version = ${${shell_name}_VERSION}
.PHONY: dev-pure-on-%
dev-pure-on-%:
@echo ${shell} ${shell_version}
docker run \
--name run-pure-on-${shell} \
--rm \
--interactive \
--tty \
--volume=$$PWD:/home/pure/.pure/ \
pure-on-${shell}-${shell_version}
shell
不是必需的,但比$*
更有意义
shell_name
是大写shell名字shell_version
扩展shell_name
然后扩展结果变量(例如ZSH_VERSION
、BASH_VERSION
等)
用法
make dev-pure-on-bash
make dev-pure-on-zsh
正如 Matt 所建议的,你为什么不使用类似的东西:
UC = $(shell echo '$*' | tr '[:lower:]' '[:upper:]')
然后使用 $(UC)
代替 $*
。或者,如果您想更通用地执行此操作:
UC = $(shell echo '' | tr '[:lower:]' '[:upper:]')
然后使用 $(call UC,$*)
(或其他任何东西而不是 $*
)。
使用递归尝试使用特殊的 shell 设施似乎只是将字符串大写的开销很大。