makefile - 如何将makefile目标中的 '$*'值大写?

标签 makefile pattern-matching uppercase variable-names

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

问题

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

最佳答案

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

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

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

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

然后使用 $(call UC,$*)(或其他任何东西来代替 $*)。

使用递归来尝试使用特殊的 shell 工具似乎只是为了大写字符串而产生的大量开销。

关于makefile - 如何将makefile目标中的 '$*'值大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403740/

相关文章:

go - 生成后的模板标识

pattern-matching - 模式匹配 OCaml 中的变量?

MySQL:更改复合名称的大小写

makefile - CMake:指定构建工具链

编译 PHP 扩展

haskell - 我正在尝试重新定义 haskell 中的产品定义。我收到错误消息 "Non-exhaustive patterns in function"

c++ - 是否有可以在 Win32 和 MacOSX 系统上使用的跨平台 unicode 字符串类?

JavaScript 将小写字母替换为大写字母

c - 如何更改 makefile 以避免对数学库中函数的 undefined reference ?

pattern-matching - 了解 Elixir 函数参数中的模式匹配