Как разбить строку на строки в Makefile без пробелов?

в файле makefile, избегая новой строки с позволяет разделить однострочное длинное строковое содержимое на несколько исходных строк. Однако новая строка заменяется пробелом. Есть прозрачные строки в источнике, который не влияет на содержимое строки?

VAR=w
o
r
d

all:
    echo $(VAR)

желаемый выход - "слово", но фактический выход - "w o r d".

2 ответов


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

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

all:
    echo $(VAR)

вывод будет "word" без пробелов. Это потому что GNU Make заменит обратную косую черту-новую строку-пробелы одним пробел, выполнение задания на VAR равной:

VAR = w$ o$ r$ d

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

обратите внимание, что переменная VAR все еще будет содержать $<space> пары, пока он не будет расширен. Большую часть времени, это не имеет значения, но если ваш Makefile зависит от использования $(value VAR) для обработки базовых (нерасширенная) стоимость, данная методика может дать удивительные результаты.

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

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


об этом только вчера спросили:Как разбить определение переменной на несколько строк в файле Makefile без пробелов?

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

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