Spec-Zone.ru › GNU Make

Разбиение строк рецепта

Один из немногих способов, которыми 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API