Как разбить строку в строках в make файле без пробелов?

В make файле экранирование новой строки с помощью \ позволяет разделить однострочное длинное строковое содержимое на несколько строк источника. Однако новая строка заменяется пробелом. Есть ли прозрачный разрыв строки в источнике, который не влияет на содержимое строки?

VAR=w\
o\
r\
d

all:
    echo $(VAR)

Требуемый вывод - это слово, но фактический вывод - "w o r d".

Ответ 1

Самое простое решение - использовать $\<newline> для разделения строки (по крайней мере, если вы используете GNU Make):

VAR = w$\
      o$\
      r$\
      d

all:
    echo $(VAR)

Вывод будет "слово" без пробелов. Это связано с тем, что GNU Make заменит backslash-newline-whitespace одним пробелом, что делает присвоение VAR эквивалентным:

VAR = w$ o$ r$ d

Из https://www.gnu.org/software/make/manual/html_node/Reference.html#Reference: "Знак доллара, за которым следует символ, отличный от знака доллара, открытых скобок или открытых скобок, обрабатывает этот единственный символ в качестве имени переменной. " Таким образом, пары $<space> являются расширениями переменной, имя которой представляет собой один символ пробела. Поскольку эта переменная не определена по умолчанию, она будет расширена до пустой строки.

Обратите внимание, что переменная VAR будет по-прежнему содержать пары $<space> пока не будет расширена. В большинстве случаев это не имеет значения, но если ваш make файл зависит от использования $(value VAR) для обработки базового (нерасширенного) значения, описанная выше методика может дать неожиданные результаты.

Что касается других идей, см. Мой ответ на аналогичный вопрос здесь: как я могу разбить определение переменной на несколько строк в Makefile без пробелов?

Более подробное описание вариантов продолжения строки можно найти в моей статье "GNU Make продолжений строки": http://drmikehenry.com/gnu-make-line-continuations/

Ответ 2

Это было просто спрошено вчера: Как я могу разбить определение переменной на несколько строк в Makefile без пробелов?

Короткий ответ - нет, нет способа сделать это. Это поведение требуется стандартом POSIX для make.

Все, что вы можете сделать, это попытаться выполнить постобработку строки, чтобы удалить пробелы с помощью $(subst ...) или аналогичного.