Spec-Zone.ru › GNU Make

Использование одного оболочки

Иногда вам может потребоваться, чтобы все строки рецепта были переданы в одно вызов оболочки. В целом, это полезно в двух ситуациях: во-первых, это может повысить производительность в файлах make, где рецепты состоят из многих командных строк, избегая лишних процессов. Во-вторых, вы можете захотеть включить новые строки в команду вашего рецепта (например, если вы используете очень другой интерпретатор как ваш SHELL). Если специальная цель .ONESHELL появляется где-либо в файле make, то все строки рецепта для каждой цели будут переданы в одно вызов оболочки. Новые строки между строками рецепта будут сохранены. Например:

.ONESHELL:
foo : bar/lose
        cd $(<D)
        gobble $(<F) > ../$@

теперь будет работать так, как ожидается, даже если команды находятся на разных строках рецепта.

Если .ONESHELL указано, то только первая строка рецепта будет проверяться на специальные префиксные символы (‘@’, ‘-’, и ‘+’). Последующие строки будут включать специальные символы в строку рецепта, когда SHELL вызывается. Если вы хотите, чтобы ваш рецепт начинался с одного из этих специальных символов, вам нужно будет позаботиться о том, чтобы они не были первыми символами в первой строке, возможно, добавив комментарий или что-то подобное. Например, это будет синтаксическая ошибка в Perl, потому что первый ‘@’ удаляется make:

.ONESHELL:
SHELL = /usr/bin/perl
.SHELLFLAGS = -e
show :
        @f = qw(a b c);
        print "@f\n";

Однако, любой из этих альтернатив будет работать правильно:

.ONESHELL:
SHELL = /usr/bin/perl
.SHELLFLAGS = -e
show :
        # Make sure "@" is not the first character on the first line
        @f = qw(a b c);
        print "@f\n";

или

.ONESHELL:
SHELL = /usr/bin/perl
.SHELLFLAGS = -e
show :
        my @f = qw(a b c);
        print "@f\n";

В качестве специальной функции, если SHELL определяется как оболочка в стиле POSIX, специальные префиксные символы в «внутренних» строках рецепта будут удалены перед обработкой рецепта. Эта функция предназначена для того, чтобы позволить существующим файлам make добавить специальную цель .ONESHELL и по-прежнему работать должным образом без значительных изменений. Поскольку специальные префиксные символы не являются допустимыми в начале строки в скрипте оболочки POSIX, это не приводит к потере функциональности. Например, это работает как ожидается:

.ONESHELL:
foo : bar/lose
        @cd $(@D)
        @gobble $(@F) > ../$@

Даже с этой специальной функцией, однако, файлы make с .ONESHELL будут вести себя по-разному, что может быть заметно. Например, обычно, если любая строка в рецепте завершается неудачей, это приводит к неудаче правила, и больше строк рецепта не обрабатываются. При .ONESHELL неудача любой, кроме последней строки рецепта, не будет замечена make. Вы можете изменить .SHELLFLAGS для добавления параметра -e в оболочку, что приведет к неудаче любой команды в командной строке, но это само по себе может привести к тому, что ваш рецепт будет вести себя по-другому. В конечном итоге вам может потребоваться укрепить ваши строки рецепта, чтобы они работали с .ONESHELL.

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/One-Shell.html

Spec-Zone.ru

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