GNU makefile как и когда указывать строки

Как и когда я цитирую строку в файле make? Какая практика?

Можно ли процитировать:

$(warning  $(shell ls -ld "$(CURDIR)" ) )

Я знаком с Bash, где вы обычно указываете переменные, чтобы разрешить встроенные пространства. Вы делаете это в make файле?

Как я должен выполнять инструкции присваивания со строкой?

vara := "$(CURDIR)"

varb := $(CURDIR)

varc := /home/me/source

vard := "/home/me/source"

Как насчет пробела после равного?

Ответы

Ответ 1

Вы никогда не должны цитировать что-либо из-за make. Make не понимает и не анализирует символы с одной или двумя кавычками. Каждый цитирующий символ, который вы пишете в make файле, будет храниться как литеральная цитата и передается как-есть в команды, вызывающие вызовы.

Итак, если оболочка ожидает и может интерпретировать строку с кавычками, вы должны использовать кавычки. Если оболочка не ожидает или неправильно интерпретирует строку с кавычками, вы не должны использовать кавычки.

В ваших примерах, являются ли кавычки приемлемыми или нет, зависит от использования этих переменных. Как и выше, make не будет делать ничего особенного с кавычками, а это означает, что vard (например) содержит литеральную строку "/home/me/source" (включая кавычки).

Если вы используете это значение таким образом, чтобы оболочка обрабатывала кавычки для вас, то это прекрасно:

all: ; echo $(vard)

напечатает /home/me/source (без кавычек), потому что оболочка интерпретирует их. Но если вы используете переменную в контексте make, например, в качестве цели или предпосылки:

all: $(vard)
$(vard): ; echo [email protected]

то это неверно, потому что целью и предпосылкой являются литеральные строки "/home/me/source" (включая кавычки).

В целом лучше не использовать кавычки вокруг имен файлов в переменных, а вместо этого добавлять кавычки в рецепт вокруг переменной make. Конечно, если переменная содержит целую оболочку script, а не только имя файла, то вы должны добавить соответствующее цитирование в script.