Makefile: shell 命令执行

Makefile: shell command execution

我有以下简单的语句,在 shell 中没有问题:

if [ -z "$(command -v brew)" ]; then
 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi

简而言之:如果找不到该程序,请安装它。

问题是我无法将此构造转换为 Makefile。到目前为止,我明白构造本身应该是这样的:

if [ -z "$(shell command -v brew)" ]; then \
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" \
fi

但是如何正确转换/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"字符串我不是很明白。在这件事上你能给点提示吗?

你需要把它分成几个项目。

首先,检查 brew:

BREW := $(shell command -v brew)

然后检查是否设置了变量。如果未设置,则 运行 安装程序:

ifeq ($(BREW),)
    $(shell bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)")
    BREW := $(shell command -v brew)
endif

它在一个完整的单个 shell 命令中是可行的,但这会将它分成几个 shell 部分。

使用 := 意味着在解析行时进行评估,这就是您检查和覆盖值的方式。

在一个小的、独立的 makefile 中:

BREW := $(shell command -v brew)

ifeq ($(BREW),)
$(shell bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)")
BREW := $(shell command -v brew)
endif

all:
    echo $(BREW)

美元符号需要加倍,因此 make 不会解释它们。 bash 命令末尾还需要有一个分号,以将其与 fi 分开,因为反斜杠会占用通常的换行命令分隔符。

some_target:
        if [ -z "$$(command -v brew)" ]; then \
          /bin/bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; \
        fi