У вас много вопросов здесь.Наиболее фундаментальным является то, что если вы хотите использовать переменные оболочки, вы должны экранировать знак доллара, чтобы make не интерпретировал его.И вы можете использовать только подстановочные переменные оболочки для переменных оболочки, в то время как $@
является переменной make, поэтому вам необходимо:
@foo='$@' ; echo $${foo//$(dist_directory)/}
Более тонкий вариант: make всегда использует /bin/sh
(стандарт POSIXshell), когда он вызывает рецепты, а приведенный выше синтаксис специфичен для bash.Один из способов обойти это - явно установить SHELL := /bin/bash
в вашем make-файле, чтобы заставить make использовать bash.К счастью, в этом нет необходимости, потому что POSIX sh также может сделать это, как упоминал Reda в другом ответе:
@foo='$@' ; echo $${@##*/}
Но даже более того, вам не нужно любой этого, потому что makeустанавливает автоматическую переменную $*
для части цели, которая соответствует стволу (%
):
@echo $*.html
Он также устанавливает $(@F)
для части имени файлапеременная $@
:
@echo $(@F)
ETA
Если вы хотите сделать что-то очень похожее на расширение вашей оболочки с помощью GNU, то вы можете использовать:
@echo $(patsubst $(dist_directory)/%,%,$@)