小编典典

如何在 Makefile 目标中使用 Bash 语法?

all

我经常发现Bash语法非常有用,例如diff <(sort file1) <(sort file2).

是否可以在 Makefile 中使用此类 Bash 命令?我在想这样的事情:

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

在我的 GNU Make 3.80 中,这将给出一个错误,因为它使用shell而不是bash执行命令。


阅读 63

收藏
2022-05-23

共1个答案

小编典典

从 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你的makefile的顶部,你应该很高兴。

顺便说一句:您也可以为一个目标执行此操作,至少对于 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 中的任何位置,它不必紧挨在目标之前。

2022-05-23