如何从makefile目标大写'$ *'值?

问题描述 投票:0回答:2

我有一堆目标,每个目标都有不同的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}

Attempt

我试图使用pattern rule但没有成功:

dev-pure-on-%:
    $(MAKE) dev-pure-on TARGET=$* VERSION="${$*_VERSION}" ARGS="VERSION=${$*_VERSION}"

但是我需要$*中的${$*_VERSION}为大写

Question

如何在内部使用$*的值大写并在另一个变量中使用它?

makefile pattern-matching uppercase variable-names
2个回答
2
投票

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

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

然后使用$(UC)代替$*。或者如果你想更普遍地做到这一点:

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

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

使用递归尝试使用特殊的shell设施似乎只是为了大写字符串的大量开销。


0
投票

请upvote @MadScientist's answer引导我全面实施。


在我第一次尝试使用tr时,我错误地将代码放在目标体中而不是在目标体之前(作为make代码)。

Solution

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_VERSIONBASH_VERSION等)

Usage

make dev-pure-on-bash
make dev-pure-on-zsh
© www.soinside.com 2019 - 2024. All rights reserved.