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
我有以下简单的语句,在 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