Как выполнить замену строки на пути в Makefile? - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь удалить префикс пути.Вот небольшой пример, показывающий только проблему.

Makefile

dist_directory = ./dist

default: build

build: $(patsubst %.md, $(dist_directory)/%.html, $(wildcard *.md))

$(dist_directory)/%.html: %.md
    @echo start
    @echo $@
    @echo ${$@//$(dist_directory)/}
    @echo end

Создание файла: touch stuff.md

Затем сборка: make

Вывод:

start
dist/stuff.html

end

Ожидаемый вывод:

start
dist/stuff.html
/stuff.html
end

На Stack Exchange есть похожие посты.Тем не менее, они почему-то не работают для меня в Makefile.Возможно, я что-то не так делаю.

https://unix.stackexchange.com/questions/311758/remove-specific-word-in-variable

Удалить фиксированный префикс / суффикс из строки в Bash

Удалитьшаблон совпадения подстроки как в начале, так и в конце переменной

1 Ответ

0 голосов
/ 30 ноября 2018

У вас много вопросов здесь.Наиболее фундаментальным является то, что если вы хотите использовать переменные оболочки, вы должны экранировать знак доллара, чтобы 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)/%,%,$@)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...