Как прописать в верхнем регистре значение $ * из цели makefile? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть куча целей, каждая для своей оболочки:

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}

Попытка

Я попытался использовать шаблонное правило , но безуспешно:

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

Однако мне нужно, чтобы $* в ${$*_VERSION} было прописным

Вопрос

Как прописать значение $* в верхнем регистре и использовать егов другой переменной?

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Как предложил Мэтт, почему бы вам не использовать что-то вроде:

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

затем используйте $(UC) вместо $*. Или, если вы хотите сделать это более обобщенно:

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

, затем используйте $(call UC,$*) (или что-то еще вместо $*).

Использование рекурсии при попытке использовать специальные средства оболочки кажется слишком трудоемким только для прописных букв строки.

0 голосов
/ 28 марта 2019

Пожалуйста, upvote @ ответ MadScientist , который привел меня к полной реализации.


В моей первой попытке использовать 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_VERSION, BASH_VERSION и т. Д.)

Использование

make dev-pure-on-bash
make dev-pure-on-zsh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...