【问题标题】:How to uppercase '$*' value from makefile target?如何将makefile目标中的“$ *”值大写?
【发布时间】:2019-03-28 17:34:22
【问题描述】:

我有一堆目标,每个目标对应一个不同的 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} 中的 $* 大写

问题

如何将里面$*的值大写并用在另一个变量中?

【问题讨论】:

标签: makefile pattern-matching uppercase variable-names


【解决方案1】:

正如马特建议的那样,你为什么不使用类似的东西:

UC = $(shell echo '$*' | tr '[:lower:]' '[:upper:]')

然后使用$(UC) 代替$*。或者,如果您想更通用地这样做:

UC = $(shell echo '$1' | tr '[:lower:]' '[:upper:]')

然后使用$(call UC,$*)(或其他任何东西,而不是$*)。

使用递归来尝试使用特殊的 shell 工具似乎只是将字符串大写的开销很大。

【讨论】:

  • 谢谢,确实更好,我错误地将它放在目标主体而不是目标之前。我会相应地更新我的答案
【解决方案2】:

请为 @MadScientist's answer 投票,这将引导我完成我的全面实施。


在我第一次尝试使用 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_version 展开 shell_name 然后展开结果变量(例如 ZSH_VERSIONBASH_VERSION 等)

用法

make dev-pure-on-bash
make dev-pure-on-zsh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2017-01-27
    • 2021-06-02
    • 2016-06-23
    相关资源
    最近更新 更多