Подстановочная переменная make-файла не затронута?
Я хочу выполнить подстановку строк в моем Makefile. Я легко могу сделать это с помощью строкового литерала, например, так:
foo:
echo $(subst /,-,"hello/world")
Что дает ожидаемое:
hello-world
Но когда я переключаюсь на использование переменной, я не могу получить замену:
foo:
x="hello/world" ; \
echo $(subst /,-,$$x)
Вместо того, чтобы заменить косую черту штрихом, я все еще печатаю оригинальную строку. Может кто-нибудь объяснить, что здесь происходит? Должна ли переменная быть явно преобразована в строковый литерал или что-то еще?
ОБНОВИТЬ:
Исправление основано на ответе MadScientist - это позволит мне ссылаться на измененную строку как на переменную.
foo:
x="hello/world" ; \
y=`echo $$x | tr / -` ; \
echo $$y
Но вместо echo $$y
это может быть что-то более полезное.
2 ответа
Вы не можете объединить функции make с переменными оболочки... все функции make сначала раскрываются, затем полученный скрипт передается в оболочку для запуска. Когда оболочка получает скрипт, в нем больше нет функций make (и если бы он был, оболочка не знала бы, что с ними делать!)
Ваш саб работает на литеральной строке $x
, который не имеет /
так что нечего заменить и в результате $x
, который оболочка расширяется до строки hello/world
,
Если вам нужно работать со значением переменной оболочки, вы должны использовать такие команды оболочки, как sed
или же tr
, не делают это subst
функция:
foo:
x="hello/world" ; \
echo $$x | tr / -
Вы могли бы определить
x
как
make
Переменная:
Makefile:
x = foo bar baz
t:
@echo $(subst bar,qux,$(x))
Выход :
make
foo qux baz
Версия :
make --version
GNU Make 3.81