Подстановочная переменная 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   
Другие вопросы по тегам