Как я могу использовать синтаксис Bash в целях Makefile? - PullRequest
180 голосов
/ 26 февраля 2009

Я часто нахожу Bash синтаксис очень полезным, например процесс подстановки как в diff <(sort file1) <(sort file2).

Можно ли использовать такие команды Bash в Makefile? Я думаю о чем-то вроде этого:

file-differences:
    diff <(sort file1) <(sort file2) > $@

В моем GNU Make 3.80 это выдаст ошибку, поскольку для выполнения команд используется shell вместо bash.

Ответы [ 5 ]

330 голосов
/ 26 февраля 2009

Из документации GNU Make,

5.3.1 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

Итак, поместите SHELL := /bin/bash в начало вашего make-файла, и вы должны быть готовы.

Кстати: вы также можете сделать это для одной цели, по крайней мере, для GNU Make. Каждая цель может иметь свои собственные назначения переменных, например:

all: a b

a:
    @echo "a is $$0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo "b is $$0"

Это напечатает:

a is /bin/sh
b is /bin/bash

См. «Значения переменных для конкретной цели» в документации для получения более подробной информации. Эта строка может идти в любом месте Makefile, она не должна быть непосредственно перед целью.

14 голосов
/ 26 февраля 2009

Вы можете позвонить bash напрямую, используйте флаг -c:

bash -c "diff <(sort file1) <(sort file2) > $@"

Конечно, вы не сможете перенаправить на переменную $ @, но когда я попытался это сделать, я получил -bash: $@: ambiguous redirect как сообщение об ошибке, так что вы, возможно, захотите разобраться в этом, прежде чем переходить к это (хотя я использую bash 3.2. что-то, так что, возможно, ваш работает по-другому).

4 голосов
/ 19 ноября 2009

Если важна переносимость, вы можете не захотеть зависеть от конкретной оболочки в вашем Makefile. Не во всех средах есть bash.

4 голосов
/ 26 февраля 2009

Вы можете вызывать bash непосредственно в вашем Makefile вместо использования оболочки по умолчанию:

bash -c "ls -al"

вместо:

ls -al
2 голосов
/ 14 февраля 2017

Есть способ сделать это без явного задания переменной SHELL, указывающей на bash. Это может быть полезно, если у вас много make-файлов, поскольку SHELL не наследуется последующими make-файлами и не берется из среды. Вы также должны быть уверены, что любой, кто компилирует ваш код, настраивает свою систему таким образом.

Если вы запустите sudo dpkg-reconfigure dash и ответите «нет» на приглашение, ваша система не будет использовать тире в качестве оболочки по умолчанию. Затем он укажет на bash (по крайней мере, в Ubuntu). Обратите внимание, что использование dash в качестве системной оболочки немного более эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...