Разбиение строк рецепта
Один из немногих способов, которыми make интерпретирует рецепты, заключается в проверке наличия обратного слэша перед новой строкой. Как и в обычном синтаксисе makefile, одну логическую строку рецепта в makefile можно разбить на несколько физических строк, поместив обратный слэш перед каждой новой строкой. Такая последовательность строк рассматривается как одна строка рецепта, и для её выполнения будет вызван один экземпляр оболочки.
Однако, в отличие от того, как они обрабатываются в других частях makefile (см. Разбиение длинных строк), пары обратный слэш/новая строка не удаляются из рецепта. И обратный слэш, и символ новой строки сохраняются и передаются оболочке. Способ интерпретации пары обратный слэш/новая строка зависит от вашей оболочки. Если первый символ следующей строки после обратного слэша/новой строки является префиксом рецепта (по умолчанию табуляция; см. Специальные переменные), то этот символ (и только он) удаляется. Пробелы никогда не добавляются в рецепт.
Например, рецепт для целевой задачи all в этом makefile:
all :
@echo no\
space
@echo no\
space
@echo one \
space
@echo one\
space
состоит из четырёх отдельных команд оболочки, где вывод выглядит следующим образом:
nospace nospace one space one space
В качестве более сложного примера, этот makefile:
all : ; @echo 'hello \
world' ; echo "hello \
world"
вызовет одну оболочку с командой:
echo 'hello \
world' ; echo "hello \
world"
которая, согласно правилам цитирования оболочки, даст следующий вывод:
hello \ world hello world
Обратите внимание, как пара обратный слэш/новая строка была удалена внутри строки, заключённой в двойные кавычки ("…"), но не из строки, заключённой в одинарные кавычки ('…'). Это то, как оболочка по умолчанию (/bin/sh) обрабатывает пары обратный слэш/новая строка. Если вы укажете другую оболочку в ваших makefile, она может обработать их по-другому.
Иногда вы хотите разбить длинную строку внутри одинарных кавычек, но не хотите, чтобы обратный слэш/новая строка появлялась в цитируемом содержимом. Это часто бывает в случае передачи скриптов таким языкам, как Perl, где лишние обратные слэши внутри скрипта могут изменить его значение или даже быть синтаксической ошибкой. Один простой способ обработки этого — поместить цитируемую строку, или даже всю команду, в make переменную, а затем использовать переменную в рецепте. В этом случае будут использоваться правила цитирования новой строки для makefile, и обратный слэш/новая строка будет удалена. Если мы перепишем наш пример выше с помощью этого метода:
HELLO = 'hello \ world' all : ; @echo $(HELLO)
мы получим вывод, подобный этому:
hello world
При желании вы также можете использовать переменные, специфичные для цели (см. Значения переменных, специфичные для цели), чтобы получить более тесную связь между переменной и рецептом, который её использует.
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Splitting-Recipe-Lines.html